Epi라는 epidemiology 패키지가 있습니다.
데이터 cats는 고양이의 성별(Sex), Bwt(몸무게), Hwt(길이)을 포함하고 있는데,
Bwt로 성별을 판별하는 걸 시도했었다.
숫컷이 암컷보다 무게가 많이 나가겠죠...
간단하게 ROC curve가 그려집니다.
> install.packages("Epi")
> library(Epi)
> data(cats,package="MASS")
> out=ROC(form=Sex~Bwt,data=cats,plot="ROC")

ROC curve를 그리는 여러 패키지가 있는데 이게 가장 많은 정보를 줍니다.
그런데 5년전에 썼을 때는 아래와 같았고 확인해봤을때 정확했는데 방금 돌린 위의 정보는 틀립니다.
일단 오른쪽 코너의 정보는 logistic regression입니다.
고양이 성별(M/F)을 판별할 때 다음 기준을 사용하면
Male, Bwt >= 2.4
Female, Btw < 2.4
> with(cats, xtabs(~(Bwt>=2.4)+Sex))
Sex
Bwt >= 2.4 F M
FALSE 30 12
TRUE 17 85
> c(85/(12+85),30/(30+17),85/(17+85),30/(30+12))
[1] 0.8762887 0.6382979 0.8333333 0.7142857
이 판별 기준이 숫컷/암컷을 얼마나 잘 구별하는지 기준들인
sensitivity = 85/(12+85) = 0.8763 # P( + | M)
specificity = 30/(30+17) = 0.6383 # P(- | F)
PV+ = 85/(17+85) = 0.8333 # P(M | +)
PV- = 30/(30+12) = 0.7143 # P(F|-)
Cutoff 값 2.4가 lr.eta=0.511에 해당되는 가장 최적의 값으로, 그래프 왼쪽위에 있는 값들이 방금 구한 확률들과 같아야 하는데 모두 틀리죠.
사실 5년전인가는 아래 그래프가 결과물이었니다.
이건 2.5를 Cutoff로 사용해서 다음 판별기준을
Male, Bwt >= 2.5
Female, Btw < 2.5
> with(cats, xtabs(~(Bwt>=2.5)+Sex))
Sex
Bwt >= 2.5 F M
FALSE 34 17
TRUE 13 80
> c(80/(17+80),34/(34+13),80/(13+80),34/(34+17))
[1] 0.8247423 0.7234043 0.8602151 0.6666667
sensitivity=0.8247, specificity=0.7234, PV+=0.8602, PV-=0.6667로 아래 결과와 동일하죠.
그리고 (sensitivity, specificity)가 (1,1)에 가장 가까운 값을 Cutoff로 사용하는데, 이 결과가 더 (1,1)에 가깝죠.
즉 2.5일때가 2.4일때보다 좋습니다. 그래서 lr.eta=0.511이라는 결과는 이상합니다.

첫댓글 좋은 정보 감사합니다. 안재형 선생님께서 좋은 package를 선별해 주시니 사용하기 좋을 듯 하네요.
전엔 맞았는데 이제 틀려서ㅜㅜ
web-r의 ROC curve를 Epi패키지 이용해 그렸는데 수정해야겠네요...ㅠ.ㅠ
선생님도 이거 쓰셨군요. 고쳐달라고 메일 보냈는데 답장이 없네요ㅜㅜ 이 패키지가 딱인데요...
주인장님께서 알려주신 것과 같이 제가 그동안 써오던 Epi 패키지에 문제가 있어 이를 해결하고자 ROC 커브 분석을 위한 새로운 패키지를 만들었습니다. 패키지 이름은 multipleROC 패키지입니다. 패키지의 특징은 하나의 plot에 여러개의 ROC 커브도 그릴 수가 있고 multiple predictor가 있는 모형의 ROC 커브도 그릴 수 있다는 점입니다. 또한 multiple predictor가 있는 모형의 경우 step()함수를 이용해 AIC값을 이용한 자동화된 backward elemination 및 final model selection을 해주고 두 모형을 비교해준다는 점입니다.의학논문... 게시판을 참조해주셔요