I am trying to define a node sat, such that it is 0 if another node con=0 and sat comes from a normal distribution if con≠0. Does anyone has any suggestion on how to make that work? Thanks!
Here are the things I have tried (along with error message), none of which work:
What you're trying to fit is a mixture distribution I think, but it sounds a bit strange. Do you really have a mixture of integers (0) and non-integers (numbers on the real line from a normal distribution) in your observed data? If so, surely you know a-priori which observations are truly 0 and which aren't? If not, you may not want to use a normal distribution but perhaps an integer distribution such as a Poisson (in which case you would have a zero-inflated Poisson distribution, which is fairly straightforward to code).
The general way that you can code a mixture distribution when the distributional form is the same (but parameters differ) is as follows:
Thanks Matt! I responded yesterday with a detailed explanation for my choice of random variables, but for some reason I don't see that anymore :/ Anyways, I decided on using the same family of distributions after all to make things work. Thanks again!
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I am trying to define a node sat, such that it is 0 if another node con=0 and sat comes from a normal distribution if con≠0. Does anyone has any suggestion on how to make that work? Thanks!
Here are the things I have tried (along with error message), none of which work:
~~~~~~~
temp[i,1] ~ dcat(1)
temp[i,2] ~ dnorm(g[i],taus)
ind <- con[i]+1
sat[i] ~ temp[i,ind]
Error in last line near "temp"
I know for this case sat=1 when con=0, but that works too.
sat[i] ~ ifelse(con[i]==0, 0, dnorm(g[i],taus))
Incorrect number of parameters in function dnorm
Possibly because ifelse doesn't work with distributions
temp[i] ~ dnorm(g[i],taus)
sat[i] <- con[i]*temp[i]
sat[1] is a logical node and cannot be observed
sat is observed in my model and logical nodes can't be observed
What you're trying to fit is a mixture distribution I think, but it sounds a bit strange. Do you really have a mixture of integers (0) and non-integers (numbers on the real line from a normal distribution) in your observed data? If so, surely you know a-priori which observations are truly 0 and which aren't? If not, you may not want to use a normal distribution but perhaps an integer distribution such as a Poisson (in which case you would have a zero-inflated Poisson distribution, which is fairly straightforward to code).
The general way that you can code a mixture distribution when the distributional form is the same (but parameters differ) is as follows:
sat[i] ~ dnorm(mu[con[i]+1], tau[con[i]+1])
con[i] ~ dbern(prob)
This would work with any distribution, not just normal.
Or if you have a zero-inflated Poisson mixture you can use this code:
sat[i] ~ dpois(lambda[i])
lambda[i] <- mean * con[i]
con[i] ~ dbern(prob)
Note that for these types of code you will have to be careful about specifying sensible initial values for con.
Hope that helps,
Matt
Last edit: Matt Denwood 2014-06-04
Thanks Matt! I responded yesterday with a detailed explanation for my choice of random variables, but for some reason I don't see that anymore :/ Anyways, I decided on using the same family of distributions after all to make things work. Thanks again!
That happens to me to sometimes. You have to be careful to press the "post" button and not just the "preview" button.