• File: jaw-quadratic.bug
var
 Y[N,M], age[M], age.c[M],     # jaw bone length in mm, age, centred age
 mu[M],Omega[M,M],Sigma2[M,M], # mean, precision & covariance matrix for Y
 beta0, beta1, beta2,          # regression coefficients for location models
 beta0.uncentred,
 beta1.uncentred,
 R[M,M],                       # prior guess at magnitude of Sigma2 
 resid[N,M],resid2[N,M],RSS,   # residuals and residual sum of squares
 L1[N,M],llike[N],M,PI,deviance2;    # log-likelihood terms and deviance
model {
  for (i in 1:N) {
     Y[i,] ~ dmnorm(mu[], Omega[,]);  # The 4 measurements for each  
  }                                   # boy are multivariate normal

  for(j in 1:M) {     # location model for mean bone length at each age
     mu[j] <- beta0 + beta1 * age.c[j] + beta2 * age.c[j]^2;
     age.c[j] <- age[j] - mean(age);
  }
  beta0.uncentred <- beta0 - beta1 * mean(age) + beta2 * mean(age)^2;
  beta1.uncentred <- beta1 - 2 * beta2 * mean(age);

  beta0 ~ dnorm(0.0, 0.001); 
  beta1 ~ dnorm(0.0, 0.001); 
  beta2 ~ dnorm(0.0, 0.001); 
  Omega[,] ~ dwish(R[,], 4);	# between-child variance in length at each age	
  Sigma2[,] <- inverse(Omega[,]);

  for (i in 1:N) {
     resid[i,] <- Y[i,] - mu;         # residuals
     llike[i] <- -0.5*(M*log(2*PI) - logdet(Omega[,]))
         	      + resid[i,] %*% Omega %*% resid[i,];
  }
  RSS <- sum(resid^2);                    # Residual Sum of Squares
  deviance2 <- -2 * sum(llike[]);         # Deviance
}