我需要做两件事。首先,我希望能够在coda
mcmc对象中创建新变量,这些变量是根据现有变量计算得出的,以便可以对新变量运行链诊断。其次,我希望能够在某些尾随绘图功能中为单个变量建立索引,同时仍然查看所有链。
玩具数据。使用JAGS
和rjags
对睡眠数据进行贝叶斯t检验。
data(sleep)
# read in data
y <- sleep$extra
x <- as.numeric(as.factor(sleep$group))
nTotal <- length(y)
nGroup <- length(unique(x))
mY <- mean(y)
sdY <- sd(y)
# make dataList
dataList <- list(y = y, x = x, nTotal = nTotal, nGroup = nGroup, mY = mY, sdY = sdY)
# model string
modelString <- "
model{
for (oIdx in 1:nTotal) {
y[oIdx] ~ dnorm(mu[x[oIdx]], 1/sigma[x[oIdx]]^2)
}
for (gIdx in 1:nGroup) {
mu[gIdx] ~ dnorm(mY, 1/sdY)
sigma[gIdx] ~ dunif(sdY/10, sdY*10)
}
}
"
writeLines(modelString, con = "tempModel.txt")
# chains
# 1. adapt
jagsModel <- jags.model(file = "tempModel.txt",
data = dataList,
n.chains = 3,
n.adapt = 1000)
# 2. burn-in
update(jagsModel, n.iter = 1000)
# 3. generate
codaSamples <- coda.samples(model = jagsModel,
variable.names = c("mu", "sigma"),
thin = 15,
n.iter = 10000*15/3)
问题之一
如果将coda
对象转换为数据框,则可以计算两组估算值之间的差,并绘制此新变量,就像这样...
df <- as.data.frame(as.matrix(codaSamples))
names(df) <- gsub("\\[|\\]", "", names(df), perl = T) # remove brackets
df$diff <- df$mu1 - df$mu2
ggplot(df, aes(x = diff)) +
geom_histogram(bins = 100, fill = "skyblue") +
geom_vline(xintercept = mean(df$diff), colour = "red", size = 1, linetype = "dashed")
...但是如何获取跟踪图?我可以像这样在coda对象中为现有变量获取一个...
traceplot(codaSamples[[1]][,1])
...但是我希望能够将它们用于新的diff
变量。
问题二
这带给我第二个问题。我希望能够(除其他外)获得单个变量的跟踪图。如上所示,如果我只想查看一个链,但想查看所有链,则可以为单个变量获取它们。我可以使用简单的
查看模型中所有变量的所有链图(codaSamples)
...但是,如果我不想或不需要查看所有变量怎么办?如果我只想查看一个或什至两个变量(但不是所有变量)但图中有所有链的轨迹图和/或饱和度图怎么办?