

ROC曲线图解
ROC曲线图主要用于描述:
(1)敏感性和特异性之间的关系,例如敏感性降低时,特异性的增加。
(2)测试精度,曲线越靠近顶部和左侧边界,代表测试越准确;曲线越靠近对角线,测试的准确性就越低。
(3)似然比,由任意特定切点处的导数给出。
ROC曲线显示两个测试,红色测试更接近对角线,因此不如蓝色测试准确。
测试精度也显示为曲线下面积(area under the curve,AUC),可以使用积分计算,曲线下的面积越大,测试越准确。完美测试的ROC曲线下面积为1(曲线从0开始垂直延伸到左上角,然后水平延伸至右上角)。
ROC曲线中的对角线代表着等概率(随机)事件,可以理解为,遵循对角线的测试并不比随机抛硬币更容易发现问题。对角线下方的面积是0.5(图形面积的一半),因此若测试的AUC值小于或大致等同0.5,则反映其是个无效的测试。
几种获取ROC曲线的R包的简介
现阶段能够获取ROC曲线的R包非常多,这里列举6个R包,足以满足日常使用了。
以下过程只简单展示怎样通过这些R包获得ROC曲线,以及计算曲线下面积(AUC)。关于这些R包的其它细节,比如说怎样修改参数使ROC曲线更好看等,还请同学们自行研究了。
ROCR包获取ROC曲线
首先是ROCR包,它出现的时间很早,并一直是绘制ROC曲线的得力工具。ROCR的performance()函数通过输入真阳性率(tpr)和假阳性率(fpr)参数来设置曲线计算的方式,不仅具有令人放心的透明性,而且还显示了通过输入适当的参数来计算二进制分类器的几乎所有性能度量的灵活性。
“ROCR.simple”是RORC包中自带的模拟数据集,包含一组简单的预测数值和对应类标签的向量,在这里(包括后文中介绍的其它R包)使用该数据集作演示。
##ROCR 包的 ROC 曲线
library(ROCR)
#示例数据,详情 ?ROCR.simple
data(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中实现-qlIVjP.webp)
pROC包获取ROC曲线
pROC包也很受欢迎,通过它获得曲线下面积(AUC)的置信区间非常方便。
继续以上述示例数据为例。
##pROC 包的 ROC 曲线
library(pROC)
#使用上述示例数据,计算 ROC 曲线
#详情 ?roc
pROC_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中实现-h4bCh0.webp)
PRROC包获取ROC曲线
PRROC包的语法简单易懂,并可以很方便地绘制整齐的ROC曲线。
继续以上述示例数据为例。
##PRROC 包的 ROC 曲线
library(PRROC)
#使用上述示例数据,计算 ROC 曲线
#详情 ?roc.curve
PRROC_obj <- roc.curve(scores.class0 = df$predictions,
weights.class0 = df$labels, curve = TRUE)
plot(PRROC_obj)
曲线及其在r中实现-f3Ivaw.webp)
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中实现-1AAJ7V.webp)
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)
#函数evalmod()的参数选项使生成各种模型特性的基本图变得很容易
precrec_obj2 <- evalmod(scores = df$predictions, labels = df$labels, mode="basic")
autoplot(precrec_obj2)
曲线及其在r中实现-lnQH1J.webp)
ROCit包获取ROC曲线
ROCit是一个用于绘制ROC曲线和其它二进制分类可视化效果的新程序包,并且正在迅速普及。
继续以上述示例数据为例。
##ROCit 包的 ROC 曲线
library(ROCit)
#使用上述示例数据,计算 ROC 曲线
#详情 ?rocit
ROCit_obj <- rocit(score = df$predictions, class = df$labels)
plot(ROCit_obj)
#显示正响应和负响应的累积密度,KS统计量显示了两条曲线之间的最大距离
ksplot(ROCit_obj)
曲线及其在r中实现-pDkTxJ.webp)
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)
在该示例中通过ROC曲线评估,似乎随机森林表现地更优秀一些,其曲线下面积(AUC)更大。
在这个示例中使用了一个上述没有提到的R包(riskRegression,不在上述那6个R包之内)构建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')
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)
结果显示,相比model1,model2的X1、X2、X9的组合效应更好(更高的特异性),同时model2的变量数量也更少(简约性原则),因此选择model2更佳。
参考资料
生物空间站
生物空间站致力于分享生信技能干货、实用软件教程、科研经验、发布最新科研热点资讯、解读生命科学前沿进展、最新实验技术。温馨提示:添加主编微信,邀请你进生物空间站交流群,获取更多有趣的知识及资料。添加时,请备注一下单位/学校+专业。
转载、合作等事宜请联系BioSpaceStation