λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Statistics/Bayesian Statistics

λ² μ΄μ§€μ•ˆ 포아솑 νšŒκ·€(Bayesian poisson regression)

λ‹¨μˆœ 포아솑 νšŒκ·€(Simple poisson regression) λͺ¨λΈμ€ λ‹€μŒκ³Ό κ°™λ‹€.

 

 

β–· κ°€λŠ₯λ„λŠ” 포아솑 λΆ„ν¬λ‘œ μ •ν•˜κ³ , κ°€λŠ₯도 λͺ¨μˆ˜μ˜ 둜그λ₯Ό μ·¨ν•œ 것에 λŒ€ν•˜μ—¬ λ…λ¦½λ³€μˆ˜μ˜ μ„ ν˜•κ²°ν•©μœΌλ‘œ μ •μ˜ν•œλ‹€. μ΄λ•Œ, μœ„μ˜ μ‹μ—μ„œλŠ” ν•˜λ‚˜μ˜ λ…λ¦½λ³€μˆ˜μ— λŒ€ν•œ μ„ ν˜•κ²°ν•©μœΌλ‘œ ν‘œν˜„ν•˜μ˜€μ§€λ§Œ, λ…λ¦½λ³€μˆ˜κ°€ μ—¬λŸ¬κ°œμ΄λ©΄ 이 λ…λ¦½λ³€μˆ˜λ“€μ˜ μ„ ν˜•κ²°ν•©μ„ 톡해 κ°€λŠ₯도 λͺ¨μˆ˜μ˜ 둜그λ₯Ό μ·¨ν•œ 값에 λŒ€ν•˜μ—¬ μ •μ˜ν•œλ‹€.

 

β–· 포아솑 νšŒκ·€ λͺ¨λΈμ˜ μ˜ˆμΈ‘μ€ κ°œλ³„ λ°μ΄ν„°μ˜ κ°€λŠ₯λ„μ˜ 평균, 즉, κ°€λŠ₯λ„μ˜ λͺ¨μˆ˜λ₯Ό 톡해 이루어진닀.

 

β–· λ² μ΄μ§€μ•ˆ 포아솑 νšŒκ·€(Bayesian poisson regression)λŠ” λ…λ¦½λ³€μˆ˜μ™€ μ„ ν˜•κ²°ν•©λœ λͺ¨μˆ˜ beta의 사전뢄포λ₯Ό μ •μ˜ν•œλ‹€λŠ” μ μ—μ„œ 포아솑 νšŒκ·€μ™€ 차이가 μžˆλ‹€.

 

R의 COUNT νŒ¨ν‚€μ§€μ˜ badhealth 데이터λ₯Ό μ΄μš©ν•˜μ—¬ λ² μ΄μ§€μ•ˆ 포아솑 νšŒκ·€ 뢄석을 μˆ˜ν–‰ν•  것이닀. μˆ˜ν–‰ 과정은 λ‹€μŒκ³Ό κ°™λ‹€.

 

1. 데이터 확인

2. λͺ¨λΈλ§

3. λͺ¨λΈ 확인

4. λͺ¨λΈ 예츑 및 뢄석

 

1. 데이터 확인

 

In:

library(COUNT)

data('badhealth')

pairs(badhealth)

 

Out:

 

β–· numvisitκ³Ό ageλŠ” μ—°μ†ν˜• λ³€μˆ˜, badhλŠ” λ²”μ£Όν˜• λ³€μˆ˜λ‘œ 데이터가 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

 

2. λͺ¨λΈλ§

 

numvisit을 μ’…μ†λ³€μˆ˜λ‘œ, age와 badhλ₯Ό λ…λ¦½λ³€μˆ˜λ‘œ 두어 λ² μ΄μ§€μ•ˆ 포아솑 νšŒκ·€ 뢄석을 ν•  것이닀.

 

In:

library(rjags)

mod_string = " model {
    for (i in 1:length(numvisit)) {
        numvisit[i] ~ dpois(lam[i])
        log(lam[i]) = b0 + b_badh*badh[i] + b_age*age[i] + b_badh_age*age[i]*badh[i]
    }
    
    b0 ~ dnorm(0.0, 1.0/1e6)
    b_badh ~ dnorm(0.0, 1.0/1e4)
    b_age ~ dnorm(0.0, 1.0/1e4)
    b_badh_age ~ dnorm(0.0, 1.0/1e4)
} "

data_jags = as.list(badhealth)

params = c('b0', 'b_badh', 'b_age', 'b_badh_age')

mod = jags.model(textConnection(mod_string), 
                 data = data_jags, 
                 n.chains = 3)

update(mod, 1e3)

mod_sim = coda.samples(model = mod,
                       variable.names = params,
                       n.iter = 5e3)
mod_comb_sim = as.mcmc(do.call(rbind, mod_sim))

 

