0Pricing
R Academy · 강의

MCMC 표본추출과 진단

표본추출을 실행하고 연쇄를 점검하며 Rhat과 ESS 진단 결과를 해석합니다.

MCMC 표본추출과 진단은(는) CoddyKit의 무료 R Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 R Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

MCMC란 무엇인가요?

마르코프 연쇄 몬테카를로(MCMC)는 직접 표본 추출이 불가능할 때 확률분포에서 표본을 추출하기 위한 알고리즘군입니다. 베이지안 통계에서는 사후분포 P(parameters | data)에서 표본을 추출합니다.

RStan은 최신 MCMC 알고리즘인 No-U-Turn Sampler(NUTS)를 구현합니다.

간단한 Stan 모델

Stan 모델은 데이터 유형, 매개변수, 로그 사후분포를 정의하는 텍스트 블록입니다. 가장 간단한 모델은 분산이 알려진 정규분포의 평균을 추정합니다.

# library(rstan)
#
# stan_code <- '
# data {
#   int<lower=0> N;
#   vector[N] y;
# }
# parameters {
#   real mu;
#   real<lower=0> sigma;
# }
# model {
#   mu    ~ normal(0, 10);   // prior
#   sigma ~ exponential(1);   // prior
#   y     ~ normal(mu, sigma); // likelihood
# }
# '

표본 추출을 위한 stan() 호출

stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000)은 모델을 한 번 컴파일한 다음 표본을 추출합니다. iter=2000이고 warmup=1000이면 각 연쇄에서 워밍업 후 표본 1000개가 생성되며, 4개 연쇄 전체에서는 총 4000개가 생성됩니다.

# library(rstan)
# options(mc.cores = parallel::detectCores())
#
# y <- c(2.1, 1.8, 2.4, 1.9, 2.3, 2.0, 1.7, 2.2)
# stan_data <- list(N = length(y), y = y)
#
# fit <- stan(
#   model_code = stan_code,
#   data       = stan_data,
#   chains     = 4,
#   iter       = 2000,
#   warmup     = 1000,
#   seed       = 42
# )

print(fit) — 요약 표

print(fit)은 각 매개변수에 대해 사후평균, 표준편차, 분위수, Rhat, n_eff가 포함된 요약 표를 표시합니다. 이 두 진단값을 가장 먼저 확인해야 합니다.

# print(fit)
#
# Example output:
#       mean se_mean   sd  2.5%   25%   50%   75%  97.5%  n_eff Rhat
# mu    2.05    0.00 0.15  1.76  1.95  2.05  2.15   2.34   3842    1
# sigma 0.22    0.00 0.06  0.13  0.18  0.21  0.25   0.37   3521    1
# lp__  4.38    0.02 1.01  1.60  3.91  4.71  5.18   5.50   2148    1

Rhat 수렴 기준

Rhat(잠재적 척도 축소 인자)은 연쇄 내부의 분산과 연쇄 간 분산을 비교합니다. 값이 1.0에 가까우면 모든 연쇄가 동일한 분포로 수렴했음을 의미합니다.

  • Rhat < 1.01 — 수렴함(현재 기준)
  • Rhat > 1.01 — 연쇄가 혼합되지 않음; 반복 횟수를 늘리세요
  • Rhat > 1.1 — 심각한 수렴 문제
# Check Rhat for all parameters:
# s <- summary(fit)$summary
# rhat_vals <- s[, 'Rhat']
# cat('Max Rhat:', max(rhat_vals, na.rm = TRUE), '
')
# if (any(rhat_vals > 1.01, na.rm = TRUE)) {
#   warning('Convergence issue detected!')
# } else {
#   cat('All Rhat < 1.01 — chains converged
')
# }

n_eff — 유효 표본 크기

n_eff(유효 표본 크기)은 연속된 MCMC 표본 사이의 자기상관을 고려합니다. 상관된 표본은 서로 독립인 표본보다 정보량이 적습니다.

  • n_eff가 전체 반복 횟수에 가까움 — 표본이 거의 독립적이며 매우 양호함
  • n_eff / total_samples > 0.1 — 일반적으로 허용 가능함
  • n_eff가 매우 낮음 — 자기상관이 높음; 모델을 재매개변수화하는 것을 고려하세요
# s <- summary(fit)$summary
# n_eff_vals <- s[, 'n_eff']
# total_samples <- 4 * 1000   # chains * post-warmup iter
# ratio <- n_eff_vals / total_samples
# cat('n_eff ratio (mu)   :', round(ratio['mu'], 2), '
')
# cat('n_eff ratio (sigma):', round(ratio['sigma'], 2), '
')

시각적 수렴 확인을 위한 traceplot()

traceplot(fit, pars = 'mu')는 각 연쇄에서 반복이 진행되는 동안 표본 추출된 mu 값을 도표로 표시합니다. 수렴한 연쇄는 모든 연쇄가 겹치고 추세나 이동이 없는 흐릿한 애벌레처럼 보입니다. 발산하는 연쇄는 이리저리 움직이거나 서로 분리된 상태로 남습니다.

