初始化rjags中的并行链

时间:2015-09-21 16:20:17

标签: r jags

我通过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

2 个答案:

答案 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示例)。

马特