1

我正在通过 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
4

2 回答 2

1

.RNG.seed(长度为 1 的向量,您可以指定给 jags.model 以确保 MCMC 样本可重复)和 .RNG.state(长度向量取决于pRNG 算法)。这些可能在某个地方的文档中混淆了——你能告诉我你在哪里读到的,这样我就可以确保它对于 JAGS/rjags 4 是固定的?

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

顺便说一句 - 当你说“扩大规模”时 - 如果你打算使用 > 4 个链,我强烈建议你加载 lecuyer 模块(参见底部的 ?parallel.seeds 示例)。

马特

于 2015-09-25T13:57:26.293 回答
1

文档有点混乱;在 ?jags.model 下,我们看到 .RNG.seed 应该是长度为 1 的向量,但 parallel.seeds() 返回通常 > 1 的 .RNG.state。Mersenne Twister 算法的状态空间有 624 个整数,并且那是你做的向量的长度

parallel.seeds("base::BaseRNG",4)

确保您看到所有 4 种类型的 RNG。 同样,Wichmann-Hill 生成器的状态空间有 3 个整数,我相信类似的研究会揭示其他两个的状态空间长于 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 的版本。

于 2015-09-21T17:49:17.067 回答