## Choosing different distributions based on a certain condition

Help
2014-06-04
2014-06-05

2014-06-04

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
```

• Matt Denwood
2014-06-04

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