Документация немного запутанна; под? 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:
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.state и RNG.seed. Я думал, что точка функции parallel.seeds состоит в том, чтобы дать вам семена, которые вы могли бы поставить при запуске цепей. Поэтому я указал RNG.state, когда я инициализировал цепочку, которая разбила мой сеанс R. Итак, могу ли я указать RNG.name и использовать какое-нибудь случайное целое для RNG.seed? – Drew
Да - просто обычное старое целое будет делать для RNG.seed (мне нравится использовать дату, когда я написал скрипт, например .RNG.seed = 2015-10-16). Это в основном для целей воспроизводимости. Параметр parallel.seeds должен предоставить вам начальные состояния RNG (т. Е. Полное внутреннее состояние), чтобы вы могли безопасно запускать несколько цепей параллельно, что позволяет избежать проблем, когда параллельные цепочки не являются полностью независимыми при использовании одного и того же типа RNG. Обратите внимание, что в настоящее время невозможно (в настоящее время) выполнить оба действия - например, parallel.seeds не может быть предоставлен аргумент .RNG.seed. –