# library(rstan)
#
# traceplot(fit, pars = c('mu', 'sigma'), inc_warmup = FALSE)
#
# Good traceplot characteristics:
# - All 4 chains overlapping completely (same range)
# - No visible drift or trend
# - Rapid mixing (values jump around quickly)
# - No flat regions (stuck sampler)
cat('A healthy traceplot looks like a fuzzy caterpillar
')

사후분포 상관관계를 위한 pairs()

pairs(fit, pars = c('mu', 'sigma'))는 사후분포 표본의 산점도 행렬을 표시합니다. 매개변수 사이의 상관관계를 보여 주고, 표본 추출기가 어려움을 겪는 영역을 나타내는 발산 전이(빨간색으로 표시)를 강조합니다.

# pairs(fit, pars = c('mu', 'sigma'))
#
# What to look for:
# - Elliptical clouds: mild correlation (OK)
# - Banana / funnel shapes: reparameterization needed
# - Red dots (divergences): geometry problem in posterior
#   => increase adapt_delta: stan(..., control=list(adapt_delta=0.95))
cat('Red dots in pairs() indicate divergent transitions — investigate!
')

사후분포 표본 추출하기

extract(fit, pars = 'mu')$mu는 mu에 대한 워밍업 후 표본 전체를 숫자 벡터로 반환합니다. 이 표본으로 평균, 신뢰구간, 특정 조건의 확률 등 원하는 사후분포 요약을 계산할 수 있습니다.

# mu_samples <- extract(fit, pars = 'mu')$mu
# cat('Posterior mean :', mean(mu_samples), '
')
# cat('95% CI:', quantile(mu_samples, c(0.025, 0.975)), '
')
# cat('P(mu > 2):', mean(mu_samples > 2), '
')
# hist(mu_samples, main = 'Posterior of mu', xlab = 'mu', col = 'steelblue')

대화형 진단을 위한 ShinyStan 실행

shinystan::launch_shinystan(fit)은 traceplot, 사후분포, pairs 도표, NUTS 진단을 한곳에서 제공하는 대화형 Shiny 앱을 엽니다. RStan 적합 결과를 탐색할 때 가장 종합적인 도구입니다.

# install.packages('shinystan')
# library(shinystan)
#
# shinystan::launch_shinystan(fit)
#
# ShinyStan tabs:
# - Diagnose: Rhat, n_eff, divergences, energy
# - Explore:  marginal posteriors, scatter plots
# - Model:    Stan code, data
# - NUTS:     step size, tree depth per chain

일반적인 수렴 문제 해결 방법

Rhat > 1.01이거나 발산이 보일 때는 다음을 시도하세요.

  • iter와 warmup을 늘립니다
  • control에서 adapt_delta를 1.0에 가깝게 높입니다(예: 0.95)
  • 재매개변수화합니다 — 계층 모델에는 비중심 매개변수화를 사용합니다
  • 사전분포가 너무 넓다면 더 강하게 설정합니다
  • 데이터를 확인합니다 — 이상치나 척도 차이가 표본 추출기 문제를 일으킵니다
# Re-run with higher adapt_delta to reduce divergences:
# fit2 <- stan(
#   model_code = stan_code,
#   data       = stan_data,
#   chains     = 4,
#   iter       = 4000,
#   warmup     = 2000,
#   control    = list(adapt_delta = 0.95, max_treedepth = 12),
#   seed       = 42
# )

빠른 확인: Rhat 임계값

Stan 모델이 수렴했음을 나타내는 Rhat의 현재 기준 임계값은 얼마인가요?

MCMC 표본 추출 및 진단 복습

RStan MCMC의 핵심 작업 흐름:

  • stan(model_code=..., data=..., chains=4, iter=2000, warmup=1000)으로 모델을 적합합니다
  • print(fit)으로 Rhat과 n_eff를 확인합니다 — 주요 수렴 진단값입니다
  • Rhat < 1.01 및 n_eff / total > 0.1이면 표본이 양호하게 동작함을 나타냅니다
  • traceplot() — 시각적 혼합 상태 확인; pairs() — 사후분포 기하 구조의 문제 확인
  • extract(fit, pars='mu')$mu — 원시 사후분포 표본에 접근합니다
  • shinystan::launch_shinystan(fit) — 종합적인 대화형 진단

자주 묻는 질문

“MCMC 표본추출과 진단” 강의는 무료인가요?

네 — “MCMC 표본추출과 진단” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 R Academy 강의 전체를 잠금 해제할 수 있습니다. R Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“MCMC 표본추출과 진단”에서 뭘 배우나요?

표본추출을 실행하고 연쇄를 점검하며 Rhat과 ESS 진단 결과를 해석합니다. 브라우저에서 직접 실행하는 실습 코드로 R Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

R Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 R Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“MCMC 표본추출과 진단” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 R Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 R Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 베이지안 사고 입문
  2. R에서 Stan 모델 작성하기
  3. MCMC 표본추출과 진단
  4. 사후예측검사
← R Academy(으)로 돌아가기