İş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.
- 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
- 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
- zincirleri bu noktadan zincirin sonuna kadar örnekleyin
- en otokorelasyonlu zincirin otokorelasyonunu kullanarak zinciri inceltin
- 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:
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)
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.
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)