Yanma uzunluğunu ayarlamak için MCMC yakınsama teşhisini yarı otomatik hale getirebilir miyim?


13

Bir MCMC zinciri için yanma seçimini otomatikleştirmek istiyorum, örneğin bir yakınsama teşhisine dayanan ilk n satırı kaldırarak.

Bu adım ne ölçüde güvenli bir şekilde otomatikleştirilebilir? Otokorelasyonu, mcmc izini ve pdfs'yi hala iki kez kontrol etsem bile, yanma uzunluğu seçiminin otomatik hale getirilmesi güzel olurdu.

Sorum genel, ama bir R mcmc.object ile başa çıkmak için detaylar sağlayabilirseniz harika olurdu; R'deki rjags ve coda paketlerini kullanıyorum.


orijinal soruya dahil edilmese de, cevabımda önerildiği gibi inceltme aralığını otomatik olarak ayarlamak da yararlı olacaktır.
David LeBauer

1
Sadece genel MCMC algoritmalarını yapmakla ilgilenen biri olarak birçok probleme kolayca uygulanabildiğinden bahsetmek istiyorum, bu konuyla çok ilgileniyorum.
John Salvatier

Yanıtlar:


6

İşte otomasyonda bir yaklaşım. Geri bildirim çok takdir edildi. Bu, standart uygulama ile uyumlu olarak ilk görsel muayeneyi hesaplama ve ardından gelen görsel muayenenin yerine koyma girişimidir.

Bu çözüm aslında iki potansiyel çözüm içerir, ilk olarak, bir eşik değere ulaşılmadan önce zincirin uzunluğunu gidermek için yanmayı hesaplayın ve sonra inceltme aralığını hesaplamak için otokorelasyon matrisini kullanın.

  1. tüm değişkenler için maksimum medyan Gelman-Rubin yakınsama tanı shrink faktörünün (grsf) bir vektörünü hesaplamak
  2. tüm değişkenlerdeki grsf'nin bir eşiğin altına düştüğü minimum örnek sayısını bulun, örneğin örnekte 1.1, belki de uygulamada daha düşük
  3. zincirleri bu noktadan zincirin sonuna kadar örnekleyin
  4. en otokorelasyonlu zincirin otokorelasyonunu kullanarak zinciri inceltin
  5. iz, otokorelasyon ve yoğunluk grafikleri ile yakınsamayı görsel olarak teyit edin

Mcmc nesnesi buradan indirilebilir: 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)

--Güncelleme--

R'de uygulandığı gibi, otokorelasyon matrisinin hesaplanması istenenden daha yavaştır (bazı durumlarda> 15 dakika), daha az ölçüde, GR büzülme faktörünün hesaplanması da öyle. Stackoverflow'da 4. adımı nasıl hızlandıracağınız hakkında bir soru var

- güncelleme bölüm 2--

ek cevaplar:

  1. Yakınsama teşhisi mümkün değildir, sadece yakınsama eksikliğini teşhis etmek mümkün değildir (Brooks, Giudici ve Philippe, 2003)

  2. Runjags paketindeki autorun.jags işlevi , çalışma uzunluğu ve yakınsama tanılamasının hesaplanmasını otomatikleştirir. Gelman rubin teşhisi 1.05'in altına düşene kadar zinciri izlemeye başlamaz; Raftery ve Lewis teşhisini kullanarak zincir uzunluğunu hesaplar.

  3. Gelman ve arkadaşları (Gelman 2004 Bayesian Veri Analizi, s. 295, Gelman ve Shirley, 2010 ) zincirin ilk yarısını atmaya yönelik muhafazakar bir yaklaşım kullandıklarını belirtmektedir. Nispeten basit bir çözüm olmasına rağmen, pratikte bu, belirli model ve veriler kümem için sorunu çözmek için yeterli.


#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
İki ilke geçerlidir: Zincirin sabit dağılıma yaklaşıp yaklaşmadığını asla bilemezsiniz. Ve el ile yapabileceğiniz herhangi bir yakınsama testi, otomatikleştirebilirsiniz. Yani yaklaşımınız yeterince sağlam görünüyor.
Tristan

Runjags belgelerinde görüyorum ki autorun.jags, modelin iade edilmeden önce otomatik olarak yakınsama ve yeterli örnek boyutu için değerlendirildiğini söylüyor . Bana, Autorun.jags'in Gelman rubin teşhisi 1.05'in altında olana kadar zinciri izlemeye başlamadığını bulduğunuz yere işaret edebilir misiniz? Teşekkür ederim
user1068430

@ user1068430 in autorun.jags, ...parametrelerin add.summaryişleve geçirilmesine izin verir . add.summaryFonksiyonu bir argümanı vardır psrf.target1.05 varsayılan bir değerle
David LeBauer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.