【问题标题】:runjags object is too bigrunjags 对象太大
【发布时间】:2014-03-17 05:30:35
【问题描述】:

我正在尝试使用新软件包 runjags 运行 JAGS,因为 R2jags has a bug(完整的模型代码在问题 https://stats.stackexchange.com/q/62006/5509 中):

require("runjags")
out <- run.jags("Poisson.OD.t.test.txt", params, win.data, nc, inits,
      nb*4/5, ni, nb*1/5)
plot(out2, layout = c(4, 2))

它作为一个魅力,但这个包的缺点是run.jags 函数返回的runjags 对象已经与准备好的图表和输出捆绑在一起并且太大了。只是为了比较,对应的.Rdata文件的大小(2个链,每个500次保存迭代,总共1000次迭代):

  • runjags 对象 - 1.2 MB
  • R2jags 对象 - 212 kB
  • mcmc.list 对象 - 33 kB

runjags 对象很大,但我必须将其存储起来,以便以后在模型上使用runjags 接口。

此问题的任何解决方法?

【问题讨论】:

  • 您可以在保存之前破解runjags 对象以将一些较大的元素设置为NULLNA,或者您可以破解R2jags 来尝试解决困扰您的问题。 ..
  • @BenBolker :-) 这正是我得出的结论 :-) 我只是想弄清楚是否有一些更简单、更清洁的方法 :-) 不幸的是我不知道类似的包没有这么大的问题(至少对我来说很重要......)。

标签: r jags runjags


【解决方案1】:

runjags 类的对象非常大,主要是因为它们存储了从中断处继续进行模拟所需的所有信息(模型/数据/RNG 状态)。如果您想要的只是 MCMC 链,那么您可以使用以下方法摆脱大部分:

as.mcmc.list(yourrunjagsobject)

...或者转换成可以直接与 rjags 包一起使用的东西:

as.jags(yourrunjagsobject)

另见?runjagsclass

或者,如果您有打印/摘要相关的存储问题并希望保留模型/数据/RNG 状态,请尝试使用summarise=FALSEplot=FALSErun.jags(),这将阻止这些过程中的预生成/存储初始函数调用。

我猜你也可以破解类对象来摆脱大组件,但最好使用提供的转换方法......

【讨论】:

  • 谢谢,太好了!我尝试将summariseplot 设置为FALSE,对象为211kB,甚至比R2jags 还小!我什至可以在这个对象上调用extend.jags。但是,如果我现在想要摘要和绘图怎么办?我想在extend.jags 函数的末尾调用类似runjags.summaries 的东西,但这个函数似乎是私有的。以及如何生成情节?这就是我在设计问题中的意思——如果你可以为用户提供一个接口来事后生成这些东西,那就太好了,即使使用 runjags 对象的轻量级变体。
  • 我发现了一个简单的肮脏技巧,如何在没有它们的情况下从 runjags 对象中获取图表和摘要 - 只需添加两个带有 extend.jags(out, sample = 2) 的新样本,将生成图表和摘要! :-) 但是对于稍微不同的模型。这当然只是一个肮脏的 hack - 我在之前的评论中要求的干净的解决方案会很棒!
  • 您可以使用 extend.jags(out, sample=0) 向现有的 runjags 对象添加(或删除)汇总统计信息和/或绘图。这不会调用 JAGS,因此您的实际 MCMC 样本不会更改(除非您还指定 drop.monitors 或 drop.chains)。我想我可以为此添加一个更明显命名的函数包装器,但它并不会真正减少黑客攻击——它对最终用户来说会更好看!但是请注意,runjags 计算的所有内容都可以使用 coda 包提供的函数手动完成 - 并且可以进行更精细的控制(尤其是绘图)。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
  • 2021-06-16
  • 2021-05-04
  • 2022-06-30
  • 1970-01-01
  • 2012-03-16
  • 2018-01-24
相关资源
最近更新 更多