로지스틱 회귀 모형에서 모형의 성능과 예측력을 비교하는데 흔히 사용되는 것이 receiver operating characteristic curve 혹은 ROC curve 입니다. 이 커브 아래의 면적인 AUC (Area under the curve)이 1에 가까울수록 로지스틱 회귀 모형이 정확히 분류를 한 것으로 해석할 수 있습니다. 자세한 설명은 아래 위키피디아 문서 및 검색을 통해 쉽게 찾을 수 있을 것이고 이미 통계 공부를 하셨다면 원리는 다 알고 있으실 것으로 생각합니다. 여기서는 R 코드로 구현하고 비교하는 방법을 알아보겠습니다.
우선 피마 인디언 데이터로 혈압, BMI, 그리고 공복 혈당의 ROC/AUC 분석을 해보겠습니다. 패키지는 pROC 를 사용하는데 가장 널리 사용되는 R 패키지 가운데 하나입니다. 기본 문법은 roc(결과변수, 독립변수..) 입니다.
library(pROC)
library(mlbench)
data(PimaIndiansDiabetes)
pima <- pimaindiansdiabetes="" span="">->
pima<-subset pima="" pressure="">0)-subset>
pima<-subset mass="" pima="">0)-subset>
pima<-subset glucose="" pima="">0)-subset>
pressure=roc(pima$diabetes, pima$pressure, ci=TRUE)
mass=roc(pima$diabetes, pima$mass, ci=TRUE)
glucose=roc(pima$diabetes, pima$glucose, ci=TRUE)
pressure
mass
glucose
> pressure
Call:
roc.default(response = pima$diabetes, predictor = pima$pressure, ci = TRUE)
Data: pima$pressure in 475 controls (pima$diabetes neg) < 249 cases (pima$diabetes pos).
Area under the curve: 0.6056
95% CI: 0.5629-0.6483 (DeLong)
> mass
Call:
roc.default(response = pima$diabetes, predictor = pima$mass, ci = TRUE)
Data: pima$mass in 475 controls (pima$diabetes neg) < 249 cases (pima$diabetes pos).
Area under the curve: 0.6794
95% CI: 0.6405-0.7183 (DeLong)
> glucose
Call:
roc.default(response = pima$diabetes, predictor = pima$glucose, ci = TRUE)
Data: pima$glucose in 475 controls (pima$diabetes neg) < 249 cases (pima$diabetes pos).
Area under the curve: 0.7882
95% CI: 0.7538-0.8226 (DeLong)
>
AUC 분석 결과를 보면 공복혈당의 AUC가 가장 커서 예측력이 가장 좋은 것으로 보입니다. 이를 시각적으로 표시해 보겠습니다. 복수의 ROC 커브를 그리는 방법도 간단합니다.
plot(pressure, legacy.axes=TRUE)
lines.roc(mass, lty=2)
lines.roc(glucose, lty=3)
legend(0.4,0.2, lty=1:3, legend=c("blood pressure","BMI","fasting glucose"))
단순히 육안으로보더라도 공복혈당 (fasting glucose)의 당뇨 발생 예측력이 확실히 뛰어납니다. 당뇨의 진단 기준 가운데 하나가 공복혈당이라는 점을 생각하면 당연한 결과이기도 합니다. 하지만 ROC 커브가 겹치는 경우 어떤 변수가 예측력이 더 높은지를 어떻게 평가할까요. AUC 값이 그 기준이 되지만, 95% CI가 겹치는 구간이 있을 경우 판단이 애매해질 수 있습니다. 이 경우에 두 개의 값을 비교해 통계적 유의성이 있는지 확인합니다. roc.test(모델1, 모델2)로 비교합니다.
roc.test(glucose, mass)
roc.test(glucose, pressure)
roc.test(mass, pressure)
> roc.test(glucose, mass)
DeLong's test for two correlated ROC curves
data: glucose and mass
Z = 4.2677, p-value = 1.975e-05
alternative hypothesis: true difference in AUC is not equal to 0
sample estimates:
AUC of roc1 AUC of roc2
0.7882308 0.6793955
> roc.test(glucose, pressure)
DeLong's test for two correlated ROC curves
data: glucose and pressure
Z = 7.088, p-value = 1.361e-12
alternative hypothesis: true difference in AUC is not equal to 0
sample estimates:
AUC of roc1 AUC of roc2
0.7882308 0.6056309
> roc.test(mass, pressure)
DeLong's test for two correlated ROC curves
data: mass and pressure
Z = 2.8712, p-value = 0.00409
alternative hypothesis: true difference in AUC is not equal to 0
sample estimates:
AUC of roc1 AUC of roc2
0.6793955 0.6056309
기본 방법은 DeLong's method 입니다. 흥미롭게도 세가지 모두 P<0 .05="" nbsp="" roc="" span="">0>
댓글
댓글 쓰기