¿Puedo semiautomatizar los diagnósticos de convergencia de MCMC para establecer la longitud de quemado?

13

Me gustaría automatizar la elección del quemado para una cadena MCMC, por ejemplo, eliminando las primeras n filas según un diagnóstico de convergencia.

¿En qué medida se puede automatizar este paso de forma segura? Incluso si aún verifico dos veces la autocorrelación, el seguimiento de mcmc y los archivos PDF, sería bueno tener la opción de longitud de quemado automatizada.

Mi pregunta es general, pero sería genial si pudiera proporcionar detalles para tratar con un objeto R mcmc.object; Estoy usando los paquetes rjags y coda en R.

David LeBauer
fuente
aunque no se incluye en la pregunta original, también sería útil establecer automáticamente el intervalo de adelgazamiento como se propone en mi respuesta.
David LeBauer
1
Solo quisiera mencionar que, como alguien interesado en crear algoritmos genéricos MCMC, fácilmente aplicables a muchos problemas, estoy muy interesado en este tema.
John Salvatier

Respuestas:

6

Aquí hay un enfoque en la automatización. Comentarios muy apreciados. Este es un intento de reemplazar la inspección visual inicial con la computación, seguida de una inspección visual posterior, de acuerdo con la práctica estándar.

Esta solución en realidad incorpora dos posibles soluciones, primero, calcular el quemado para eliminar la longitud de la cadena antes de alcanzar algún umbral, y luego usar la matriz de autocorrelación para calcular el intervalo de adelgazamiento.

  1. calcule un vector de la mediana máxima del factor de encogimiento diagnóstico de convergencia Gelman-Rubin (grsf) para todas las variables en el
  2. encuentre el número mínimo de muestras en el que el grsf en todas las variables cae por debajo de algún umbral, por ejemplo, 1.1 en el ejemplo, quizás más bajo en la práctica
  3. submuestra las cadenas desde este punto hasta el final de la cadena
  4. adelgazar la cadena utilizando la autocorrelación de la cadena más autocorrelacionada
  5. confirmar visualmente la convergencia con trazas, autocorrelación y gráficos de densidad

El objeto mcmc se puede descargar aquí: 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)

--actualizar--

Según lo implementado en R, el cálculo de la matriz de autocorrelación es más lento de lo que sería deseable (> 15 min en algunos casos), en menor medida, también lo es el cálculo del factor de reducción de GR. Hay una pregunta sobre cómo acelerar el paso 4 en stackoverflow aquí

--actualizar parte 2--

respuestas adicionales:

  1. No es posible diagnosticar la convergencia, solo diagnosticar la falta de convergencia (Brooks, Giudici y Philippe, 2003)

  2. La función autorun.jags del paquete runjags automatiza el cálculo de la longitud de ejecución y el diagnóstico de convergencia. No comienza a monitorear la cadena hasta que el diagnóstico de rubin Gelman esté por debajo de 1.05; Calcula la longitud de la cadena utilizando el diagnóstico de Raftery y Lewis.

  3. Gelman et al. (Gelman 2004 Bayesian Data Analysis, p. 295, Gelman y Shirley, 2010 ) afirman que utilizan un enfoque conservador para descartar la primera mitad de la cadena. Aunque es una solución relativamente simple, en la práctica es suficiente para resolver el problema de mi conjunto particular de modelos y datos.


#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)
rev. David LeBauer
fuente
2
Se aplican dos principios: nunca se puede saber si su cadena ha convergido a su distribución estacionaria. Y cualquier prueba de convergencia que pueda hacer manualmente, puede automatizarla. Entonces su enfoque parece lo suficientemente sólido.
Tristan
En la documentación de runjags, veo que autorun.jags dice que el modelo se evalúa automáticamente para la convergencia y el tamaño de muestra adecuado antes de ser devuelto. ¿Podría indicarme dónde descubrió que autorun.jags no comienza a monitorear la cadena hasta que el diagnóstico de Rubin Gelman es inferior a 1.05? Gracias
user1068430
@ user1068430 en autorun.jags, ...permite que los parámetros pasen a la add.summaryfunción. La add.summaryfunción tiene un argumentopsrf.target con un valor predeterminado de 1.05
David LeBauer