Добавление / удаление сводок / графиков требует повторной компиляции объекта 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