R语言 | 受试者工作特征(ROC)曲线及其在R中实现

R语言 | 受试者工作特征(ROC)曲线及其在R中实现
受试者工作特征(ROC)曲线及其在R中实现
R语言 | 受试者工作特征(ROC)曲线及其在R中实现
受试者工作特征曲线(receiver operating characteristic curveROC曲线),又称为感受性曲线(sensitivity curve),是比较诊断测试的一种方法。术语“受试者工作特征”起源于第二次世界大战,ROC曲线最初被开发用于分析雷达数据,以区分敌机和信号噪声(例如鸟群)。随着接受者灵敏度的提高,假阳性的数量会随之增加(换句话说,特异性降低,即灵敏度= 1-特异性)。
因此,ROC曲线实际上反映了特异性与灵敏度的关系,它是真阳性率与假阳性率的关系图。其背后的逻辑是,如果一项测试没有诊断能力,那么它产生真阳性或假阳性的可能性是相同的。随着诊断能力的增加,即特异性的提升,真阳性率上升,假阳性下降。
本篇描述ROC曲线特征,并简介几种可获得ROC曲线的R包,以及在最后通过两个示例展示ROC曲线的应用。

     

ROC曲线图解

  

ROC曲线图主要用于描述:

1)敏感性和特异性之间的关系,例如敏感性降低时,特异性的增加。

2)测试精度,曲线越靠近顶部和左侧边界,代表测试越准确;曲线越靠近对角线,测试的准确性就越低。

3)似然比,由任意特定切点处的导数给出。

R语言 | 受试者工作特征(ROC)曲线及其在R中实现

ROC曲线显示两个测试,红色测试更接近对角线,因此不如蓝色测试准确。

 

测试精度也显示为曲线下面积(area under the curveAUC),可以使用积分计算,曲线下的面积越大,测试越准确。完美测试的ROC曲线下面积为1(曲线从0开始垂直延伸到左上角,然后水平延伸至右上角)。

ROC曲线中的对角线代表着等概率(随机)事件,可以理解为,遵循对角线的测试并不比随机抛硬币更容易发现问题。对角线下方的面积是0.5(图形面积的一半),因此若测试的AUC值小于或大致等同0.5,则反映其是个无效的测试。

     

几种获取ROC曲线的R包的简介

  

现阶段能够获取ROC曲线的R包非常多,这里列举6R包,足以满足日常使用了。

以下过程只简单展示怎样通过这些R包获得ROC曲线,以及计算曲线下面积(AUC)。关于这些R包的其它细节,比如说怎样修改参数使ROC曲线更好看等,还请同学们自行研究了。


ROCR包获取ROC曲线

首先是ROCR包,它出现的时间很早,并一直是绘制ROC曲线的得力工具。ROCRperformance()函数通过输入真阳性率(tpr)和假阳性率(fpr)参数来设置曲线计算的方式,不仅具有令人放心的透明性,而且还显示了通过输入适当的参数来计算二进制分类器的几乎所有性能度量的灵活性。

ROCR.simple”是RORC包中自带的模拟数据集,包含一组简单的预测数值和对应类标签的向量,在这里(包括后文中介绍的其它R包)使用该数据集作演示。

##ROCR 包的 ROC 曲线library(ROCR)
#示例数据,详情 ?ROCR.simpledata(ROCR.simple)df <- data.frame(ROCR.simple)
#ROC 曲线pred <- prediction(df$predictions, df$labels)perf <- performance(pred, 'tpr', 'fpr')plot(perf, colorize = TRUE)abline(0, 1)
#计算 AUC 值perf.auc <- performance(pred, 'auc')slot(perf.auc, 'y.values')
R语言 | 受试者工作特征(ROC)曲线及其在R中实现-医学科研网

  

pROC包获取ROC曲线

pROC包也很受欢迎,通过它获得曲线下面积(AUC)的置信区间非常方便。

继续以上述示例数据为例。

