ROC分析介绍|生信开发实战

企业   2024-12-11 17:05   浙江  

一、背景介绍

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)#计算ROCplot(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热点:空间组学有哪些分析内容?

本文系联川生物公众号原创文章,未经授权禁止转载,侵权必究!

扫描下方二维码





点分享


点点赞


点在看

联川生物
一个提供科研入门学习资源、经验的平台。 分享前沿测序技术资讯、实用生信绘图技巧及工具。 发布高质量的科研论文精度、精炼科研思路。 我们的目标是持续提供“干货”,滋润您的科研生涯。
 最新文章