添加/删除摘要/绘图需要重新编译runjags对象

时间:2014-09-21 11:30:10

标签: r jags runjags

由于所有绘图的runjags对象都是too big,我尝试run.jags plot=FALSE,将生成的runjags对象保存到文件中,然后在新的R会话中恢复({1}}作为out),然后通过

生成图表
out.with_summaries <- extend.jags(out, sample = 0, adapt = 0)

(对于这个技巧,请参见此处的讨论:https://stackoverflow.com/a/21859618/684229

然而,由于未知原因,这会重新编译并再次调整模型!即使我设置了sample = 0, adapt = 0

require(runjags)

t1 <- proc.time()
out.sum <- extend.jags(out, sample = 0, adapt = 0)
# Re-compiling rjags model and adapting...
# Calculating the Gelman-Rubin statistic for 4 variables....
# Convergence may have failed for this run for 4 parameters after 500
# iterations (multi-variate psrf = 214.873)
# Finished running the simulation
t2 <- proc.time()
print(t2 - t1)
#   user  system elapsed 
# 345.67    0.08  352.30 

绘制图表需要相当长的时间,这非常烦人。当我使用图计算runjags对象然后尝试去除它们以存储runjags对象时,会发生同样的情况:

t1 <- proc.time()
out.no_sum <- extend.jags(out.sum, sample = 0, adapt = 0, summarise=FALSE, plot=FALSE)
# Loading required package: rjags
# Loading required package: coda
# Loading required package: lattice
# Linked to JAGS 3.3.0
# Loaded modules: basemod,bugs
# Re-compiling rjags model and adapting...
# Finished running the simulation
t2 <- proc.time()
print(t2 - t1)
#    user  system elapsed 
#  327.53    0.05  329.73

有关如何解决此问题的任何提示(除了编写我自己的绘图功能外)?

警告:第二次运行同一个runjags对象上的extend.jags函数已经很快了。但是如果保存runjags对象并在新会话中再次加载它,则extend.jags再次变慢。似乎runjags或JAGS正在缓存某些内容(但不在原始runjags对象中)。

1 个答案:

答案 0 :(得分:2)

这个extend.jags函数调用很慢,因为模型正在重新编译(在你的情况下它实际上并没有适应,尽管有一些误导性消息)。这是因为您从保存的对象中使用rjags方法 - 这意味着必须将模型重新加载到内存中并准备好从中进行采样(即使您实际上并不想从中进行采样)。第二次调用extend.jags时就不会发生这种情况,因为它已经编译好了。

以这种方式使用extend.jags实际上是一个黑客攻击 - 下一版本的runjags将提供一种更简洁的方法。在此期间,如果您指定adapt=0, sample=0, method='simple',则此阻止重新编译JAGS对象。

编辑:如runjags的帮助文件中所述,使用lattice::traceplotdensityplot(或两者)重新创建绘图效率更高。要提取MCMC对象,请使用as.mcmc.list(runjags_object) - 这也允许您在必要时提取特定变量,请参阅?as.mcmc.list.runjags