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.
- 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
- 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
- submuestra las cadenas desde este punto hasta el final de la cadena
- adelgazar la cadena utilizando la autocorrelación de la cadena más autocorrelacionada
- 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:
No es posible diagnosticar la convergencia, solo diagnosticar la falta de convergencia (Brooks, Giudici y Philippe, 2003)
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.
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)