Translate

2019년 8월 4일 일요일

로지스틱 회귀 분석 (8)





  로지스틱 회귀 분석에서 모델이 적합하고 문제가 없는지 검증하기 위해 몇 가지 더 알아볼 내용들이 있습니다. 과대산포 (overdispersion)는 이름처럼 데이터 값의 분포가 넓게 퍼져 있어 로지스틱 혹은 포아송 회귀 모형이 제대로 값을 예측하지 못하는 상태를 의미합니다. 이 경우 95% 신뢰구간을 구해보면 상당히 넓게 퍼져 있어 (예를 들어 0.32 - 6.85 처럼) 사실상 추정한 OR 값이 별 의미가 없는 상황이 되어 버립니다. 모형에서 의미 있는 과대 산포가 존재하는지 확인하는 방법은 아래와 같습니다. 우선 피마 인디언 예제를 다시 보겠습니다. 


library(moonBook)
library(mlbench)

data(PimaIndiansDiabetes)
pima <- pimaindiansdiabetes="" span="">

pima<-subset pima="" pressure="">0)
pima<-subset mass="" pima="">0)
pima<-subset glucose="" pima="">0)

pima$obesity[pima$mass>=30]=2
pima$obesity[pima$mass<30 span="">
pima$obesity[pima$mass<25 span="">
table(pima$obesity)

out=glm(diabetes~factor(obesity)+pressure+glucose+age+pedigree,family=binomial,data=pima)
summary(out)
extractOR(out)

> summary(out)

Call:
glm(formula = diabetes ~ factor(obesity) + pressure + glucose + 
    age + pedigree, family = binomial, data = pima)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.8133  -0.7259  -0.3803   0.7219   2.5514  

Coefficients:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)      -8.223152   0.831018  -9.895  < 2e-16 ***
factor(obesity)1  1.225678   0.471464   2.600 0.009330 ** 
factor(obesity)2  2.174498   0.441818   4.922 8.58e-07 ***
pressure         -0.001569   0.008389  -0.187 0.851656    
glucose           0.034531   0.003597   9.600  < 2e-16 ***
age               0.032288   0.008562   3.771 0.000163 ***
pedigree          0.984527   0.305211   3.226 0.001257 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 931.94  on 723  degrees of freedom
Residual deviance: 676.98  on 717  degrees of freedom
AIC: 690.98

Number of Fisher Scoring iterations: 5

> extractOR(out)
                   OR  lcl   ucl      p
(Intercept)      0.00 0.00  0.00 0.0000
factor(obesity)1 3.41 1.35  8.58 0.0093
factor(obesity)2 8.80 3.70 20.91 0.0000
pressure         1.00 0.98  1.01 0.8517
glucose          1.04 1.03  1.04 0.0000
age              1.03 1.02  1.05 0.0002
pedigree         2.68 1.47  4.87 0.0013


 95% 신뢰 구간을 보면 그렇게 넓게 퍼진 것 같지는 않습니다. 아래 계산식에 넣어 과대 산포의 가능성을 확인하겠습니다. 

out.od<-glm age="" diabetes="" factor="" family="binomial,data=pima)</span" glucose="" obesity="" pedigree="" pressure="">
pchisq(summary(out.od)$dispersion * out$df.residual, out$df.residual, lower = F)




 여기에서 0.05 이하의 값이 나오면 유의한 과대 산포의 가능성이 있는 것으로 판정하지만, 여기서는 당연하게도 0.49라는 값이 나왔습니다. 따라서 OR 값은 어느 정도 신뢰할 수 있습니다. 한편 앞서 살펴본 다중공선성은 어떨까요. 




 이 역시 vif 기능으로 계산이 가능합니다. 

library(car)
vif(out)

> vif(out)
                    GVIF Df GVIF^(1/(2*Df))
factor(obesity) 1.061830  2        1.015111
pressure        1.145471  1        1.070267
glucose         1.031855  1        1.015803
age             1.141080  1        1.068213
pedigree        1.004344  1        1.002169


 변수간에 특별한 다중공선성이 있지 않은 것으로 나타났습니다. 그렇다면 모형 자체가 심각한 문제가 있는 건 아니라는 이야기입니다. 


 과대산포나 다중공선성 모두 모형이 믿을 수 있는지를 보여주는 지표입니다. 그 자체가 좋은 모델을 말해주지는 않지만, 무리한 결론을 내리는 것을 막아줄 수 있습니다. 


댓글 없음:

댓글 쓰기