在 rjags 中初始化平行链

initializing parallel chains in rjags

我正在通过 rjags 在 jags 中进行一些 ghetto 并行化。

我一直在使用函数 parallel.seeds 来获取 RNG 状态以初始化 RNG(下面的示例)。但是,我不明白为什么每个 RNG 都会返回多个整数。在文档中它说当你初始化时 .RNG.state 应该是一个长度为一的数字向量。

此外,有时当我尝试执行此操作时,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

文档有点混乱;在 ?jags.model 下我们看到 .RNG.seed 应该是长度为 1 的向量,但是 parallel.seeds() returns .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 的版本。

.RNG.seed(这是一个长度为 1 的向量,您可以指定 jags.model 以确保 MCMC 样本可重复)和 .[=22 之间存在差异=](这是一个长度向量,取决于 pRNG 算法)。这些可能在某个地方的文档中混淆了 - 你能告诉我你在哪里阅读这篇文章所以我可以确保它已修复 JAGS/rjags 4 吗?

关于崩溃 - 恐怕需要更多详细信息来帮助您解决这个问题。我假设是 JAGS 模型崩溃,而不是您的 R 会话终止,并且在模型 运行 一段时间后?一个可重现的例子会有很大帮助。

顺便说一句 - 当你说 'scale up' - 如果你打算使用 > 4 个链,我强烈建议你加载 lecuyer 模块(见底部的 ?parallel.seeds 示例).

马特