Чи можу я напівавтоматизувати діагностику конвергенції MCMC, щоб встановити довжину згоряння?


13

Я б хотів автоматизувати вибір спалювання для ланцюга MCMC, наприклад, видаливши перші n рядів на основі діагностики конвергенції.

Наскільки цей крок може бути безпечно автоматизований? Навіть якщо я все ще перевіряю автокореляцію, mcmc слід та pdfs, було б непогано мати вибір довжини спалювання автоматизованим.

Моє запитання загальне, але було б чудово, якби ви могли надати конкретні дані щодо роботи з m mc.c.об'єктом; Я використовую пакети rjags та coda в Р.


Хоча це не входить до оригінального запитання, було б також корисно автоматично встановити інтервал прорідження, як було запропоновано в моїй відповіді.
David LeBauer

1
Я хотів би лише зазначити, що, як хтось зацікавлений у створенні загальних алгоритмів MCMC, легко застосованих до багатьох проблем, мене ця тема дуже зацікавила.
Джон Сальватьє

Відповіді:


6

Ось один підхід до автоматизації. Відгуки високо оцінені. Це спроба замінити початковий візуальний огляд на обчислення з подальшим подальшим візуальним оглядом у відповідності зі стандартною практикою.

Це рішення фактично включає два потенційні рішення: спочатку обчислюють спалювання для видалення довжини ланцюга до досягнення певного порогу, а потім використовуючи матрицю автокореляції для обчислення інтервалу проріджування.

  1. обчислити вектор максимального медіанного коефіцієнта зменшення гельмана-Рубіна, діагностичного коефіцієнта згортання (grsf) для всіх змінних у
  2. знайти мінімальну кількість зразків, у яких grsf по всіх змінних опускається нижче деякого порогового значення, наприклад, 1,1 у прикладі, можливо, нижче на практиці
  3. підпробовуйте ланцюги з цієї точки до кінця ланцюга
  4. тонкий ланцюг, використовуючи автокореляцію самого автокорельованого ланцюга
  5. візуально підтверджують конвергенцію з графіками слідів, автокореляції та щільності

Об'єкт mcmc можна завантажити тут: jags.out.Rdata

# jags.out is the mcmc.object with m variables
library(coda)    
load('jags.out.Rdata')
# 1. calculate max.gd.vec, 
# max.gd.vec is a vector of the maximum shrink factor
max.gd.vec     <- apply(gelman.plot(jags.out)$shrink[, ,'median'], 1, max)
# 2. will use window() to subsample the jags.out mcmc.object
# 3. start window at min(where max.gd.vec < 1.1, 100) 
window.start   <- max(100, min(as.numeric(names(which(max.gd.vec - 1.1 < 0)))))
jags.out.trunc <- window(jags.out, start = window.start)
# 4. calculate thinning interval
# thin.int is the chain thin interval
# step is very slow 
# 4.1 find n most autocorrelated variables
n = min(3, ncol(acm))
acm             <- autocorr.diag(jags.out.trunc)
acm.subset      <- colnames(acm)[rank(-colSums(acm))][1:n]
jags.out.subset <- jags.out.trunc[,acm.subset]
# 4.2 calculate the thinning interval
# ac.int is the time step interval for autocorrelation matrix
ac.int          <- 500 #set high to reduce computation time
thin.int        <- max(apply(acm2 < 0, 2, function(x) match(T,x)) * ac.int, 50)
# 4.3 thin the chain 
jags.out.thin   <- window(jags.out.trunc, thin = thin.int)
# 5. plots for visual diagnostics
plot(jags.out.thin)
autocorr.plot(jags.win.out.thin)

--оновити--

Як реалізовано в R, обчислення матриці автокореляції відбувається повільніше, ніж хотілося б (> 15 хв у деяких випадках), меншою мірою, як і обчислення коефіцієнта скорочення ГР. Тут є питання про те, як пришвидшити крок 4 для stackoverflow тут

--оновіть частину 2--

додаткові відповіді:

  1. Неможливо діагностувати конвергенцію, лише діагностувати відсутність конвергенції (Брукс, Джудічі та Філіпп, 2003)

  2. Функція autorun.jags з пакету runjags автоматизує розрахунок діапазону пробігу та діагностики конвергенції. Він не починає контролювати ланцюг, поки діагностика рубіну Гельмана не буде нижче 1,05; він обчислює довжину ланцюга за допомогою діагностики Рафті і Льюїса.

  3. Гельман та ін. (Gelman 2004 Bayesian Data Analysis, p. 295, Gelman and Shirley, 2010 ) стверджують, що вони використовують консервативний підхід до відкидання першої половини ланцюга. Хоча відносно просте рішення, на практиці цього достатньо для вирішення проблеми для мого конкретного набору моделей та даних.


#code for answer 3
chain.length <- summary(jags.out)$end
jags.out.trunc <- window(jags.out, start = chain.length / 2)
# thin based on autocorrelation if < 50, otherwise ignore
acm <- autocorr.diag(jags.out.trunc, lags = c(1, 5, 10, 15, 25))
# require visual inspection, check acceptance rate
if (acm == 50) stop('check acceptance rate, inspect diagnostic figures') 
thin.int <- min(apply(acm2 < 0, 2, function(x) match(TRUE, x)), 50)
jags.out.thin <- window(jags.out.trunc, thin = thin.int)

2
Застосовуються два принципи: Ви ніколи не можете дізнатися, чи перейшла ваша ланцюг до її нерухомого розподілу. І будь-який тест на конвергенцію ви можете зробити вручну, ви можете автоматизувати. Тож ваш підхід здається достатньо здоровим.
Трістан

У документації на runjags я бачу, що autorun.jags каже, що модель автоматично оцінюється на конвергенцію та адекватний розмір вибірки перед поверненням. Не могли б ви вказати мені, де ви виявили, що autorun.jags не починає контролювати ланцюг, поки діагностика рубіну Gelman не буде нижче 1,05? Дякую
користувач1068430

@ user1068430 in autorun.jags, ...дозволяє передати параметри add.summaryфункції. У add.summaryфункції є аргумент psrf.targetзі значенням за замовчуванням 1,05
David LeBauer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.