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

Statistics/Bayesian Statistics

λ² μ΄μ§€μ•ˆ λ‘œμ§€μŠ€ν‹± νšŒκ·€(Bayesian logistic regression)

λ‹¨μˆœ λ‘œμ§€μŠ€ν‹± νšŒκ·€(Simple logistic regression) λͺ¨λΈμ€ λ‹€μŒκ³Ό κ°™λ‹€.

 

 

β–· κ°€λŠ₯λ„λŠ” λ² λ₯΄λˆ„이 λΆ„ν¬λ‘œ μ •ν•˜κ³ , κ°€λŠ₯도 λͺ¨μˆ˜μ˜ λ‘œμ§“(Logit)을 λ…λ¦½λ³€μˆ˜μ˜ μ„ ν˜•κ²°ν•©μœΌλ‘œ μ •μ˜ν•œλ‹€. μ΄λ•Œ, μœ„μ˜ μ‹μ—μ„œλŠ” ν•˜λ‚˜μ˜ λ…λ¦½λ³€μˆ˜μ— λŒ€ν•œ μ„ ν˜•κ²°ν•©μœΌλ‘œ ν‘œν˜„ν•˜μ˜€μ§€λ§Œ, λ…λ¦½λ³€μˆ˜κ°€ μ—¬λŸ¬κ°œμ΄λ©΄ 이 λ…λ¦½λ³€μˆ˜λ“€μ˜ μ„ ν˜•κ²°ν•©μ„ 톡해 λ‘œμ§“μ„ μ •μ˜ν•œλ‹€.

 

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

 

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

 

R의 boot νŒ¨ν‚€μ§€μ˜ urine 데이터λ₯Ό μ΄μš©ν•˜μ—¬ λ² μ΄μ§€μ•ˆ λ‘œμ§€μŠ€ν‹± νšŒκ·€ 뢄석을 μˆ˜ν–‰ν•  것이닀. μˆ˜ν–‰ 과정은 λ‹€μŒκ³Ό κ°™λ‹€.

 

1. 데이터 확인

2. λͺ¨λΈλ§

3. λͺ¨λΈ 확인

4. λͺ¨λΈ 예츑

 

1. 데이터 확인

 

In:

library(boot)

data('urine')

pairs(urine)

 

Out:

 

β–· λ²”μ£Όν˜• λ³€μˆ˜λŠ” r, μ΄μ™Έμ˜ 6개의 λ³€μˆ˜λŠ” μ—°μ†ν˜• λ³€μˆ˜λ‘œ 데이터가 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€.

 

β–· κ·Έλ¦Όμ—μ„œ λ³΄λ‹€μ‹œν”Ό λͺ‡ 개의 μ—°μ†ν˜• λ³€μˆ˜λŠ” κ°•ν•œ μ„ ν˜•κ΄€κ³„λ₯Ό λ‚˜νƒ€λ‚΄κ³  μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

 

2. λͺ¨λΈλ§

 

r을 μ’…μ†λ³€μˆ˜λ‘œ, μ΄μ™Έμ˜ λ³€μˆ˜λ₯Ό λ…λ¦½λ³€μˆ˜λ‘œ 두어 λ² μ΄μ§€μ•ˆ λ‘œμ§€μŠ€ν‹± νšŒκ·€ 뢄석을 ν•  것이닀. μœ„μ˜ 데이터λ₯Ό μ΄μš©ν•˜μ—¬ λͺ¨λΈμ„ ν•  경우, λ…λ¦½λ³€μˆ˜ κ°„μ˜ κ΄€κ³„λ‘œλΆ€ν„° 닀쀑곡선성(Multicollinearity)λ₯Ό μ˜ˆμƒν•  수 μžˆλ‹€. 닀쀑곡선성은 λͺ¨λΈλ§μ„ ν†΅ν•œ μ˜ˆμΈ‘λ§Œμ„ λ‹€λ£¨κ³ μž ν•œλ‹€λ©΄ 상관이 μ—†μ§€λ§Œ, λͺ¨λΈμ˜ κ²°κ³Όλ₯Ό ν†΅ν•œ 해석을 ν•˜κ³ μž ν•œλ‹€λ©΄ λ¬Έμ œκ°€ λ°œμƒν•˜κ²Œ λœλ‹€. μ™œλƒν•˜λ©΄ λ‹€μ€‘κ³΅μ„ μ„±μœΌλ‘œ μΈν•œ λΆˆμ•ˆμ •ν•œ(Unstable) μΆ”μ •μΉ˜λ₯Ό μ–»μ–΄, μ’…μ†λ³€μˆ˜μ™€μ˜ 관계에 λŒ€ν•œ 잘λͺ»λœ 결둠을 μ΄λŒμ–΄ λ‚Ό 수 있기 λ•Œλ¬Έμ΄λ‹€.

 

닀쀑곡선성 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λͺ¨μˆ˜μ˜ μ‚¬μ „λΆ„ν¬λ‘œ λΌν”ŒλΌμŠ€ 뢄포(Laplace distribution)λ₯Ό κ°€μ •ν•  것이닀. λΌν”ŒλΌμŠ€ λΆ„ν¬λŠ” 0인 지점을 μ„ ν˜Έ(Favor)ν•˜κΈ° λ•Œλ¬Έμ— λ³€μˆ˜ 선택이 κ°€λŠ₯ν•˜λ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

 

In:

library(rjags)

X = scale(data[, -1], center = T, scale = T)

