MCMC(Markov Chain Monte-Carlo)๋ฅผ ํตํด ์์ฑํ ๋ฐ์ดํฐ๋ฅผ ํ์ฉํ๊ธฐ ์ํด์๋ ๋ง๋ฅด์ฝํ ์ฒด์ธ(Markov Chain)์ด ์ ์์ํ(Stationary)์ ์๋ ด(Convergence)ํด์ผ ํ๋ค. ์ด๋ฅผ ํ์ธํ๊ณ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋ค๋ฃฐ ๊ฒ์ด๋ค.
1. Trace plot
2. ์๊ธฐ์๊ด์ฑ(Autocorrelation)
3. ์ด๊ธฐ ๋จ๊ณ(Burn-in period)
1. Trace plot
MCMC์ ์๋ ด์ ํ์ธํ๋ ๊ฐ์ฅ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ์ ์์ฑ ๊ณผ์ ์ ์ง์ ๊ทธ๋ฆผ์ผ๋ก ๋ํ๋ด๋ ๊ฒ์ด๋ค. ์ํํ์์ ๋ฐ๋ฅธ ์์ฑ๋ ๋ฐ์ดํฐ์ ๋ถํฌ๋ฅผ ํตํด ์ด๋ฅผ ํ์ธํ ์ ์๋ค.
In:
log_g <- function(mu, n, ybar) {
mu2 <- mu^2
return(n * (ybar * mu - mu2 / 2.0) - log(1.0 + mu2))
}
mh_sampl <- function(n_data, ybar, n_iter, mu_init, prop_sd) {
mu_out <- numeric(n_iter)
accpt_cnt <- 0
mu_now <- mu_init
log_g_now <- log_g(mu_now, n_data, ybar)
for (i in 1:n_iter) {
mu_cand <- rnorm(1, mu_now, prop_sd)
log_cand <- log_g(mu_cand, n_data, ybar)
log_alpha <- log_cand - log_g_now
alpha <- exp(log_alpha)
if (runif(1) < alpha) {
mu_now <- mu_cand
accpt_cnt <- accpt_cnt + 1
log_g_now <- log_cand
}
mu_out[i] <- mu_now
}
return(list(mu = mu_out, accpt_rate = accpt_cnt/n_iter))
}
y = c(-0.2, -1.5, -5.3, 0.3, -0.8, -2.2)
ybar = mean(y)
n = length(y)
library(coda)
post_sampl_1 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e3, mu_init = 0.0, prop_sd = 1.0)
traceplot(as.mcmc(post_sampl_1$mu))
post_sampl_2 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e3, mu_init = 0.0, prop_sd = 0.05)
traceplot(as.mcmc(post_sampl_2$mu))
post_sampl_3 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e4, mu_init = 0.0, prop_sd = 0.05)
traceplot(as.mcmc(post_sampl$mu_3))
Out:
โท ์์ ๊ทธ๋ฆผ์ MCMC์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ์ธ Metropolis-Hastings(์ดํ MH) ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ์ฌ ๋ํ๋ ๊ฒฐ๊ณผ์ด๋ค. ์ด ํฌ์คํ ์ ๋ชจ๋ ๊ทธ๋ฆผ๊ณผ ๋ถ์์ MH ์๊ณ ๋ฆฌ์ฆ์ ๊ฒฐ๊ณผ๋ก๋ถํฐ ๊ตฌํ์๋ค.
โท ์ฒซ ๋ฒ์งธ ๊ทธ๋ฆผ๋ฅผ ๋ณด๋ค์ํผ ์์ฑ๋ ๋ฐ์ดํฐ๊ฐ ์ ๊ท๋ถํฌ ํํ๋ฅผ ๋๋ฉฐ ์๋ ดํ๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด์ฒ๋ผ ์ถ์ธ(Trend)๊ฐ ๋ณด์ด์ง ์๊ณ , ํ๊ท ์ด ์ผ์ ํ ์ํ๋ฅผ ๋ํ๋ด๊ณ ์์ผ๋ฉด ๋ง๋ฅด์ฝํ ์ฒด์ธ์ด ์๋ ดํ๋ค๊ณ ๋ณผ ์ ์๋ค.
โท ๋ ๋ฒ์งธ ๊ทธ๋ฆผ์ ์ํํ์๊ฐ ์ฆ๊ฐํ ์๋ก ๊ฐ์ํ๋ ๊ฒฝํฅ์ ๋ณด์ด๊ณ ์์ผ๋ฉฐ, ํ๊ท ์ด ์ผ์ ํ์ง ์๋ค. ๋ฐ๋ผ์ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ด ์๋ ดํ๋ค๊ณ ๋ณผ ์ ์๋ค.
โท ์ธ ๋ฒ์งธ ๊ทธ๋ฆผ์ ๋ ๋ฒ์งธ ๊ทธ๋ฆผ์ ๋ฐ์ดํฐ ์์ฑ ์กฐ๊ฑด(์ ์๋ถํฌ์ ํ๊ท , ํ์คํธ์ฐจ)๊ณผ ๊ฐ๊ฒ ํ ๋ค, ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ๊ฒฐ๊ณผ์ด๋ค. ์ด๊ธฐ ์ํ์์๋ ๊ฐ์ํ๋ ๊ฒฝํฅ์ด ๋ํ๋์ง๋ง, 2000๋ฒ ์ํ ์ดํ๋ถํฐ ์ถ์ธ๊ฐ ๋ณด์ด์ง ์๊ณ , ํ๊ท ์ด ์ผ์ ํ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ด๋ ์ ์ ๋ถํฌ์ ํ์คํธ์ฐจ๊ฐ ๋ฎ์์ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ์๋ ด์๋๊ฐ ๋๋ ค์ก๊ธฐ ๋๋ฌธ์ ๋ํ๋ ๊ฒฐ๊ณผ์ด๋ค. ์ฆ, MH ์๊ณ ๋ฆฌ์ฆ์ ํตํ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ์๋ ด์๋๋ ์ ์ ๋ถํฌ์ ํ์คํธ์ฐจ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.
2. ์๊ธฐ์๊ด์ฑ
์๊ธฐ์๊ด์ฑ์ ๋ฐ์ดํฐ์ ํ์ฌ ์์ ๊ณผ ๊ณผ๊ฑฐ ์์ ์ ๋น๊ตํ์ฌ ์ผ๋ง๋ ์ ํ ์์กด(Linearly dependent)์ธ์ง๋ฅผ ๋ํ๋ด๋ ์งํ๋ก -1๊ณผ 1์ฌ์ด์ ๊ฐ์ผ๋ก ๋ํ๋๋ค. ์๋์ ๊ทธ๋ฆผ๋ฅผ ํตํด ์๊ธฐ์๊ด์ฑ์ ํ์ธํด๋ณด์.
In:
traceplot(as.mcmc(post_sampl_1$mu))
autocorr.plot(as.mcmc(post_sampl_1$mu))
traceplot(as.mcmc(post_sampl_2$mu))
autocorr.plot(as.mcmc(post_sampl_2$mu))
Out:
โท ์ฒซ ๋ฒ์งธ ์ค์ ๊ทธ๋ฆผ์ ์์ฐจ(Lag)๊ฐ 20์ธ ์ง์ ์์ ์๊ธฐ์๊ด์ฑ์ด ๊ฑฐ์ ๋ํ๋์ง ์์ง๋ง, ๋ ๋ฒ์งธ ์ค์ ๊ทธ๋ฆผ์์๋ ์์ฐจ๊ฐ 30์ธ ์ง์ ๊น์ง ์๊ธฐ์๊ด์ฑ์ด ๋๊ฒ ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. MCMC๋ก๋ถํฐ ์์ฑ๋ ๋ฐ์ดํฐ์ ์๊ธฐ์๊ด์ฑ์ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ง ์ ๋ณด๋์ผ๋ก ํด์ํ ์ ์๋ค. ๋ฐ๋ผ์ ์๊ธฐ์๊ด์ฑ์ด ๋ฎ์ ์ฒซ ๋ฒ์งธ ์ค์ ์์ฑ๋ ๋ฐ์ดํฐ๊ฐ ๋ ๋ฒ์งธ ์ค์ ๊ฒฝ์ฐ๋ณด๋ค ๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค๊ณ ๋ณผ ์ ์๋ค.
โถ ๋ฐ์ดํฐ์ ์๊ธฐ์๊ด์ฑ์ด ๋ํ๋์ง ์๋๋ค๋ ๊ฒ์ ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ด์ ์์ ์ ๋ฐ์ดํฐ์ ์ํฅ์ ๋ฐ์ง ์๋ ์๋ฏธ์ด๋ค. MCMC์ ํน์ฑ์ ๊ฐ ์์ ์ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ๋ค์ ์์ ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์๊ธฐ์๊ด๊ด๊ณ๊ฐ ๋ํ๋ ์ ๋ฐ์ ์๋ค. ๋ฐ๋ผ์ ์์ฑ๋ ๋ฐ์ดํฐ์ ESS(Effective Sample Size)๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ์๊ธฐ์๊ด์ฑ์ ์ ๊ฑฐํด์ผํ๋ค.
โถ ESS๋ MCMC๋ฅผ ํตํด ์์ฑ๋ ๋ฐ์ดํฐ ์ค ๋ ๋ฆฝ์ธ ๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ์๋ฏธํ๋ค.
๋ฐ์ดํฐ์ ์๊ธฐ์๊ด์ฑ์ ์ ๊ฑฐํ๊ณ ๋ชฉ์ ๋ถํฌ(Target distribution)์ ๋ํ ESS(Effective Sample Size)๋ฅผ ๊ตฌํ์ฌ๋ณด์.
In:
post_sampl_4 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e6, mu_init = 0.0, prop_sd = 0.05)
traceplot(as.mcmc(post_sampl_4$mu))
autocorr.plot(as.mcmc(post_sampl_4$mu), lag.max = 2500)
thin_intverval = 300
thin_idx = seq(from = thin_intverval,
to = length(as.mcmc(post_sampl_4$mu)),
by = thin_intverval)
traceplot(as.mcmc(post_sampl_4$mu[thin_idx]))
autocorr.plot(as.mcmc(post_sampl_4$mu[thin_idx]), lag.max = 750)
Out:
โท ์ฒซ ๋ฒ์งธ ์ค์ ๊ทธ๋ฆผ์ ํตํด ๋ง๋ฅด์ฝํ ์ฒด์ธ์ด ์๋ ดํ๋ ๊ฒ๊ณผ ์ํํ์๊ฐ 300์ธ ์ง์ ๋ถํฐ ์๊ธฐ์๊ด์ฑ์ด ์ค์ด๋ค์ด ๊ฑฐ์ ๋ํ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
โท ๋ ๋ฒ์งธ ์ค์ ๊ทธ๋ฆผ์ ์ฒซ ๋ฒ์งธ ์ค์ ์์ฑ๋ ๋ฐ์ดํฐ๋ก๋ถํฐ ์ํํ์๊ฐ 300๋จ์์ธ ์ง์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์๋ด์ด ์์ฑ๊ณผ์ ๊ณผ ์๊ธฐ์๊ด์ฑ์ ๋ํด ๊ทธ๋ฆผ์ ๊ทธ๋ฆฐ ๊ฒ์ด๋ค. ์ฒซ ๋ฒ์งธ ์ค์ ๊ทธ๋ฆผ๊ณผ๋ ๋ค๋ฅด๊ฒ ์๊ธฐ์๊ด์ฑ์ด ๋ํ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ์ฆ, ๊ฐ ๋ฐ์ดํฐ๊ฐ ์ด์ ์์ ์ ๋ฐ์ดํฐ์ ๋ ๋ฆฝ์ ์์ ์ ์ ์๋ค.
In:
length(thin_idx)
effectiveSize(post_sampl_4$mu)
Out:
[1] 3333
var1
3366.361
โท ์ถ์ถํ ๋ฐ์ดํฐ์ ๊ฐฏ์์ ESS๋ฅผ ๊ตฌํ๋ ํจ์์ธ effectiveSize()์ ๊ฒฐ๊ณผ๊ฐ ๋ค 3,300๋๋ก ๋น์ทํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
In:
raftery.diag(post_sampl_4$mu)
Out:
Quantile (q) = 0.025
Accuracy (r) = +/- 0.005
Probability (s) = 0.95
Burn-in Total Lower bound Dependence
(M) (N) (Nmin) factor (I)
390 435500 3746 116
โถ raftery.diag()๋ ์ถ์ ํ๊ณ ์ ํ๋ ์ถ์ ์น์ ํ์ํ ๋ฐ์ดํฐ์ ๊ฐฏ์์ ๋ํด Raftery and Lewis's diagnostic์ ํตํด ์๋ ค์ฃผ๋ ํจ์์ด๋ค.
โถ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ด ์๋ ดํ๊ธฐ๊น์ง ํ์ํ ์ํํ์๋ Burn-in, ์ถ์ ์ ํ์ํ ์ต์์ ๋ฐ์ดํฐ ๊ฐฏ์๋ Total, ์ถ์ ์ ํ์ํ ์๊ธฐ์๊ด์ฑ์ด 0์ธ ๋ฐ์ดํฐ์ ๊ฐฏ์๋ Lower bound๋ก ๋ํ๋ธ๋ค. Dependence factor๋ Burn-in๊ณผ Total์ ํฉ์ Lower bound๋ก ๋๋ ๊ฒ์ผ๋ก ์ผ๋ง๋ ๋ฐ์ดํฐ์ ์๊ธฐ์๊ด์ฑ์ด ๋์์ง๋ฅผ ์๋ฏธํ๋ค.
โท raftery.diag()๋ฅผ ์ด์ฉํ ๊ฒฐ๊ณผ, ์์ ์ถ์ ์น๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ์์ฑํด์ผํ๋ ์ต์ ๋ฐ์ดํฐ์ ์๋ 435,500๊ฐ์ธ ๊ฒ์ผ๋ก ๋ํ๋ฌ๊ณ , ์๊ธฐ์๊ด์ฑ์ด 0์ธ ๋ฐ์ดํฐ์ ์ ์ต์ 3,746๊ฐ๊ฐ ํ์ํ ๊ฒ์ผ๋ก ๋ํ๋ฌ๋ค.
3. ์ด๊ธฐ ๋จ๊ณ
trace plot์ ์ด์ฉํ์ฌ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ์๋ ด์ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด์๋ค. ํ์ง๋ง, ์ด๋ ์ ์ฑ์ ์ธ ๋ฐฉ๋ฒ์ด๊ธฐ์ ์ฃผ๊ด์ ์ผ ์ ์๋ค. ๋ฐ๋ผ์ ์ ๋์ ์ธ ๋ฐฉ๋ฒ์ด ์๊ตฌ๋๋๋ฐ, Gelman-Rubin diagostic์ ์ด์ฉํ์ฌ ์ ๋์ ์ผ๋ก ํ์ธํ ์ ์๋ค.
Gelman-Rubin diagostic์ ์ด์ฉํ์ฌ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ์๋ ด์ ํ์ธํ์ฌ๋ณด์.
In:
post_sampl_1 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e3, mu_init = 50, prop_sd = 0.5)
post_sampl_2 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e3, mu_init = 25, prop_sd = 1.0)
post_sampl_3 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e3, mu_init = -25, prop_sd = 0.5)
post_sampl_4 = mh_sampl(n_data = n, ybar = ybar, n_iter = 1e3, mu_init = -50, prop_sd = 1.0)
idx = 1:length(post_sampl_1$mu)
list_post = mcmc.list(as.mcmc(post_sampl_1$mu), as.mcmc(post_sampl_2$mu),
as.mcmc(post_sampl_3$mu), as.mcmc(post_sampl_4$mu))
traceplot(list_post)
gelman.diag(list_post)
Out:
Potential scale reduction factors:
Point est. Upper C.I.
[1,] 1.01 1.03
โท Gelman-Rubin diagostic์ ํตํด ์๋ ด์ ํ์ธํ๊ธฐ ์ํด์๋ ์๋ก ๋ค๋ฅธ ์ด๊ธฐ๊ฐ์ ๊ฐ์ง ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ๋ง๋ค์ด์ฃผ์ด์ผ ํ๋ค. ์ด๋ Gelman-Rubin diagostic์ ์ด๊ธฐ๊ฐ์ด ์๋ก ๋ค๋ฅธ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ๋ณ๋์ฑ(Variability)๋ฅผ ๋น๊ตํ์ฌ ๊ตฌํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์ด๊ธฐ๊ฐ์ด ๋ค๋ฅธ 4๊ฐ์ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ๋ง๋ค์๊ณ , ์์ ๊ทธ๋ฆผ์์ ์๋ ด ๊ณผ์ ์ ํ์ธํ ์ ์๋ค.
โท Gelman-Rubin diagostic์ 1์ ๊ฐ๊น์ธ ์๋ก ๋ชจ๋ ๋ง๋ฅด์ฝํผ ์ฒด์ธ์ด ์๋ ดํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋ฐ๋ผ์ Galman-Rubin diagostic์ ์ ์ถ์ ์น๊ฐ 1.01์ด๊ณ ์ ๋ขฐ์ํ์ด 1.03์ด๋ฏ๋ก, 4๊ฐ์ ๋ง๋ฅด์ฝํ ์ฒด์ธ์ ์๋ ดํ๋ค๊ณ ํ ์ ์๋ค.
In:
gelman.plot(list_post)
Out:
โท gelmen.plat()์ ํตํด ์ํํ์๊ฐ 500์ธ ์ง์ ๋ถํฐ 1์ ๊ฐ๊น์์ง์ ํ์ธํ ์ ์๋ค. ์ฆ, ์ํํ์๊ฐ 500์ธ ์ง์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฒ๋ฆฌ๊ณ , ๋๋จธ์ง ๋ฐ์ดํฐ๋ฅผ ๋ชฉ์ ํจ์๋ก๋ถํฐ ์์ฑ๋ ๋ฐ์ดํฐ๋ก ํ์ฉํ๋ฉด ๋๋ค.
Reference:
"Bayesian Statistics: From Concept to Data AnalysisTechniques and Models," Coursera, https://www.coursera.org/learn/bayesian-statistics/.
'Statistics > Bayesian Statistics' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
DIC(Deviance Information Criterion) (0) | 2020.08.18 |
---|---|
๋ฒ ์ด์ง์ ์ ํ ํ๊ท(Bayesian linear regression) (0) | 2020.08.17 |
๊น์ค ์ํ๋ง(Gibbs sampling) (0) | 2020.08.14 |
JAGS(Just Another Gibbs Sampler) ์ฌ์ฉ๋ฒ (0) | 2020.08.11 |
๋ฉํธ๋กํด๋ฆฌ์ค ํค์ด์คํ ์ค ์๊ณ ๋ฆฌ์ฆ(Metropolis-Hastings algorithm) (1) | 2020.08.11 |