##pROC 包的 ROC 曲线library(pROC)
#使用上述示例数据,计算 ROC 曲线#详情 ?rocpROC_obj <- roc(df$labels,df$predictions, smoothed = TRUE, #置信区间相关参数 ci = TRUE, ci.alpha = 0.95, stratified = FALSE, #作图相关参数 plot = TRUE, auc.polygon = TRUE, max.auc.polygon = TRUE, grid = TRUE, print.auc = TRUE, show.thres = TRUE)
sens.ci <- ci.se(pROC_obj)plot(sens.ci, type = 'shape', col = 'yellow')plot(sens.ci, type = 'bars', col = 'red')
R语言 | 受试者工作特征(ROC)曲线及其在R中实现-医学科研网

 

PRROC包获取ROC曲线

PRROC包的语法简单易懂,并可以很方便地绘制整齐的ROC曲线。

继续以上述示例数据为例。

##PRROC 包的 ROC 曲线library(PRROC)
#使用上述示例数据,计算 ROC 曲线#详情 ?roc.curvePRROC_obj <- roc.curve(scores.class0 = df$predictions, weights.class0 = df$labels, curve = TRUE)
plot(PRROC_obj)
R语言 | 受试者工作特征(ROC)曲线及其在R中实现-医学科研网

  

plotROC包获取ROC曲线

plotROC包延用了ggplot2的语法,如果您习惯ggplot2的操作那么一定会比较顺手。plotROC包提供了许多功能丰富的小命令,可以制作出精美的图形,并可估计置信区间。

继续以上述示例数据为例。

##plotROC 包的 ROC 曲线library(plotROC)
#使用上述示例数据,计算 ROC 曲线#详情 ?geom_roc 等rocplot <- ggplot(df, aes(m = predictions, d = labels)) + geom_roc(n.cuts = 20,labels = FALSE) +style_roc(theme = theme_grey) + geom_rocci(fill = 'red')
R语言 | 受试者工作特征(ROC)曲线及其在R中实现-医学科研网

  

precrec包获取ROC曲线

precrec包计算ROC曲线的方法也很精简,并可同时获得precision-recall曲线。

继续以上述示例数据为例。

##precrec 包的 ROC 曲线library(precrec)
#使用上述示例数据,计算 ROC 曲线#详情 ?evalmod、?autoplot 等precrec_obj <- evalmod(scores = df$predictions, labels = df$labels)autoplot(precrec_obj)

R语言 | 受试者工作特征(ROC)曲线及其在R中实现

#函数evalmod()的参数选项使生成各种模型特性的基本图变得很容易precrec_obj2 <- evalmod(scores = df$predictions, labels = df$labels, mode="basic")autoplot(precrec_obj2)
R语言 | 受试者工作特征(ROC)曲线及其在R中实现-医学科研网

  

ROCit包获取ROC曲线

ROCit是一个用于绘制ROC曲线和其它二进制分类可视化效果的新程序包,并且正在迅速普及。

继续以上述示例数据为例。

##ROCit 包的 ROC 曲线library(ROCit)
#使用上述示例数据,计算 ROC 曲线#详情 ?rocitROCit_obj <- rocit(score = df$predictions, class = df$labels)plot(ROCit_obj)

R语言 | 受试者工作特征(ROC)曲线及其在R中实现

#显示正响应和负响应的累积密度,KS统计量显示了两条曲线之间的最大距离ksplot(ROCit_obj)
R语言 | 受试者工作特征(ROC)曲线及其在R中实现-医学科研网

     

ROC曲线应用举例

  

ROC曲线的实际应用场景是非常广泛的,例如在分类、回归中经常通过ROC曲线评估模型的预测性能。

以下展示两个示例。

  

分类器的精度评估

假设给定一组数据集,期望通过预测变量构建分类模型实现对二元响应的分类识别。这里选择了两种分类器(二项式回归或随机森林),并使用ROC曲线评价两种方法的性能。

