자동화에 대한 한 가지 접근법이 있습니다. 의견에 감사드립니다. 이는 표준 실습에 따라 초기 육안 검사를 계산으로 대체 한 후 후속 육안 검사를 대체하려는 시도입니다.
이 솔루션은 실제로 두 가지 잠재적 인 솔루션을 통합합니다. 먼저 일부 임계 값에 도달하기 전에 번인 (burn-in)을 계산하여 체인 길이를 제거한 다음 자기 상관 행렬을 사용하여 희석 간격을 계산합니다.
- 에있는 모든 변수에 대한 최대 중앙값 Gelman-Rubin 수렴 진단 수축 계수 (grsf)의 벡터를 계산합니다.
- 모든 변수에서 grsf가 임계 값 아래로 떨어지는 최소 샘플 수를 찾으십시오 (예 : 1.1, 아마도 실제로는 낮음)
- 이 지점에서 체인 끝까지 체인을 서브 샘플링
- 가장 관련성이 높은 체인의 자기 상관을 사용하여 체인을 얇게
- 미량, 자기 상관 및 밀도 플롯으로 수렴을 시각적으로 확인
MCMC 객체는 여기에서 다운로드 할 수 있습니다 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)
--최신 정보--
R에서 구현 된 바와 같이, 자기 상관 매트릭스의 계산은 바람직한 것보다 느리며 (일부 경우> 15 분), GR 수축 계수의 계산도 느리다. stackoverflow 에서 4 단계 속도를 높이는 방법에 대한 질문이 있습니다.
--2 부 업데이트
추가 답변 :
수렴을 진단 할 수 없으며 수렴 부족을 진단하기 만합니다 (Brooks, Giudici 및 Philippe, 2003)
runjags 패키지의 autorun.jags 기능 은 실행 길이 및 수렴 진단 계산을 자동화합니다. Gelman 루빈 진단이 1.05 미만이 될 때까지 체인 모니터링을 시작하지 않습니다. Raftery 및 Lewis 진단을 사용하여 체인 길이를 계산합니다.
Gelman 등 (Gelman 2004 Bayesian Data Analysis, p. 295, Gelman and Shirley, 2010 )은 체인의 전반부를 버리는 보수적 인 접근 방법을 사용한다고 밝혔습니다. 비교적 간단한 솔루션이지만 실제로 이것은 특정 모델 및 데이터 세트의 문제를 해결하기에 충분합니다.
#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)