Đây là một cách tiếp cận tại tự động hóa. Phản hồi đánh giá cao. Đây là một nỗ lực để thay thế kiểm tra trực quan ban đầu bằng tính toán, tiếp theo là kiểm tra trực quan tiếp theo, phù hợp với thực tiễn tiêu chuẩn.
Giải pháp này thực sự kết hợp hai giải pháp tiềm năng, đầu tiên, tính toán burn-in để loại bỏ độ dài của chuỗi trước khi đạt đến ngưỡng nào đó, sau đó sử dụng ma trận tự tương quan để tính khoảng thời gian pha loãng.
- tính toán một vectơ của hệ số thu nhỏ chẩn đoán hội tụ tối đa Gelman-Rubin (grsf) cho tất cả các biến trong
- tìm số lượng mẫu tối thiểu mà tại đó grsf trên tất cả các biến nằm dưới ngưỡng nào đó, ví dụ 1.1 trong ví dụ, có lẽ thấp hơn trong thực tế
- mẫu phụ các chuỗi từ điểm này đến cuối chuỗi
- làm mỏng chuỗi bằng cách sử dụng tự tương quan của chuỗi tự tương quan nhất
- trực quan xác nhận sự hội tụ với dấu vết, tự động tương quan và các ô mật độ
Đối tượng mcmc có thể được tải xuống ở đây: 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)
- cập nhật--
Như được thực hiện trong R, việc tính toán ma trận tự tương quan chậm hơn mong muốn (> 15 phút trong một số trường hợp), ở mức độ thấp hơn, tính toán của hệ số co GR cũng vậy. Có một câu hỏi về cách tăng tốc bước 4 trên stackoverflow tại đây
- cập nhật phần 2--
câu trả lời bổ sung:
Không thể chẩn đoán hội tụ, chỉ chẩn đoán thiếu hội tụ (Brooks, Giudici và Philippe, 2003)
Hàm autorun.jags từ gói runjags tự động hóa tính toán chẩn đoán độ dài và hội tụ. Nó không bắt đầu theo dõi chuỗi cho đến khi chẩn đoán rubin Gelman dưới 1,05; nó tính toán độ dài chuỗi bằng cách sử dụng chẩn đoán Raftery và Lewis.
Gelman và cộng sự (Phân tích dữ liệu Bayesian Gelman 2004, trang 295, Gelman và Shirley, 2010 ) nói rằng họ sử dụng một phương pháp bảo thủ để loại bỏ nửa đầu của chuỗi. Mặc dù là một giải pháp tương đối đơn giản, nhưng trong thực tế, điều này là đủ để giải quyết vấn đề cho bộ mô hình và dữ liệu cụ thể của tôi.
#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)