Posso semiautomatizzare la diagnostica di convergenza MCMC per impostare la lunghezza di burn-in?


13

Vorrei automatizzare la scelta del burn-in per una catena MCMC, ad esempio rimuovendo le prime n righe sulla base di una diagnostica di convergenza.

In che misura questo passaggio può essere automatizzato in modo sicuro? Anche se ricontrollo ancora l'autocorrelazione, la traccia mcmc e i pdf, sarebbe bello avere la scelta della lunghezza di burn-in automatizzata.

La mia domanda è generale, ma sarebbe fantastico se tu potessi fornire dettagli specifici per gestire un oggetto R mcmc.; Sto usando i pacchetti rjags e coda in R.


sebbene non sia incluso nella domanda originale, sarebbe anche utile impostare automaticamente l'intervallo di assottigliamento come proposto nella mia risposta.
David LeBauer

1
Vorrei solo ricordare che, essendo interessato a creare algoritmi MCMC generici, facilmente applicabili a molti problemi, sono molto interessato a questo argomento.
John Salvatier

Risposte:


6

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.

  1. calcolare un vettore del fattore mediano di contrazione diagnostica di convergenza Gelman-Rubin massimo mediano (grsf) per tutte le variabili nel
  2. 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
  3. sub campionare le catene da questo punto fino alla fine della catena
  4. assottigliare la catena usando l'autocorrelazione della catena più autocorrelata
  5. 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:

  1. Non è possibile diagnosticare la convergenza, solo per diagnosticare la mancanza di convergenza (Brooks, Giudici e Philippe, 2003)

  2. 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.

  3. 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)

2
Si applicano due principi: non si può mai sapere se la catena si è convertita alla sua distribuzione stazionaria. E qualsiasi test di convergenza che puoi eseguire manualmente, puoi automatizzare. Quindi il tuo approccio sembra abbastanza valido.
Tristan,

Nella documentazione dei runjags vedo che autorun.jags dice che il modello viene automaticamente valutato per la convergenza e la dimensione del campione adeguata prima di essere restituito. Potresti indicarmi dove hai scoperto che autorun.jags non inizia a monitorare la catena fino a quando la diagnostica Gelman rubin è inferiore a 1,05? Grazie
user1068430

@ user1068430 in autorun.jags, ...consente di passare i parametri alla add.summaryfunzione. La add.summaryfunzione ha un argomento psrf.targetcon un valore predefinito di 1,05
David LeBauer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.