##分类器#加载 R 包library(riskRegression)library(randomForest)
#bdl 是训练集,bdt 是测试集set.seed(123)bdl <- sampleData(40, outcome = 'binary')bdt <- sampleData(58, outcome = 'binary')bdl[ ,y:=factor(Y)]bdt[ ,y:=factor(Y)]
#基于训练集,分别使用二项式回归或随机森林构建分类器#y 是二元响应变量,X1、X2 等是预测变量#两者使用相同的训练集以及预测变量,以方便比较哪种方法更优fb1 <- glm(y ~ X1+X2+X3+X4+X5+X6+X7+X8+X9+X10, data = bdl, family = 'binomial')fb2 <- randomForest(y ~ X1+X2+X3+X4+X5+X6+X7+X8+X9+X10, data = bdl)
#预测测试集,并绘制 ROC 曲线评估两种模型性能xb <- Score(list('glm' = fb1, 'rf' = fb2), y~1, data = bdt, plots = 'roc', metrics = c('auc', 'brier'))plotROC(xb, brier.in.legend = 1L)

R语言 | 受试者工作特征(ROC)曲线及其在R中实现

在该示例中通过ROC曲线评估,似乎随机森林表现地更优秀一些,其曲线下面积(AUC)更大。

在这个示例中使用了一个上述没有提到的R包(riskRegression,不在上述那6R包之内)构建ROC曲线,只是因为该R包的方法和分析过程的承接非常方便。

不过为了和前文的连贯,接下来再根据计算结果,通过上述提到的R包之一作展示。

##使用 ROCR 包的方法获得 ROC 曲线library(ROCR)
#预测测试集bdt$pred1 <- predict.glm(fb1, bdt)bdt$pred2 <- predict(fb2, bdt, type = 'prob')[ ,2]
#ROC 曲线pred1 <- prediction(bdt$pred1, bdt$y)pred2 <- prediction(bdt$pred2, bdt$y)perf1 <- performance(pred1, 'tpr', 'fpr')perf2 <- performance(pred2, 'tpr', 'fpr')
plot(perf1, col = 'blue')plot(perf2, col = 'red', add = TRUE)abline(0, 1)
#计算 AUC 值perf1.auc <- performance(pred1, 'auc')slot(perf1.auc, 'y.values')perf2.auc <- performance(pred2, 'auc')slot(perf2.auc, 'y.values')

R语言 | 受试者工作特征(ROC)曲线及其在R中实现

perf1是二项式回归的结果,perf2是随机森林的结果,结果和上述一致。

生存分析模型预测性能评估

假定在生存分析中构建Cox回归模型,预测患者的生存能力,通过ROC曲线评估精度。

##生存分析(Cox 回归)#加载 R 包library(riskRegression)library(survival)
#sdl 是训练集,sdt 是测试集set.seed(123)sdl <- sampleData(40, outcome = 'survival')sdt <- sampleData(58, outcome = 'survival')
#基于训练集构建 Cox 回归模型#time 是患者生存时间,event 记录了患者是否去世,X1、X2 等是不同的预测变量#分别使用不同的预测变量构建模型,以比较哪些变量组合更优fs1 <- coxph(Surv(time, event) ~ X3+X5+X6+X7+X8+X10, data = sdl, x = TRUE)fs2 <- coxph(Surv(time, event) ~ X1+X2+X9, data = sdl, x = TRUE)
#预测测试集,并绘制 ROC 曲线评估两种模型性能xs <- Score(list(model1 = fs1, model2 = fs2), Hist(time, event)~1, data = sdt, times = 5, plots = 'roc', metrics = 'auc')plotROC(xs)

R语言 | 受试者工作特征(ROC)曲线及其在R中实现

结果显示,相比model1model2X1X2X9的组合效应更好(更高的特异性),同时model2的变量数量也更少(简约性原则),因此选择model2更佳。

     

参考资料

  

https://www.statisticshowto.com/receiver-operating-characteristic-roc-curve/
https://rviews.rstudio.com/2019/03/01/some-r-packages-for-roc-curves/、

生物空间站

生物空间站致力于分享生信技能干货、实用软件教程、科研经验、发布最新科研热点资讯、解读生命科学前沿进展、最新实验技术。温馨提示:添加主编微信,邀请你进生物空间站交流群,获取更多有趣的知识及资料。添加时,请备注一下单位/学校+专业

R语言 | 受试者工作特征(ROC)曲线及其在R中实现

转载、合作等事宜请联系BioSpaceStation

生物医学科研方法

男生和女生的差别

2021-1-17 17:15:07

生物医学科研方法

“月薪1万和月薪10万”的真实差距扎心了:穷人差的根本不是钱!

2021-1-17 18:05:26