model {
p.mean[1:num.prey] ~ ddirch(alpha[1:num.prey]);
for(i in 1:num.prey) {
logp.mean[i] <- log(p.mean[i]);
}
# convert to CLR space to include RE
avglogp <- sum(logp.mean[1:num.prey])/num.prey;
for(i in 1:num.prey) {
mu[i] <- logp.mean[i] - avglogp;
}
ind.sig ~ dunif(0,10);
ind.invSig2 <- 1/(ind.sig*ind.sig);
# generate individual deviates from the global mean
for(i in 1:N) {
for(prey in 1:num.prey) {
p.ind[i,prey] ~ dnorm(mu[prey], ind.invSig2);
exp.p[i,prey] <- exp(p.ind[i,prey]);
}
}
# CLR math:
for(i in 1:N) {
p.tot[i] <- sum(exp.p[i,1:num.prey]);
for(prey in 1:(num.prey-1)) {
p[i,prey] <- exp.p[i,prey]/p.tot[i];
}
p[i,num.prey] <- 1-sum(p[i,1:(num.prey-1)]);
}
for(prey in 1:num.prey) {
for(i in 1:N) {
# these are weights for variances
p2[i,prey] <- p[i,prey]*p[i,prey];
}
}
# for each isotope and population, calculate the predicted mixtures
for(iso in 1:num.iso) {
resid.sigma[iso] ~ dunif(0,100);
resid2[iso] <- (resid.sigma[iso]*resid.sigma[iso]);
for(i in 1:N) {
mix.mu[iso,i] <- inprod(u[,iso],p[i,]);
mix.var[iso,i] <- inprod(sigma2[,iso],p2[i,]);
mix.totalVar[iso,i] <- mix.var[iso,i] + resid2[iso];
mix.prcsn[iso,i] <- 1/(mix.totalVar[iso,i]);
}
}
# This section does the likelihood / posterior, N data points
for(i in 1:N) {
for(iso in 1:num.iso) {
X[i,iso] ~ dnorm(mix.mu[iso, i], mix.prcsn[iso, i]);
}
}
}