번인 길이를 설정하기 위해 MCMC 수렴 진단을 반 자동화 할 수 있습니까?


13

예를 들어 수렴 진단을 기반으로 첫 번째 n 행을 제거하여 MCMC 체인의 번인 선택을 자동화하고 싶습니다.

이 단계를 어느 정도 안전하게 자동화 할 수 있습니까? autocorrelation, mcmc trace 및 pdfs를 여전히 두 번 확인하더라도 번인 길이를 자동으로 선택하는 것이 좋습니다.

내 질문은 일반적이지만 R mcmc.object를 다루기 위해 구체적인 내용을 제공 할 수 있다면 좋을 것입니다. R에서 rjags 및 coda 패키지를 사용하고 있습니다.


원래 질문에 포함되어 있지는 않지만 내 대답에서 제안한대로 숱 간격을 자동으로 설정하는 것도 유용합니다.
David LeBauer

1
일반적인 MCMC 알고리즘을 만드는 데 관심이있는 사람이 많은 문제에 쉽게 적용 할 수 있기 때문에이 주제에 매우 관심이 있습니다.
John Salvatier

답변:


6

자동화에 대한 한 가지 접근법이 있습니다. 의견에 감사드립니다. 이는 표준 실습에 따라 초기 육안 검사를 계산으로 대체 한 후 후속 육안 검사를 대체하려는 시도입니다.

이 솔루션은 실제로 두 가지 잠재적 인 솔루션을 통합합니다. 먼저 일부 임계 값에 도달하기 전에 번인 (burn-in)을 계산하여 체인 길이를 제거한 다음 자기 상관 행렬을 사용하여 희석 간격을 계산합니다.

  1. 에있는 모든 변수에 대한 최대 중앙값 Gelman-Rubin 수렴 진단 수축 계수 (grsf)의 벡터를 계산합니다.
  2. 모든 변수에서 grsf가 임계 값 아래로 떨어지는 최소 샘플 수를 찾으십시오 (예 : 1.1, 아마도 실제로는 낮음)
  3. 이 지점에서 체인 끝까지 체인을 서브 샘플링
  4. 가장 관련성이 높은 체인의 자기 상관을 사용하여 체인을 얇게
  5. 미량, 자기 상관 및 밀도 플롯으로 수렴을 시각적으로 확인

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 부 업데이트

추가 답변 :

  1. 수렴을 진단 할 수 없으며 수렴 부족을 진단하기 만합니다 (Brooks, Giudici 및 Philippe, 2003)

  2. runjags 패키지의 autorun.jags 기능 은 실행 길이 및 수렴 진단 계산을 자동화합니다. Gelman 루빈 진단이 1.05 미만이 될 때까지 체인 모니터링을 시작하지 않습니다. Raftery 및 Lewis 진단을 사용하여 체인 길이를 계산합니다.

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

2
두 가지 원칙이 적용됩니다. 체인이 고정 분포로 수렴되었는지 알 수 없습니다. 수동으로 수행 할 수있는 수렴 테스트는 자동화 할 수 있습니다. 그래서 당신의 접근 방식은 충분히 들립니다.
Tristan

runjags 문서에서 autorun.jags는 모델이 반환되기 전에 수렴 및 적절한 샘플 크기에 대해 자동으로 평가 된다고 말합니다 . Gelman 루빈 진단이 1.05 미만이 될 때까지 autorun.jags가 체인 모니터링을 시작하지 않는다는 것을 알려 주실 수 있습니까? 감사합니다
user1068430

user1068430에서 @ autorun.jags의이 ...파라미터가 전달 될 수 있도록 add.summary기능. 이 add.summary함수에는 psrf.target기본값이 1.05 인 인수 가 있습니다.
David LeBauer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.