본문 바로가기
9.비율비교/ROC curve

R에서 ROC curve를 그리는 방법

by makhimh 2020. 9. 7.
반응형

ROC curve는 threshold의 변화에 따른 민감도와 특이도의 함수입니다. 이론이 궁금하신 분들은 아래 링크를 참고해주세요.

https://hsm-edu.tistory.com/1033

R에서 ROC curve를 그릴 때 사용하는 대표적인 두 가지 함수가 있습니다. 각 함수를 사용해보기 전에 먼저 상황을 하나 설정하겠습니다. 어떤 병을 진단하는 기준으로 혈액에서 채취한 k값을 사용할 것이라 합시다. 얼마의 k값을 기준으로 해야하는지 정하기 위해 정상인 10명과, 환자 10명을 모집하여 k값을 측정했습니다. 

정상 : 11.1, 14.3, 13.1, 12.5, 12.4, 12.3, 12.1, 10.4 ,14.4 ,12.9
환자 : 15.8, 13.5, 15.7, 16.3, 17.1, 17.8, 16.2, 13.1, 13.3, 15.1

이 예시를 이용하여 ROC curve를 그려보겠습니다. 먼저 위 데이터를 아래와 같이 변형하겠습니다. 

normal=c( 11.1, 14.3, 13.1, 12.5, 12.4, 12.3, 12.1, 10.4 ,14.4 ,12.9)
patient =c( 15.8, 13.5, 15.7, 16.3, 17.1, 17.8, 16.2, 13.1, 13.3, 15.1)


subject=c(rep("normal",length(normal)),rep("patient",length(patient)))
k=c(normal,patient)

my_data=data.frame(subject,k)
my_data$subject=as.factor(my_data$subject) #as factor

 

생성된 데이터는 아래와 같습니다. 

 

> my_data
   subject    k
1   normal 11.1
2   normal 14.3
3   normal 13.1
4   normal 12.5
5   normal 12.4
6   normal 12.3
7   normal 12.1
8   normal 10.4
9   normal 14.4
10  normal 12.9
11 patient 15.8
12 patient 13.5
13 patient 15.7
14 patient 16.3
15 patient 17.1
16 patient 17.8
17 patient 16.2
18 patient 13.1
19 patient 13.3
20 patient 15.1


ROC curve 를 그려주는 두 가지 패키지가 있습니다. 각각 사용하여 ROC curve 를 그려봅시다. 

 

1) pROC 패키지 이용

먼저 roc 함수를 적용해주겠습니다. 함수는 데이터를 각각 입력하는 방법이 있고, 수식형태로 입력하는 방법이 있습니다. 각각 입력하는 방식으로 사용 하겠습니다. levels 에는 normal 과 patients 순서대로 입력합니다. direction은 normal patients 의 비교입니다. "<" 인 경우 normal < patients 입니다. 환자가 더 높은 값을 가진다는 의미입니다. 

library(pROC)

my_roc=roc(my_data$subject,my_data$k,levels=c("normal","patient"),direction="<")

plot.roc(my_roc,
         col='black',   # 선의 색
         print.auc=TRUE,  #auc 출력 
         print.auc.col='red', #auc 색
         print.thres=TRUE, # theshold 출력 
         print.thres.pch=19, #theshold 점 모양
         print.thres.col = "red", #threhold 색
         grid=c(0.2, 0.2), #격자
         cex.lab=1.2) # x,y 레이블 크기


ROC curve는 아래와 같습니다. 

 

 

2) epi 패키지 이용

아래와 같이 사용합니다. level을 입력하는 옵션도 없고, direction 옵션도 없습니다. 큰 값을 알아서 인식하고, direction은 normal < patients 로 그려주는 것 같네요.

 

library(Epi)
ROC(form=subject~k,data=my_data,plot="ROC")

 

ROC curve는 아래와 같습니다. 

 

 

반응형

댓글