首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中保存JAGS模型对象?

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

Stack Overflow用户
提问于 2014-08-21 11:19:15
回答 1查看 3.5K关注 0票数 5

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

下面是正态分布平均值的一个简单例子:

代码语言:javascript
复制
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)

我可以生成这样的mu示例:

代码语言:javascript
复制
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"

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

代码语言:javascript
复制
save(file="/tmp/jags.Rdata", list="jags")
quit()

但是,在启动新的R会话并重新加载模型之后,我得到了一个错误消息,即JAGS模型必须重新编译:

代码语言:javascript
复制
load("/tmp/jags.Rdata")
coda.samples(model=jags,n.iter=1,variable.names="mu")
# Error in model$iter() : JAGS model must be recompiled

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

注意:这个问题已经被https://stackoverflow.com/questions/20287535/saving-jags-model-in-rdata-file问过了,但是OP对这个问题并不是很具体。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-22 07:50:38

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

代码语言:javascript
复制
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)

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

最后一行代码将jags2 2对象转换为mcmc列表,包coda可以对其进行处理。

祝好运!

这是第二个答案:

在再次查看您的代码之后,在加载缺少用于获取您想要的行为的jags之后,唯一的事情是:

代码语言:javascript
复制
jags$recompile()
coda.samples(model=jags,n.iter=1,variable.names="mu")

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

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25425017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档