R2WinBUGS: Autoregressive model of order 1, AR(1)
Let us assume that y1,…,yN are observed and that a first order autoregressive model, AR(1), is entertained
yt
~ N(a+byt-1,t-2)
for t=1,…,N. Additionally, two different prior specifications will be examined:
π(a,b,t2,y0) = π(a)π(b)π(t2)π(y0)
PRIOR 1: Conditionally conjugate components
a
~ N(0,1000000)
b
~ N(0,1000000)
t2 ~ G(0.01,0.01)
y0 ~ N(0,1000000)
PRIOR 2: Stationarity restriction
a
~ N(0,1000000)
b
~ N(0,1000000)1(0<b<1)
t2 ~ G(0.01,0.01)
y0 ~ N(a/(1-b), t-2/(1-b2))
WINBUGS CODE FOR THE MODEL AND PRIOR 1
# This model is
stored in file “AR1-1.bug”
model{
# AR(1) model
mu[1] <- alpha + beta*y0
y[1] ~
dnorm(mu[1],tau2)
for(t in 2:N) {
mu[t] <- alpha
+ beta*y[t-1]
y[t] ~ dnorm(mu[t],tau2)
}
# Prior distribution
alpha
~ dnorm(0.0, 1.0E-6)
beta ~ dnorm(0.0,
1.0E-6)
tau2 ~ dgamma(0.01, 0.01)
y0 ~ dnorm(0.0,1.0E-6)
}
WINBUGS CODE FOR THE MODEL AND PRIOR 2
# This
model is stored in file “AR1-2.bug”
model{
# AR(1) model
mu[1] <- alpha + beta*y0
y[1] ~
dnorm(mu[1],tau2)
for(t in 2:N) {
mu[t] <- alpha
+ beta*y[t-1]
y[t] ~ dnorm(mu[t],tau2)
}
# Prior distribution
m <- alpha/(1-beta)
p <-
(1-beta*beta)*tau2
alpha ~ dnorm(0.0, 1.0E-6)
beta ~ dnorm(0.0, 1.0E-6)I(0.0,1.0)
tau2 ~ dgamma(0.01, 0.01)
y0 ~ dnorm(m,p)
}
Evoking WinBUGS
from R
# Loading
the R2WingBUGS library
library(R2WinBUGS)
# Simulating N=100
observations form an AR(1) process
set.seed(1245)
N
= 100
a
= 1.00
b
= 0.95
s2 = 1.00
y0 = rnorm(1,a/(1-b),sqrt(s2/(1-b^2)))
y = rep(0,N)
y[1] = rnorm(1,a+b*y0,sqrt(s2))
for (t in 2:N)
y[t] = rnorm(1,a+b*y[t-1],sqrt(s2))
ts.plot(y)
# Posterior
inference: the conditionally conjugate case
#
-----------------------------------------------------
data <- list("y","N")
inits
<- function(){
list(alpha=1.0,beta=0.95,tau2=1.0,y0=20)
}
# Running WinBUGS
AR11 =
bugs(data,inits,model.file="AR1-1.bug",
parameters=c("alpha","beta","tau2","y0"),
n.chains=1,n.iter=10000,n.burnin=5000,n.thin=1,
bugs.directory="c:/Program Files/WinBUGS14/",codaPkg=FALSE)
# See what the object
AR11 contains
AR11
# See the list of
components in AR11
names(AR11)
# Posterior summary
names = c("alpha","beta","tau2")
true = c(a,b,1/s2)
par(mfrow=c(3,3))
for (i in 1:3){
ts.plot(AR11$sims.array[,1,i],xlab="iterations",ylab="",main=names[i])
abline(h=true[i],col=2,lwd=3)
acf(AR11$sims.array[,1,i],xlab="lag",ylab="ACF",main="")
hist(AR11$sims.array[,1,i],xlab="",ylab="",main="",prob=T)
abline(v=true[i],col=2,lwd=3)
}
# Posterior
inference: the stationary case
#
----------------------------------------
data <- list("y","N")
inits
<- function(){
list(alpha=1.0,beta=0.95,tau2=1.0,y0=20)
}
AR12 =
bugs(data,inits,model.file="AR1-2.bug",
parameters=c("alpha","beta","tau2","y0"),
n.chains=1,n.iter=255000,n.burnin=5000,n.thin=50,
bugs.directory="c:/Program Files/WinBUGS14/",codaPkg=FALSE)
# Posterior summary
names = c("alpha","beta","tau2")
true = c(a,b,1/s2)
par(mfrow=c(3,3))
for (i in 1:3){
ts.plot(AR12$sims.array[,1,i],xlab="iterations",ylab="",main=names[i])
abline(h=true[i],col=2,lwd=3)
acf(AR12$sims.array[,1,i],xlab="lag",ylab="ACF",main="")
hist(AR12 $sims.array[,1,i],xlab="",ylab="",main="",prob=T)
abline(v=true[i],col=2,lwd=3)
}
# Comparing
posterior distributions based on both prior distributions
par(mfrow=c(2,2))
boxplot(AR11$sims.array[,1,1],AR12$sims.array[,1,1],
names=c("Conjugate","Stationary"),main="alpha")
boxplot(AR11$sims.array[,1,2],AR12$sims.array[,1,2],
names=c("Conjugate","Stationary"),main="beta")
boxplot(AR11$sims.array[,1,3],AR12$sims.array[,1,3],
names=c("Conjugate","Stationary"),main="tau2")
boxplot(AR11$sims.array[,1,4],AR12$sims.array[,1,4],
names=c("Conjugate","Stationary"),main="y0")