如何将Rjags中的多个链组合成R中的一个链?

时间:2014-07-22 04:29:25

标签: r jags

我通常从rjags调用JAGS,其中有几个链用于诊断目的(例如,4个链)。 之后,我经常想对后验参数估计进行一些后处理(例如,使用预测值,计算额外的统计数据)。然而,在这一点上,将链存储在列表中是令人讨厌的。

将链组合成单个参数列表的好方法是什么?

2 个答案:

答案 0 :(得分:5)

runjags包的功能为combine.mcmc。其默认设置是组合一个或多个链并返回单个链。如,

library(runjags)
fit <- combine.mcmc(multichainfit)

它还有其他组合链的选项。

答案 1 :(得分:2)

以下是rjagscoda解决方案。假设您生成两个这样的链:

library(rjags)
x <- rnorm(100)
model.str <- 'model {for (i in 1:100) {
  x[i] ~ dnorm(mu, sd)}
  mu ~ dnorm(0, .0001)
  sd ~ dgamma(0.1, 0.1)}'
jags <- jags.model(textConnection(model.str), data = list(x = x),n.chains=2)
smpls <- coda.samples(model=jags,n.iter=2,variable.names=c("mu","sd"))
smpls
# [[1]]
# Markov Chain Monte Carlo (MCMC) output:
# Start = 1 
# End = 2 
# Thinning interval = 1 
#               mu        sd
# [1,] -0.09152588 0.9009973
# [2,]  0.05586651 1.0482184
# 
# [[2]]
# Markov Chain Monte Carlo (MCMC) output:
# Start = 1 
# End = 2 
# Thinning interval = 1 
#              mu        sd
# [1,] 0.06893182 0.7317955
# [2,] 0.13599206 0.8517304
# 
# attr(,"class")
# [1] "mcmc.list"

您可以通过

将两个(或任意多个)链组合成一个矩阵
do.call(rbind, smpls)
#               mu        sd
# [1,] -0.09152588 0.9009973
# [2,]  0.05586651 1.0482184
# [3,]  0.06893182 0.7317955
# [4,]  0.13599206 0.8517304

如果你想要一个类mcmc的对象,只需使用函数mcmc

mcmc(do.call(rbind, smpls))

# [[1]]
# Markov Chain Monte Carlo (MCMC) output:
# Start = 1 
# End = 4 
# Thinning interval = 1 
#               mu        sd
# [1,] -0.09152588 0.9009973
# [2,]  0.05586651 1.0482184
# [3,]  0.06893182 0.7317955
# [4,]  0.13599206 0.8517304

如果需要,您可以保留原始链的startendthin属性。例如,要保留thin

mcmc(do.call(rbind, smpls), thin=thin(smpls))

(当然你不能保留所有三个属性)