计算和索引Coda中的mcmc链

时间:2018-07-20 22:35:41

标签: r bayesian mcmc jags rjags

我需要做两件事。首先,我希望能够在coda mcmc对象中创建新变量,这些变量是根据现有变量计算得出的,以便可以对新变量运行链诊断。其次,我希望能够在某些尾随绘图功能中为单个变量建立索引,同时仍然查看所有链。

玩具数据。使用JAGSrjags对睡眠数据进行贝叶斯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)

...但是,如果我不想或不需要查看所有变量怎么办?如果我只想查看一个或什至两个变量(但不是所有变量)但图中有所有链的轨迹图和/或饱和度图怎么办?

0 个答案:

没有答案