Posso semi-automatizar o diagnóstico de convergência do MCMC para definir o comprimento da queima?

13

Gostaria de automatizar a escolha do burn-in para uma cadeia MCMC, por exemplo, removendo as primeiras n linhas com base em um diagnóstico de convergência.

Até que ponto essa etapa pode ser automatizada com segurança? Mesmo se eu ainda verificar a autocorrelação, o rastreamento mcmc e os pdfs, seria bom ter a opção de comprimento de gravação automatizado.

Minha pergunta é geral, mas seria ótimo se você pudesse fornecer detalhes específicos para lidar com um objeto R mcmc.; Estou usando os pacotes rjags e coda em R.

David LeBauer
fonte
embora não esteja incluído na pergunta original, também seria útil definir automaticamente o intervalo de redução conforme proposto na minha resposta.
David LeBauer
1
Gostaria apenas de mencionar que, como alguém interessado em criar algoritmos genéricos do MCMC, facilmente aplicáveis ​​a muitos problemas, estou muito interessado neste tópico.
John Salvatier

Respostas:

6

Aqui está uma abordagem na automação. Feedback muito apreciado. Esta é uma tentativa de substituir a inspeção visual inicial pela computação, seguida pela inspeção visual subsequente, de acordo com a prática padrão.

Essa solução realmente incorpora duas soluções em potencial: primeiro, calcule a queima para remover o comprimento da cadeia antes que algum limite seja atingido e, em seguida, use a matriz de autocorrelação para calcular o intervalo de diluição.

  1. calcule um vetor do fator de encolhimento máximo diagnóstico mediano de convergência Gelman-Rubin (grsf) para todas as variáveis ​​no
  2. encontre o número mínimo de amostras em que o grsf em todas as variáveis ​​fica abaixo de algum limite, por exemplo, 1,1 no exemplo, talvez mais baixo na prática
  3. subamostrar as cadeias deste ponto até o final da cadeia
  4. afinar a cadeia usando a autocorrelação da cadeia mais autocorrelacionada
  5. confirmar visualmente a convergência com traços, autocorrelação e gráficos de densidade

O objeto mcmc pode ser baixado aqui: 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)

--atualizar--

Conforme implementado em R, o cálculo da matriz de autocorrelação é mais lento do que seria desejável (> 15 min em alguns casos), em menor grau, assim como o cálculo do fator de contração GR. Há uma pergunta sobre como acelerar a etapa 4 no stackoverflow aqui

- atualizar parte 2--

respostas adicionais:

  1. Não é possível diagnosticar convergência, apenas diagnosticar falta de convergência (Brooks, Giudici e Philippe, 2003)

  2. A função autorun.jags do pacote runjags automatiza o cálculo do comprimento da execução e dos diagnósticos de convergência. Ele não começa a monitorar a cadeia até que o diagnóstico de Gelman rubin esteja abaixo de 1,05; calcula o comprimento da cadeia usando o diagnóstico Raftery e Lewis.

  3. Gelman et al. (Gelman 2004 Bayesian Data Analysis, p. 295, Gelman e Shirley, 2010 ) afirmam que usam uma abordagem conservadora de descartar a 1ª metade da cadeia. Embora seja uma solução relativamente simples, na prática isso é suficiente para resolver o problema do meu conjunto específico de modelos e dados.


#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)
David LeBauer
fonte
2
Dois princípios se aplicam: Você nunca pode saber se sua cadeia convergiu para sua distribuição estacionária. E qualquer teste de convergência que você pode fazer manualmente, pode automatizar. Portanto, sua abordagem parece sólida o suficiente.
Tristan
Na documentação dos runjags, vejo que autorun.jags diz que o modelo é automaticamente avaliado quanto à convergência e tamanho adequado da amostra antes de ser devolvido. Você poderia me indicar onde descobriu que o autorun.jags não começa a monitorar a cadeia até que o diagnóstico do gelman Gelin esteja abaixo de 1,05? Obrigado
user1068430
@ user1068430 in autorun.jags, ...permite que os parâmetros sejam passados ​​para a add.summaryfunção. A add.summaryfunção tem um argumento psrf.targetcom um valor padrão de 1,05
David LeBauer