mod_string = " model {
  for (i in 1:length(y)) {
    y[i] ~ dbern(p[i])
    logit(p[i]) = b0 + b[1]*gravity[i] + b[2]*ph[i] + b[3]*osmo[i] + b[4]*cond[i] + b[5]*urea[i] + b[6]*calc[i]
  }

  b0 ~ dnorm(0.0, 1.0/25.0)

  for (j in 1:6) {
    b[j] ~ ddexp(0.0, sqrt(2.0)) # has variance 1.0
  }
} "

data_jags = list(y = data$r, 
                 gravity = X[,'gravity'], 
                 ph = X[,'ph'], 
                 osmo = X[,'osmo'], 
                 cond = X[,'cond'], 
                 urea = X[,'urea'], 
                 calc = X[,'calc'])

params = c('b0', 'b')

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: 77
   Unobserved stochastic nodes: 7
   Total graph size: 1085

Initializing model

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

 

β–· κ°œλ³„ λͺ¨μˆ˜μ— λŒ€ν•˜μ—¬ 같은 사전뢄포λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•˜μ—¬ λ…λ¦½λ³€μˆ˜λ₯Ό ν‘œμ€€ν™”(Standardization)ν•˜μ˜€λ‹€.

 

β–· μ΄μ™Έμ˜ μ½”λ“œμ— λŒ€ν•œ λ‚΄μš©μ€ μƒλž΅ν•˜λ„λ‘ ν•˜κ² λ‹€. 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. λͺ¨λΈ 확인

 

마λ₯΄μ½”ν”„ 체인의 수렴 과정을 trace plot을 톡해 ν™•μΈν•˜μ—¬ 보자.

 

In:

plot(mod_sim)

 

Out:

 

β–· λͺ¨λ“  마λ₯΄μ½”ν”„ 체인이 μΆ”μ„Έ(Trend)λ₯Ό 보이지 μ•ŠμœΌλ©°, μˆ˜λ ΄ν•˜κ³  μžˆλŠ” 것을 확인할 수 μžˆλ‹€.

 

β–· b[1], b[4], b[6]의 λΆ„ν¬λŠ” 0μœΌλ‘œλΆ€ν„° λ²—μ–΄λ‚œ ν˜•νƒœλ₯Ό 보이고 있고, μ΄μ™Έμ˜ λͺ¨μˆ˜λŠ” 0μœΌλ‘œλΆ€ν„° 크게 λ²—μ–΄λ‚˜μ§€ λͺ»ν•œ 것을 확인할 수 μžˆλ‹€. λͺ¨μˆ˜μ˜ 뢄포가 0μœΌλ‘œλΆ€ν„° 크게 λ²—μ–΄λ‚˜μ§€ λͺ»ν–ˆλ‹€λŠ” μ˜λ―ΈλŠ” ν•΄λ‹Ή λͺ¨μˆ˜μ˜ λ³€μˆ˜κ°€ μ’…μ†λ³€μˆ˜μ— 크게 영ν–₯을 주지 μ•ŠλŠ” κ²ƒμœΌλ‘œ 해석할 수 μžˆλ‹€. λ”°λΌμ„œ μ΄λŸ¬ν•œ λ³€μˆ˜λ“€μ„ μ œμ™Έν•œ μƒˆλ‘œμš΄ λͺ¨λΈμ— λŒ€ν•΄ 생각해볼 수 μžˆλ‹€.

 

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

 

In:

gelman.diag(mod_sim)

 

Out:

Potential scale reduction factors:

     Point est. Upper C.I.
b[1]          1       1.00
b[2]          1       1.00
b[3]          1       1.01
b[4]          1       1.00
b[5]          1       1.00
b[6]          1       1.00
b0            1       1.00

Multivariate psrf

1

 

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

 

4. λͺ¨λΈ 예츑

 

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

 

In:

post_coef = colMeans(mod_comb_sim)
post_Xb = post_coef['b0'] + X %*% post_coef[-7]

phat = 1.0 / (1.0 + exp(-post_Xb))

plot(phat, jitter(data$r))

sum((data$r[phat >= 0.5] == 1), (data$r[phat < 0.5] == 0))/nrow(data)

 

Out:

[1] 0.8311688

 

β–· μ‹€μ œ κ²°κ³Όκ°€ 0인 경우의 phat은 0 κ·Όμ²˜μ— λͺ¨μ—¬μžˆκ³ , 1인 경우의 p hat은 1κ·Όμ²˜μ— λͺ¨μ—¬μžˆλŠ” 것을 확인할 수 μžˆλ‹€. λ”°λΌμ„œ λΆ„λ₯˜κ°€ μ–΄λŠ 정도 되고 μžˆμŒμ„ 확인할 수 μžˆλ‹€.

 

β–· 경계값을 0.5둜 두고 λΆ„λ₯˜ν•œ κ²°κ³Ό,  λΆ„λ₯˜μ˜ 정확도가 83%인 κ²ƒμœΌλ‘œ λ‚˜νƒ€λ‚¬λ‹€.

 

β–Ά 경계값을 μ–΄λ–»κ²Œ μ„€μ •ν•˜λŠλƒμ— 따라 λͺ¨λΈμ˜ 예츑 κ²°κ³Όκ°€ 달라진닀. λ”°λΌμ„œ λͺ¨λΈμ˜ 예츑 결과에 λ”°λ₯Έ μ„±λŠ₯ μ΅œμ ν™”λŠ” λ”°λ‘œ 닀루지 μ•Šκ² λ‹€.

 


 

Reference:

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