如何在 R 中保存 JAGS 模型对象?

sie*_*ste 5 r jags

我正在使用该包rjags在 R 中执行 MCMC,并且我想保存该函数的输出以jags.model供以后在另一个 R 会话中使用。

以下是正态分布均值的简单示例:

library(rjags)
N <- 1000
x <- rnorm(N, 0, 5)
model.str <- 'model {for (i in 1:N) {
  x[i] ~ dnorm(mu, 5)}
  mu ~ dnorm(0, .0001)}'
jags <- jags.model(textConnection(model.str), data = list(x = x, N = N))
update(jags, 1000)
Run Code Online (Sandbox Code Playgroud)

我可以生成这样的样本mu

coda.samples(model=jags,n.iter=1,variable.names="mu")

# [[1]]
# Markov Chain Monte Carlo (MCMC) output:
# Start = 2001 
# End = 2001 
# Thinning interval = 1 
#             mu
# [1,] 0.2312028
# 
# attr(,"class")
# [1] "mcmc.list"
Run Code Online (Sandbox Code Playgroud)

现在我想保存模型对象jags以供以后在新的 R 会话中使用,这样我就不必再次在马尔可夫链中进行初始化和烧录:

save(file="/tmp/jags.Rdata", list="jags")
quit()
Run Code Online (Sandbox Code Playgroud)

但是,在启动新的 R 会话并重新加载模型后,我收到一条错误消息,指出必须重新编译 JAGS 模型:

load("/tmp/jags.Rdata")
coda.samples(model=jags,n.iter=1,variable.names="mu")
# Error in model$iter() : JAGS model must be recompiled
Run Code Online (Sandbox Code Playgroud)

这是为什么?如何将对象保存jags在 R 中供以后使用?

注意:之前已经问这个问题,但是 OP 对这个问题不是很具体。

Woo*_*sah 7

也许我完全偏离了你真正想做的事情,但我会建立一个像这样的 jags 模型,使用 R2jags 而不是 rjags(就像一个不同的包装器):

library(R2jags)
N <- 1000
x <- rnorm(N, 0, 5)

sink("test.txt")
cat("
    model{
        for (i in 1:N) {
            x[i] ~ dnorm(mu, 5)
        }
            mu ~ dnorm(0, .0001)
    }
    ",fill = TRUE)
sink()

inits <- function() {
    list(
        mu = dnorm(1, 0, 0.01))
}
params <- c("mu")
chains <- 3
iter <- 1000

jags1 <- jags(model.file = "test.txt", data = list(x = x, N = N),
              parameters.to.save = params, inits = inits,
              n.chains = chains, n.iter = iter, n.burnin=floor(iter/2),
              n.thin = ifelse(floor(iter/100) < 1, 1, floor(iter/100)))
jags2 <- update(jags1, 10000)
jags2
plot(jags2)
traceplot(jags2)
jags2.mcmc <- as.mcmc(jags2)
Run Code Online (Sandbox Code Playgroud)

结果没有区别,我喜欢这个过程,因为它更像我使用 winbugs 的方式,所以......

最后一行代码将 jags2-object 转换为 mcmc-list,它可以被包 coda 处理。

祝你好运!


PS这是第二个答案:

再次查看您的代码后,加载 jags-object 后唯一缺少以获得您想要的行为的是:

jags$recompile()
coda.samples(model=jags,n.iter=1,variable.names="mu")
Run Code Online (Sandbox Code Playgroud)

但是如果你真的只想使用已经获得的后验样本,或者只是想更新链以进行更多迭代,你也可以使用 R2jags 过程。