ROC曲线(Receiver Operating Characteristic)的全称是受试者工作特征曲线,主要是用于分析X对Y的预测准确率情况。最初ROC曲线是运用在军事上,现在应用于医学、无线电、生物学、犯罪心理学、机器学习等领域,用来评判分类、检测结果的好坏,是非常重要和常见的统计分析方法。
基础概念:
对于二分类问题,可将样本根据其真实类别与学习器预测类别的组合划分为TP(true positive)、FP(false positive)、TN(true negative)、FN(false negative)四种情况,TP+FP+TN+FN=样本总数。
真正(True Positive , TP)被模型预测为正的正样本;
假负(False Negative , FN)被模型预测为负的正样本;
假正(False Positive , FP)被模型预测为正的负样本;
真负(True Negative , TN)被模型预测为负的负样本。
ROC曲线图是反映敏感性与特异性之间关系的曲线。横坐标X轴为 1 – 特异性,也称为假阳性率(误报率),X轴越接近零准确率越高;纵坐标Y轴称为敏感度,也称为真阳性率(敏感度),Y轴越大代表准确率越好。根据曲线位置,把整个图划分成了两部分,曲线下方部分的面积被称为AUC(Area Under Curve),用来表示预测准确性,AUC值越高,也就是曲线下方面积越大,说明预测准确率越高。曲线越接近左上角(X越小,Y越大),预测准确率越高。
一般可以基于AUC判断分类器性能:
AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样,模型没有预测价值。
AUC < 0.5,比随机猜测还差;但反预测时就优于随机猜测。
以红色和蓝色正态分布表示的钟形分布表示数据样本的实际类(或分组)为例,如果能够更好地区分这两个类,则 ROC 曲线将更接近左上角。
AUC值的计算一般采用公式法:
假设有样本数n,正类(分组A)样本数为M,负类(分组B)样本数为N(即n=M+N),首先对score(也可为数据表达谱中表达量或者丰度表中丰度)从大到小排序,然后令最大score对应的sample的rank为n,第二大score对应sample的rank为n-1,以此类推。然后把所有的正类样本的rank相加,再减去M-1种两个正样本组合的情况。得到的就是所有的样本中有多少对正类样本的score大于负类样本的score。然后再除以M×N。
本次主要介绍基于R语言中pROC包实现ROC曲线的绘制,pROC相对于其他绘制ROC的包功能更强大,且构建了比较完整的ROC分析和绘图体系,而且还提供了ggplot形式的绘图函数ggroc。
示例格式数据如下:
数据来源可以使用基因表达谱、物种丰度表、蛋白代谢等表达谱数据,将样本名称换为对应分组名称,然后对数据进行转置即可得到示例格式数据。
数据格式要求:分组列只有两类名称,其余列均为需要计算ROC的ID列,如基因名、物种、蛋白ID、代谢物等。
具体常见应用场景及其代码实现如下:
#绘制单条ROC曲线
library(pROC)
data(aSAH) #加载示例数据
plot.roc(aSAH$outcome, aSAH$s100b, # data,第一个参数为分组列数据,第二个参数为ID列表达数据
percent=TRUE, # show all values in percent 是否数据显示为百分比
print.auc=TRUE, #display pAUC value on the plotwith following options:
print.auc.pattern="AUC:%.1f%%", print.auc.col="white",#显示AUC值
auc.polygon=TRUE, auc.polygon.col="#1c61b6", #显示AUC面积区域
max.auc.polygon=TRUE, max.auc.polygon.col="#1c61b622",# 显示最大面积区域
main="",#main 标题
legacy.axes=F ,#x axes title "1 - specificity"
print.thres=T# threshold is displayed 显示最佳阈值
)
#绘制多条ROC曲线
library(pROC)
data(aSAH) #加载示例数据
plot.roc(aSAH$outcome, aSAH$s100b, # data,第一个参数为分组列数据,第二个参数为ID列表达数据
main="",#main 标题
legacy.axes=F ,#x axes title "1 - specificity"
print.thres=T# threshold is displayed 显示最佳阈值
)
plot.roc(aSAH$outcome, aSAH$ndka, # data,第一个参数为分组列数据,第二个参数为ID列表达数据
main="",#main 标题
legacy.axes=F ,#x axes title "1 - specificity"
print.thres=T,# threshold is displayed 显示最佳阈值
add=TRUE#将ROC曲线加到上一幅图中
)
#平滑ROC曲线
roc.s100b <- roc(aSAH$outcome, aSAH$s100b)#计算ROC
plot(roc.s100b, col="black")#原始曲线
plot(smooth(roc.s100b), add=TRUE, col="blue")#平滑曲线
legend("bottomright", legend=c("Empirical", "Smoothed"),
col=c(par("fg"), "blue"), lwd=2)
#计算ROC曲线间差异
rocobj1 <- plot.roc(aSAH$outcome, aSAH$s100,main="Statistical comparison",percent=TRUE, col="#1c61b6")
rocobj2 <- lines.roc(aSAH$outcome, aSAH$ndka, percent=TRUE, col="#008600")
testobj <- roc.test(rocobj1, rocobj2) #计算差异
text(50, 50, labels=paste("p-value =", format.pval(testobj$p.value)),adj=c(0, .5))
legend("bottomright", legend=c("S100B", "NDKA"), col=c("#1c61b6", "#008600"),lwd=2)
图中各拐点为阈值点,其坐标即括号内的内容,分别为负类概率与正类概率的坐标值,括号外的值为阈值具体的值。Sensitivity即TPR真阳率,Specificity为真阴率,当参数中print.thres=T时只显示Sensitivity+Specificity最大的阈值点,print.thres="all"时显示全部阈值点。
阈值点的数目为将score值去重并从大到小排序后的数目减1,其值为相邻两个数据的均值。针对任何一个阈值,大于该阈值的样本score值如果在正类中,其正类概率为正类中大于该阈值的样本数目/正类样本总数;负类概率同理,为负类中大于该阈值的样本数目/负类样本总数。
如果使用find_circ来鉴定circRNA|生信开发实战
解析细胞功能基因集变异——遇见GSVA|生信开发实战
单细胞评分分析R包Ucell
国自然2025热点:空间组学有哪些分析内容?
本文系联川生物公众号原创文章,未经授权禁止转载,侵权必究! 扫描下方二维码 点分享
点点赞
点在看