library("BRugs")
library("R2WinBUGS")
# CODE WRITTEN BY ERIC WARD, NOV. 2007
# !! make sure to download OpenBUGS, install to default c:\ directory
# data file is in current wd, named "practice.txt"
###################################
# STEP 1: SET PARAMETERS
###################################
numClones<-25; # must be at least 2
chainLength <- 5000;
burn <- 5000; # should be at least 5000
###################################
# STEP 2: SET UP MCMC PARAMETERS
###################################
dat <- read.table("practice.txt",header=FALSE);
dat[which(dat[,1] < 0),1] <- NA;
dat <- log(dat);
N <- dim(dat)[1]; # number of years
Y <- matrix(0,N,numClones);
for(i in 1:numClones) Y[,i] <- dat[,1];
###################################
# THIS SECTION WRITES THE BUGS CODE
###################################
modelString <- "
model {
# first year
for(j in 1:numClones) {
init[j] ~ dunif(0,10);
}
# parameter B
B ~ dunif(-3,3);
# Q is process error
logsigma2.Q ~ dunif(-13.81551,2);
sigma2.Q <- exp(logsigma2.Q);
sigma.Q <- sqrt(sigma2.Q);
invQ <- 1/sigma2.Q;
# process error model
for(j in 1:numClones) {
states[1,j] <- init[j];
for(i in 2:N) {
mu[i,j] <- (states[i-1,j] + B);
states[i,j] ~ dnorm(mu[i,j],invQ);
}
}
# R is observation error
logsigma2.R ~ dunif(-13.81551,2);
sigma2.R <- exp(logsigma2.R);
sigma.R <- sqrt(sigma2.R);
invR <- 1/sigma2.R;
for(j in 1:numClones) {
for(i in 1:N) {
Y[i,j] ~ dnorm(states[i,j], invR)
}
}
}
"
# Write the bugs model to a file
write(modelString,file="cloneModel.txt",append=FALSE)
data <- list("Y","numClones","N");
parameters <- c("B","sigma.Q","sigma.R")
simple <- 0;
try(simple <- bugs (data,inits=NULL,parameters,DIC=TRUE,"cloneModel.txt",n.chains=1,n.burnin=burn,
n.thin=1,n.iter=(burn+chainLength),program="openbugs",debug=TRUE),silent=FALSE)
try(attach.bugs (simple, overwrite=TRUE), silent = TRUE)
# calculate the deviance at the mean posterior
pD <- simple$pD;
Dbar <- mean(deviance);
# eval deviance at posterior means
Dhat <- (Dbar - pD)/numClones;