Tôi có thể tự động hóa chẩn đoán hội tụ MCMC để thiết lập độ dài ghi?


13

Tôi muốn tự động hóa lựa chọn burn-in cho chuỗi MCMC, ví dụ: bằng cách xóa n hàng đầu tiên dựa trên chẩn đoán hội tụ.

Đến mức nào thì bước này có thể được tự động hóa một cách an toàn? Ngay cả khi tôi vẫn kiểm tra kỹ lưỡng tự động, theo dõi mcmc và pdf, thì thật tuyệt khi có sự lựa chọn độ dài tự động.

Câu hỏi của tôi là chung chung, nhưng sẽ rất tuyệt nếu bạn có thể cung cấp chi tiết cụ thể để xử lý R mcmc.object; Tôi đang sử dụng các gói rjags và coda trong R.


mặc dù không được bao gồm trong câu hỏi ban đầu, nhưng cũng sẽ hữu ích khi tự động đặt khoảng thời gian pha loãng như đề xuất trong câu trả lời của tôi.
David LeBauer

1
Tôi chỉ muốn đề cập rằng là một người quan tâm đến việc tạo ra các thuật toán MCMC chung, dễ dàng áp dụng cho nhiều vấn đề, tôi rất quan tâm đến chủ đề này.
John Salvatier

Câu trả lời:


6

Đâ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.

  1. 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
  2. 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ế
  3. mẫu phụ các chuỗi từ điểm này đến cuối chuỗi
  4. 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
  5. 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:

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

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

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

2
Hai nguyên tắc được áp dụng: Bạn không bao giờ có thể biết liệu chuỗi của mình có hội tụ vào phân phối cố định hay không. Và bất kỳ bài kiểm tra nào để hội tụ bạn có thể làm thủ công, bạn có thể tự động hóa. Vì vậy, cách tiếp cận của bạn có vẻ đủ âm thanh.
Tristan

Trong tài liệu runjags tôi thấy rằng autorun.jags nói Mô hình được tự động đánh giá về độ hội tụ và kích thước mẫu phù hợp trước khi được trả về. Bạn có thể chỉ cho tôi nơi bạn thấy rằng autorun.jags không bắt đầu theo dõi chuỗi cho đến khi chẩn đoán rubin Gelman dưới 1,05 không? Cảm ơn bạn
dùng1068430

@ user1068430 autorun.jags, các ...tham số cho phép được truyền cho add.summaryhàm. Các add.summarychức năng có một cuộc tranh cãi psrf.targetvới một giá trị mặc định là 1,05
David LeBauer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.