2015-09-21 2 views
0

Я занимаюсь распараллеливанием гетто в пробках через ржаги.инициализация параллельных цепей в rjags

Я использовал функцию 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 

ответ

0

Существует разница между .RNG.seed (который является вектором длины один, и вещью, которую вы можете указать jags.model, например, чтобы гарантировать, что образцы MCMC повторяемы) и .RNG.state (который является вектором длины в зависимости от алгоритма pRNG). Возможно, что они где-то запутались в документах - можете ли вы сказать мне, где вы читаете это, чтобы я мог убедиться, что он исправлен для JAGS/rjags 4?

Что касается сбоя - вам потребуется дополнительная информация, чтобы помочь вам в этом, я боюсь. Я предполагаю, что это ошибка модели JAGS, а не ваш сеанс R, который заканчивается, и после того, как модель работает некоторое время? Воспроизводимый пример очень поможет.

Кстати, когда вы говорите «масштабировать» - если вы планируете использовать> 4 цепочки, я настоятельно рекомендую вам загрузить модуль lecuyer (см. Примеры parallel.seeds внизу).

Мэтт

+0

Да, я смущался о RNG.state и RNG.seed. Я думал, что точка функции parallel.seeds состоит в том, чтобы дать вам семена, которые вы могли бы поставить при запуске цепей. Поэтому я указал RNG.state, когда я инициализировал цепочку, которая разбила мой сеанс R. Итак, могу ли я указать RNG.name и использовать какое-нибудь случайное целое для RNG.seed? – Drew

+0

Да - просто обычное старое целое будет делать для RNG.seed (мне нравится использовать дату, когда я написал скрипт, например .RNG.seed = 2015-10-16). Это в основном для целей воспроизводимости. Параметр parallel.seeds должен предоставить вам начальные состояния RNG (т. Е. Полное внутреннее состояние), чтобы вы могли безопасно запускать несколько цепей параллельно, что позволяет избежать проблем, когда параллельные цепочки не являются полностью независимыми при использовании одного и того же типа RNG. Обратите внимание, что в настоящее время невозможно (в настоящее время) выполнить оба действия - например, parallel.seeds не может быть предоставлен аргумент .RNG.seed. –

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:

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, которые я использую.

+0

Мм. Возможно, я был неясно. R сбой при последующем запуске модели с использованием единственного целочисленного значения, полученного из функции parallel.seeds, а не при запуске функции parallel.seeds. Теперь я попытался использовать весь вектор, поставляемый для данного RNG в качестве семени RNG, когда я инициализирую свою модель, и это отлично работает.Надеемся, что опечатка зафиксирована в следующем выпуске! – Drew

+0

также, кстати, похоже, что состояния RNG имеют переменную длину вектора. Вы можете видеть это, несколько раз подряд запуская «parallel.seeds». – Drew

+0

@Drew, хорошо, ну в этом случае я не могу помочь с диагностикой аварии, не зная о коде, который вызывает сбой. Я не уверен, что длина вектора состояния для данного изменения RNG, но порядок RNG в результатах. Спасибо за согласие! – atiretoo