Добавление / удаление сводок / графиков требует повторной компиляции объекта runjags

Поскольку объект runjags со всеми графиками слишком большой, я попытался run.jags с plot=FALSEсохранить полученный результат runjags объект в файл, восстановить его в новой сессии R (как out), а затем генерировать участки по

out.with_summaries <- extend.jags(out, sample = 0, adapt = 0)

(об этом приеме см. обсуждение здесь: /questions/34508895/obekt-runjags-slishkom-bolshoj/34508901#34508901)

Однако по неизвестной причине это перекомпилирует и адаптирует модель снова! Даже когда я установил sample = 0, adapt = 0!

require(runjags)

t1 <- proc.time()
out.sum <- extend.jags(out, sample = 0, adapt = 0)
# Re-compiling rjags model and adapting...
# Calculating the Gelman-Rubin statistic for 4 variables....
# Convergence may have failed for this run for 4 parameters after 500
# iterations (multi-variate psrf = 214.873)
# Finished running the simulation
t2 <- proc.time()
print(t2 - t1)
#   user  system elapsed 
# 345.67    0.08  352.30 

Это занимает довольно много времени только для построения графиков, что довольно раздражает. То же самое происходит, когда я вычисляю объект runjags с помощью графиков, а затем пытаюсь избавиться от них, чтобы сохранить объект runjags маленьким:

t1 <- proc.time()
out.no_sum <- extend.jags(out.sum, sample = 0, adapt = 0, summarise=FALSE, plot=FALSE)
# Loading required package: rjags
# Loading required package: coda
# Loading required package: lattice
# Linked to JAGS 3.3.0
# Loaded modules: basemod,bugs
# Re-compiling rjags model and adapting...
# Finished running the simulation
t2 <- proc.time()
print(t2 - t1)
#    user  system elapsed 
#  327.53    0.05  329.73

Любые советы о том, как решить эту проблему (кроме написания моих собственных функций печати)?

Предупреждение: второй запуск extend.jags Функция на том же объекте Runjags уже быстро. Но если вы сохраните объект runjags и загрузите его снова в новом сеансе, extend.jags снова медленно Кажется, что runjags или JAGS что-то кеширует (но не в исходном объекте runjags).

1 ответ

Решение

Это extend.jags Вызов функции медленный, потому что модель перекомпилируется (в вашем случае она фактически не адаптируется, несмотря на несколько вводящее в заблуждение сообщение). Это потому, что вы используете метод rjags из сохраненного объекта - это означает, что модель должна быть повторно загружена в память и подготовлена ​​для выборки из нее (даже если вы на самом деле не хотите производить выборку из нее). Это не происходит во второй раз, когда вы звоните extend.jags потому что это уже скомпилировано.

Таким образом, использование exte.jags - это немного хакерство - следующая версия runjags предоставит более чистый способ сделать это. А пока, если указать adapt=0, sample=0, method='simple' это должно предотвратить перекомпиляцию объекта JAGS.

РЕДАКТИРОВАТЬ: Как указано в файле справки для runjags, более эффективно воссоздать графики, используя lattice::traceplot или же densityplot (или оба). Чтобы извлечь объект MCMC, используйте as.mcmc.list(runjags_object) - это также позволяет вам извлекать конкретные переменные, если это необходимо, см. as.mcmc.list.runjags

Другие вопросы по тегам