ROC曲线也叫受试者工作曲线,原来用在军事雷达中,后面广泛应用于医学统计中。ROC曲线是根据一系列不同的二分类方式(分界值或决定阈),以真阳性率(灵敏度)为纵坐标,假阳性率(1-特异度)为横坐标绘制的曲线。

ROC曲线主要应用于二分类结局,比如是否死亡,疾病诊断,肿瘤复发等等,可以用于自变量为连续变量的截点判定。

roc曲线r语言 r语言 roc曲线_开发语言


可以做ROC曲线的软件很多,如SPSS,R语言,Stata, SAS等等,既往我们已经介绍了使用SPSS制作ROC曲线,今天我们来介绍怎么使用R语言绘制多条ROC曲线,继续使用我们的肺炎数据(公众号回复:肺炎,可以获得数据),我们先导入包和数据

library(pROC)
bc<-read.csv("E:/r/test/feiyan.csv",sep=',',header=TRUE)
names(bc)

roc曲线r语言 r语言 roc曲线_roc曲线r语言_02


roc曲线r语言 r语言 roc曲线_bc_03


数据fy为二分类结局变量,其余4个均是炎症指标,都是连续变量,假设我们想知道炎症指标TNF和肺炎发生关系的ROC曲线

roc1<- roc(bc$fy, bc$TNF)
plot(roc1)

roc曲线r语言 r语言 roc曲线_roc曲线r语言_04


这样一个最简单的ROC曲线就画好了,假设我们想让它光滑一点,并且修改曲线额颜色

plot(smooth(roc1),col="red")

roc曲线r语言 r语言 roc曲线_r语言_05


我们还可以更改Y轴的样式,做成类似SPSS那种

plot(roc1,col="red",legacy.axes=T)##更改Y轴格式

roc曲线r语言 r语言 roc曲线_bc_06


还可以进一步修改,增加AUC和95%CI

plot(roc1,col="red",legacy.axes=T,print.auc=TRUE)##显示AUC面积
plot(roc1,col="red",legacy.axes=T,print.auc=TRUE,print.thres=TRUE)##添加截点和95%CI

roc曲线r语言 r语言 roc曲线_roc曲线r语言_07


进一步修改,增加曲线面积

p

lot(roc1, print.auc=TRUE, auc.polygon=TRUE, grid=c(0.1, 0.2),
     grid.col=c("green", "red"), max.auc.polygon=TRUE,
     auc.polygon.col="lightblue", print.thres=TRUE)

roc曲线r语言 r语言 roc曲线_bc_08


还可以其他方式的截点

par(mfrow=c(1,2))##分屏显示
plot(roc1, print.thres="best", print.thres.best.method="youden")
plot(roc1, print.thres="best", print.thres.best.method="closest.topleft")

roc曲线r语言 r语言 roc曲线_roc曲线r语言_09


下面我们来绘制多个ROC曲线,先增加3个ROC

roc2<- roc(bc$fy, bc$IL6)
roc3<- roc(bc$fy, bc$sTREM1)
roc4<- roc(bc$fy, bc$PCT)

逐步添加曲线

plot(roc1,col="red",legacy.axes=T)
plot(roc2, add=TRUE, col="blue")
plot(roc3, add=TRUE, col="green")
plot(roc4, add=TRUE, col="black")

roc曲线r语言 r语言 roc曲线_ci_10


添加图例

legend("bottomright", legend=c("roc1","roc2","roc3","roc4"),col=c("red","blue","green","black"),lty=1)

roc曲线r语言 r语言 roc曲线_r语言_11


我们先求出每个曲线的AUC

round(auc(roc1),3)##AUC
round(ci(roc1),3)##95%CI
round(auc(roc2),3)##AUC
round(ci(roc2),3)##95%CI
round(auc(roc3),3)##AUC
round(ci(roc3),3)##95%CI
round(auc(roc4),3)##AUC
round(ci(roc4),3)##95%CI

roc曲线r语言 r语言 roc曲线_roc曲线r语言_12


进一步修改图例

legend("bottomright", legend=c("roc1-auc0.637","roc2-auc0.657","roc3-auc0.774","roc4-auc0.872"),
       col=c("red","blue","green","black"),lty=1)

roc曲线r语言 r语言 roc曲线_开发语言_13


这样,一个符合论文发表的ROC曲线就做好了,很容易把,假设我们想知道TNF和PCT的曲线面积有无统计学差异,等于说对2个指标进行诊断效能的比较

roc.test(roc1,roc4)

roc曲线r语言 r语言 roc曲线_r语言_14


结果显示PCT诊断肺炎效能优于TNF,结果有统计学意义。