##Generate some data
set.seed(1)
n <- 100
q <- 3
nltr <- q*(q-1)/2+q
L <- matrix(0,q,q)
L[lower.tri(L,TRUE)] <- rnorm(nltr,1,1)
Psi <- L%*%t(L)
X <- mkMvX(list(matrix(1,n,1), matrix(1,n,1), matrix(1,n,1)))
beta <- c(-1,0,1)
y <- mvrnorm(1, X%*%beta, diag(n)%x%Psi)
y.1 <- y[seq(1,length(y),q)]
y.2 <- y[seq(2,length(y),q)]
y.3 <- y[seq(3,length(y),q)]
n.samples <- 10000
##starting
L.starting <- diag(q)[lower.tri(diag(q),TRUE)]
L.tuning <- rep(0.03,nltr)
m.1 <- mvLM(list(y.1~1,y.2~1,y.3~1), starting=list("L"=L.starting),
tuning=list("L"=L.tuning), priors=list("Psi.IW"=list(q+1, diag(0.1,q))),
n.samples=n.samples, verbose=TRUE, n.report=1000)
L.starting <- diag(5,q)[lower.tri(diag(q),TRUE)]
m.2 <- mvLM(list(y.1~1,y.2~1,y.3~1), starting=list("L"=L.starting),
tuning=list("L"=L.tuning), priors=list("Psi.IW"=list(q+1, diag(0.1,q))),
n.samples=n.samples, verbose=TRUE, n.report=1000)
L.starting <- diag(10,q)[lower.tri(diag(q),TRUE)]
m.3 <- mvLM(list(y.1~1,y.2~1,y.3~1), starting=list("L"=L.starting),
tuning=list("L"=L.tuning), priors=list("Psi.IW"=list(q+1, diag(0.1,q))),
n.samples=n.samples, verbose=TRUE, n.report=1000)
samps <- mcmc.list(m.1$p.samples, m.2$p.samples, m.3$p.samples)
gelman.plot(samps)
##Note that Psi[2,1], Psi[3,1], and Psi[3,2] are slow to converge.
##Try a bit of hand tuning or run the chains out longer.
n.samples <- 25000
##starting
L.starting <- diag(q)[lower.tri(diag(q),TRUE)]
L.tuning <- rep(0.03,nltr)
m.1 <- mvLM(list(y.1~1,y.2~1,y.3~1), starting=list("L"=L.starting),
tuning=list("L"=L.tuning),
priors=list("Psi.IW"=list(q+1, diag(0.1,q))),
n.samples=n.samples, verbose=TRUE, n.report=1000)
L.starting <- diag(5,q)[lower.tri(diag(q),TRUE)]
m.2 <- mvLM(list(y.1~1,y.2~1,y.3~1), starting=list("L"=L.starting),
tuning=list("L"=L.tuning),
priors=list("Psi.IW"=list(q+1, diag(0.1,q))),
n.samples=n.samples, verbose=TRUE, n.report=1000)
L.starting <- diag(10,q)[lower.tri(diag(q),TRUE)]
m.3 <- mvLM(list(y.1~1,y.2~1,y.3~1), starting=list("L"=L.starting),
tuning=list("L"=L.tuning),
priors=list("Psi.IW"=list(q+1, diag(0.1,q))),
n.samples=n.samples, verbose=TRUE, n.report=1000)
samps <- mcmc.list(m.1$p.samples, m.2$p.samples, m.3$p.samples)
gelman.plot(samps)
##parameters posterior summary
burn.in <- 10000
plot(window(samps, start=burn.in))
print(round(summary(window(samps, start=burn.in))$quantiles[,c(3,1,5)],2))
Run the code above in your browser using DataLab