Gibbs Sampler
๊ธฐ๋ณธ ์๋ฆฌ
(์ถํ ์
๋ฐ์ดํธ)
์์
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
## Data load
data = dget('https://www2.stat.duke.edu/~pdh10/FCBS/Inline/yX.o2uptake')
y = data[,1]
X = data[,-1]
inv = solve
## set prior
g = length(y)
nu0 = 1
s20 = summary(lm(y~-1+X))$sigma^2
n = length(y)
p = ncol(X)
## setup
S = 1000
set.seed(2021)
BETA = matrix(NA, nrow=S, ncol=p)
sigma2 = matrix(NA, nrow=S, ncol=1)
BETA[1,] = inv(t(X) %*% X) %*% t(X) %*% y
sigma2[1,] = s20
## gibbs sampling
nun = nu0 + n
betan = (g/(g+1)) * inv(t(X) %*% X) %*% t(X) %*% y
for(s in 2:S){
s2n = nu0*s20 + t(y-X%*%BETA[s-1,]) %*% (y-X%*%BETA[s-1,])
sigma2[s,] = 1/rgamma(1, shape=nun/2, rate=s2n/2)
Sigman = (g/(g+1)) * sigma2[s,] * inv(t(X) %*% X)
BETA[s,] = MASS::mvrnorm(n=1, betan, Sigman)
}
## graph
colnames(BETA) = colnames(X)
gather(as.data.frame(BETA)) %>%
ggplot(aes(y=value, fill=key)) + geom_histogram() +
coord_flip() + facet_wrap(~key, scales='free_x') +
ggtitle('Posterior samples of Beta') +
theme(legend.position = 'None')
|
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

์ข
๋ฅ
1. Systematic Sweep Gibbs Sampler
๋ชจ๋ ๋ชจ์์ ๋ํด ์ํ๋ง์ ๋ฐ๋ณตํ์ฌ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ
2. Random Sweep Gibbs Sampler
๋ฌด์์๋ก ๋ชจ์๋ฅผ ๋ฝ์์ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ
3. Grouped Gibbs Sampler
์ฌ๋ฌ ๊ฐ์ ๋ชจ์๋ฅผ ํ๋ฒ์ ๋ฝ์์ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ
์ด๋ ๋ชจ์ ๊ฐ์ ์ฐ๊ด์ฑ์ด ์๊ธด๋ค.
4. Collapsed Gibbs Sampler
์ ๋ถ์ ํตํด์ ํน์ ๋ชจ์์ ๋
๋ฆฝ์ ์ธ ๋ถํฌ๋ฅผ ๊ณ์ฐํ ํ, ์ํ๋งํ์ฌ ์
๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ
์ฐธ๊ณ ์ฌ์ดํธ
[1] https://niceguy1575.tistory.com/entry/%EB%B2%A0%EC%9D%B4%EC%A7%80%EC%95%88-%ED%86%B5%EA%B3%84%ED%95%99-4-Gibbs-Sampler%EA%B9%81%EC%8A%A4-%EC%83%98%ED%94%8C%EB%9F%AC-%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EC%84%B1%EC%A7%88