Ecco un approccio all'automazione. Feedback molto apprezzato. Questo è un tentativo di sostituire l'ispezione visiva iniziale con il calcolo, seguito da un'ispezione visiva successiva, in linea con la pratica standard.
Questa soluzione in realtà incorpora due potenziali soluzioni, innanzitutto, calcolare il burn-in per rimuovere la lunghezza della catena prima che venga raggiunta una certa soglia, quindi utilizzare la matrice di autocorrelazione per calcolare l'intervallo di assottigliamento.
- calcolare un vettore del fattore mediano di contrazione diagnostica di convergenza Gelman-Rubin massimo mediano (grsf) per tutte le variabili nel
- trovare il numero minimo di campioni a cui il grsf attraverso tutte le variabili scende al di sotto di una soglia, ad esempio 1.1 nell'esempio, forse inferiore nella pratica
- sub campionare le catene da questo punto fino alla fine della catena
- assottigliare la catena usando l'autocorrelazione della catena più autocorrelata
- confermare visivamente la convergenza con grafici di traccia, autocorrelazione e densità
L'oggetto mcmc può essere scaricato qui: 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)
--aggiornare--
Come implementato in R, il calcolo della matrice di autocorrelazione è più lento di quanto sarebbe desiderabile (> 15 min in alcuni casi), in misura minore, così come il calcolo del fattore di restringimento GR. C'è una domanda su come velocizzare il passaggio 4 su StackOverflow qui
--aggiornamento parte 2--
risposte aggiuntive:
Non è possibile diagnosticare la convergenza, solo per diagnosticare la mancanza di convergenza (Brooks, Giudici e Philippe, 2003)
La funzione autorun.jags dal pacchetto runjags automatizza il calcolo della lunghezza della corsa e la diagnostica di convergenza. Non inizia a monitorare la catena fino a quando la diagnostica Gelman rubin è inferiore a 1,05; calcola la lunghezza della catena usando la diagnostica Raftery e Lewis.
Gelman et al (Gelman 2004 Bayesian Data Analysis, p. 295, Gelman e Shirley, 2010 ) affermano di utilizzare un approccio conservativo per scartare la prima metà della catena. Sebbene sia una soluzione relativamente semplice, in pratica è sufficiente per risolvere il problema per la mia particolare serie di modelli e dati.
#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)