Specifying a new sampling distribution
Suppose we wish to use a sampling distribution that is not included in the list of standard distributions, in which an observation x[i] contributes a likelihood term L[i]. We may use the "zeros trick": a Poisson(phi) observation of zero has likelihood exp(-phi), so if our observed data is a set of 0's, and phi[i] is set to -log(L[i]), we will obtain the correct likelihood contribution. (Note that phi[i] should always be > 0 as it is a Poisson mean, and so we may need to add a suitable constant to ensure that it is positive.) This trick is illustrated by an example new-sampling in which a normal likelihood is constructed (using the zeros trick) and compared to the standard analysis.
C <- 10000 # this just has to be large enough to ensure all phi[i]'s > 0
for (i in 1:N) {
zeros[i] <- 0
phi[i] <- -log(L[i]) + C
zeros[i] ~ dpois(phi[i])
}
This trick allows arbitrary sampling distributions to be used, and is particularly suitable when, say, dealing with truncated distributions.
A new observation x.pred can be predicted by specifying it as missing in the data-file and assigning it a uniform prior, e.g.
x.pred ~ dflat() # improper uniform prior on new x
However our example shows that this method can be very inefficient and give a very high MC error.
An alternative to using 'zeros' is the "ones trick", where the data is a set of 1's assumed to be the results of Bernoulli trials with probabilities p[i]. By making each p[i] proportional to L[i] (i.e. by specifying a scaling constant large enough to ensure all p[i]'s are < 1) the required likelihood term is provided.
C <- 10000 # this just has to be large enough to ensure all p[i]'s < 1
for (i in 1:N) {
ones[i] <- 1
p[i] <- L[i] / C
ones[i] ~ dbern(p[i])
}