我通过rjags在jags中进行一些贫民窟并行化。
我一直在使用parallel.seeds函数获取RNG状态以初始化RNG(以下示例)。但是,我不明白为什么每个RNG都会返回多个整数。在文档中,它说当你初始化.RNG.state应该是一个长度为1的数字向量。
此外,有时当我尝试这样做时,R崩溃而没有产生错误。当我放弃并让它为它自己生成链的种子时,模型运行正常。这是否意味着我使用了错误的.RNG.state?任何见解都会受到赞赏,因为我计划在未来扩展这个模型。
> parallel.seeds("base::BaseRNG", 3)
[[1]]
[[1]]$.RNG.name
[1] "base::Wichmann-Hill"
[[1]]$.RNG.state
[1] 3891 16261 19841
[[2]]
[[2]]$.RNG.name
[1] "base::Marsaglia-Multicarry"
[[2]]$.RNG.state
[1] 408065014 1176110892
[[3]]
[[3]]$.RNG.name
[1] "base::Super-Duper"
[[3]]$.RNG.state
[1] -848274653 175424331
答案 0 :(得分:0)
文档有点令人困惑;在?jags.model下我们看到.RNG.seed应该是长度为1的向量,但parallel.seeds()返回.RNG.state,它通常是> 1. The state space for the Mersenne Twister algorithm has 624 integers,这是你做
时矢量的长度parallel.seeds("base::BaseRNG",4)
确保您看到所有4种类型的RNG。 Similarly the state space of the Wichmann-Hill generator has 3 integers,我相信类似的研究会发现其他两个的状态空间长于1。
对于我自己的启发,我使用rjags中的LINE数据模拟了一个例子:
data(LINE)
LINE$model() ## edit and save to line.r
data = LINE$data()
line = jags.model("line.r",data=data)
line.samples <- jags.samples(LINE, c("alpha","beta","sigma"),n.iter=1000)
line.samples
inits = parallel.seeds("base::BaseRNG", 3) # a list of lists
inits[[1]]$tau = 1
inits[[1]]$alpha = 3
inits[[1]]$beta = 1
inits[[2]]$tau = .1
inits[[2]]$alpha = .3
inits[[2]]$beta = .1
inits[[3]]$tau = 10
inits[[3]]$alpha = 10
inits[[3]]$beta = 5
line = jags.model("line.r",data=data,inits=inits,n.chains=3)
line.samples <- jags.samples(line, c("alpha","beta","sigma"),n.iter=1000)
line2 = jags.model("line.r",data=data,inits=inits,n.chains=3)
line.samples2 <- jags.samples(line2, c("alpha","beta","sigma"),n.iter=1000)
all(line.samples$alpha-line.samples2$alpha < 0.00000001) ## TRUE
因此结果完全可重复,这很酷。
要了解R崩溃的条件,我需要知道您计算机上sessionInfo()的结果,以及有关情况的更多详细信息(例如,您运行的是哪种JAGS模型?)。我刚刚做了:
for (i in 1:100){parallel.seeds("base::BaseRNG",4)}
我的电脑没有崩溃。供参考:
sessionInfo()
# R version 3.1.3 (2015-03-09)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows 7 x64 (build 7601) Service Pack 1
#
# locale:
# [1] LC_COLLATE=English_United States.1252
# [2] LC_CTYPE=English_United States.1252
# [3] LC_MONETARY=English_United States.1252
# [4] LC_NUMERIC=C
# [5] LC_TIME=English_United States.1252
#
# attached base packages:
# [1] stats graphics grDevices utils datasets
# [6] methods base
#
# other attached packages:
# [1] rjags_3-14 coda_0.17-1 mlogit_0.2-4
# [4] maxLik_1.2-4 miscTools_0.6-16 Formula_1.2-1
#
# loaded via a namespace (and not attached):
# [1] grid_3.1.3 lattice_0.20-30 lmtest_0.9-33
# [4] MASS_7.3-39 sandwich_2.3-3 statmod_1.4.21
# [7] tools_3.1.3 zoo_1.7-12
这显示了我正在使用的R和rjags的版本。
答案 1 :(得分:0)
.RNG.seed(长度为1的向量,你可以指定给jags.model以确保MCMC样本可重复的东西)和.RNG.state(它是一个向量)之间存在差异。长度取决于pRNG算法)。有可能这些文档在某个地方被混淆了 - 你能告诉我你在哪里读到这个,所以我可以确定它是针对JAGS / rjags 4修复的吗?
关于崩溃 - 我需要更多细节来帮助你。我假设它是JAGS模型崩溃,而不是你的R会话终止,并且在模型运行一段时间之后?一个可重复的例子会有很大帮助。
顺便说一下 - 当你说'向上扩展'时 - 如果你打算使用&gt; 4个链我强烈建议您加载lecuyer模块(参见底部的?parallel.seeds示例)。
马特