Out:

Compiling model graph
   Resolving undeclared variables
   Allocating nodes
Graph information:
   Observed stochastic nodes: 1127
   Unobserved stochastic nodes: 4
   Total graph size: 3665

Initializing model

  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100%
  |**************************************************| 100%
  |**************************************************| 100%

 

β–· λ…λ¦½λ³€μˆ˜λ‘œμ¨ b_badh와 b_age의 κ΅ν˜Έμž‘μš©μ„ κ³ λ €ν•˜μ—¬ ꡐ차항을 μΆ”κ°€ν•˜μ˜€λ‹€.

 

β–· μ΄μ™Έμ˜ μ½”λ“œμ— λŒ€ν•œ λ‚΄μš©μ€ μƒλž΅ν•˜λ„λ‘ ν•˜κ² λ‹€. JAGS의 μ‚¬μš©λ²•μ— λŒ€ν•΄ μ•Œμ•„λ³΄κ³ μž ν•œλ‹€λ©΄, λ‹€μŒμ˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•˜κΈΈ λ°”λž€λ‹€.

 

 

JAGS(Just Another Gibbs Sampler) μ‚¬μš©λ²•

R의 JAGS(Just Another Gibbs Sampler)의 μ‚¬μš©λ²•μ— λŒ€ν•΄ μ•Œμ•„λ³Ό 것이닀. JAGSλ₯Ό ν†΅ν•œ 데이터 생성 과정은 4λ‹¨κ³„λ‘œ λ‚˜λˆŒ 수 μžˆλ‹€. 1. Specify the model 2. Set up the model 3. Run the MCMC(Markov Chain Monte C..

rooney-song.tistory.com

 

3. λͺ¨λΈ 확인

 

Gelman-Rubin diagostic을 톡해 마λ₯΄μ½”ν”„ 체인이 μˆ˜λ ΄ν•˜μ˜€λŠ”μ§€ ν™•μΈν•˜μ—¬ 보자.

 

In:

gelman.diag(mod_sim)

 

Out:

Potential scale reduction factors:

           Point est. Upper C.I.
b0               1.02       1.03
b_age            1.01       1.03
b_badh           1.01       1.02
b_badh_age       1.01       1.02

Multivariate psrf

1.01

 

β–· λͺ¨λ“  λͺ¨μˆ˜μ˜ κ²°κ³Όκ°€ 1둜 μˆ˜λ ΄ν•˜κ³  μžˆλ‹€λŠ” 것을 확인할 수 μžˆλ‹€.

 

4. λͺ¨λΈ 예츑 및 뢄석

 

μœ„μ˜ λͺ¨λΈμ„ 톡해 μ˜ˆμΈ‘μ„ ν•˜κ³ , μ‹€μ œ 결과와 λΉ„κ΅ν•΄λ³΄μž.

 

In:

X = as.matrix(badhealth[, -1])
X = cbind(X, with(badhealth, badh*age))

post_coef = apply(mod_comb_sim, 2, median)

log_lam_hat = post_coef['b0'] + X %*% post_coef[c('b_badh', 'b_age', 'b_badh_age')]
lam_hat = exp(log_lam_hat)

plot(lam_hat, badhealth$numvisit)

 

Out:

 

β–· λͺ¨λΈμ˜ μ˜ˆμΈ‘κ²°κ³Όκ°€ λ°μ΄ν„°μ˜ 변동을 잘 μ„€λͺ…ν•˜μ§€ λͺ»ν•˜λŠ” 것을 확인할 수 μžˆλ‹€. ν•˜μ§€λ§Œ lamda hat이 증가할 수둝 μ‹€μ œ 결과도 μ–΄λŠ 정도 μ¦κ°€ν•˜λŠ” 것을 확인할 수 μžˆλ‹€.

 

β–· 포아솑 λΆ„ν¬μ˜ νŠΉμ„±μœΌλ‘œ 평균과 뢄산이 λͺ¨μˆ˜λ‘œ ν‘œν˜„λœλ‹€. 즉, μ˜ˆμΈ‘κ°’μΈ 평균이 크면 클수둝 뢄산도 μ¦κ°€ν•˜κ²Œ 되고, μœ„μ˜ κ²°κ³Όμ—μ„œλ„ μ΄λŸ¬ν•œ νŠΉμ„±μ„ 확인할 수 μžˆλ‹€.

 

β–Ά μœ„μ˜ κ²½μš°μ™€ 같이 포아솑 νšŒκ·€κ°€ λ°μ΄ν„°μ˜ 변동을 잘 μ„€λͺ…ν•˜μ§€ λͺ»ν•  λ•Œ, λŒ€μ•ˆμœΌλ‘œ μŒμ΄ν•­ νšŒκ·€λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.

 

λͺ¨λΈμ˜ 결과에 λŒ€ν•˜μ—¬ λΆ„μ„ν•˜μ—¬λ³΄μž.

 

In:

summary(mod_sim)

 

Out:

Iterations = 2001:7000
Thinning interval = 1 
Number of chains = 3 
Sample size per chain = 5000 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

                Mean       SD  Naive SE Time-series SE
b0          0.340722 0.082551 6.740e-04      0.0054368
b_age       0.008652 0.002115 1.727e-05      0.0001386
b_badh      1.566322 0.177987 1.453e-03      0.0127482
b_badh_age -0.010900 0.004126 3.369e-05      0.0003004

2. Quantiles for each variable:

                2.5%       25%       50%      75%     97.5%
b0          0.178886  0.283849  0.340609  0.39707  0.498929
b_age       0.004571  0.007236  0.008664  0.01009  0.012775
b_badh      1.209814  1.445276  1.567056  1.68999  1.904278
b_badh_age -0.018683 -0.013763 -0.010927 -0.00807 -0.002601

 

β–· b_age와 b_badh의 μΆ”μ •μΉ˜μ˜ 평균과 λ°±λΆ„μœ„μˆ˜ λͺ¨λ‘ μ–‘μ˜ 값인 것을 확인할 수 μžˆλ‹€. μ΄λŠ” numvisit의 평균과 이듀 λ³€μˆ˜κ°„μ˜ 관계가 μ–‘μ˜ 관계λ₯Ό λ‚˜νƒ€λ‚Έλ‹€κ³  λ³Ό 수 μžˆλ‹€. 즉, b_ageμ΄λ‚˜ b_badhκ°€ μ¦κ°€ν•œλ‹€λ©΄ ν‰κ· μ μœΌλ‘œ numvisit도 μ¦κ°€ν•œλ‹€κ³  해석할 수 μžˆλ‹€.

 

β–· b_age와 b_badh의 ꡐ차항은 음수인 κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬λ‹€. μ΄λŠ” b_age와 b_badh에 λŒ€ν•œ λ³΄μ •κ°’μœΌλ‘œ 해석할 수 μžˆλ‹€.

 

X1(age: 35, badh: 0)κ³Ό X2(age: 35, badh: 1)의 사후 예츑 뢄포λ₯Ό κ΅¬ν•˜κ³ , λ‘˜μ„ λΉ„κ΅ν•˜μ—¬ 보자.

 

In:

x_1 = c(0, 35, 0)
x_2 = c(1, 35, 35)

log_lam_1 = mod_comb_sim[, 'b0'] + mod_comb_sim[, c('b_badh', 'b_age', 'b_badh_age')] %*% x_1
log_lam_2 = mod_comb_sim[, 'b0'] + mod_comb_sim[, c('b_badh', 'b_age', 'b_badh_age')] %*% x_2

lam_1 = exp(log_lam_1)
lam_2 = exp(log_lam_2)

n_sim = length(log_lam_1)

y_1 = rpois(n = n_sim, lambda = lam_1)
y_2 = rpois(n = n_sim, lambda = lam_2)

plot(table(factor(y_1, levels = 0:18))/n_sim, pch = 2, ylab = 'Posterior Prob.', xlab = 'Num. of Visits')
points(table(y_2 + 0.1)/n_sim, col = 'red')

 

Out:

 

β–· κ²€μ •μƒ‰μ˜ λΆ„ν¬λŠ” X1, λΉ¨κ°•μƒ‰μ˜ λΆ„ν¬λŠ” X2의 μ‚¬ν›„μ˜ˆμΈ‘λΆ„ν¬λ₯Ό μ˜λ―Έν•œλ‹€. 두 μ‚¬ν›„μ˜ˆμΈ‘λΆ„ν¬μ—μ„œ λ³΄λ‹€μ‹œν”Ό X2의 μ‚¬ν›„μ˜ˆμΈ‘ν‰κ· μ΄ X1의 μ‚¬ν›„μ˜ˆμΈ‘ν‰κ· λ³΄λ‹€ 큰 것을 μ•Œ 수 μžˆλ‹€.

 

X2의 numvisit이 X1의 numvisit보닀 클 ν™•λ₯ μ„ κ΅¬ν•˜μ—¬ 보자.

 

In:

mean(y_2 > y_1)

 

Out:

[1] 0.9157333

 

β–· μ‚¬ν›„μ˜ˆμΈ‘λΆ„ν¬λ‘œλΆ€ν„° X2의 numvisit이 X1의 numvisit보닀 클 ν™•λ₯ μ€ μ•½ 91%인 κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬λ‹€.

 


Reference:

"Bayesian Statistics: From Concept to Data AnalysisTechniques and Models," Coursera, https://www.coursera.org/learn/bayesian-statistics/.