如何使用R中的ROC曲线确定最佳截止点及其置信区间?


51

我有一项测试数据,可用于区分正常细胞和肿瘤细胞。根据ROC曲线,此目的看起来不错(曲线下的面积为0.9):

ROC曲线

我的问题是:

  1. 如何确定该测试的临界点及其置信区间,在该区间应该将读数判断为不明确?
  2. 可视化此最佳方法(使用ggplot2)是什么?

图是使用ROCRggplot2包呈现的:

#install.packages("ggplot2","ROCR","verification") #if not installed yet
library("ggplot2")
library("ROCR")
library("verification")
d <-read.csv2("data.csv", sep=";")
pred <- with(d,prediction(x,test))
perf <- performance(pred,"tpr", "fpr")
auc <-performance(pred, measure = "auc")@y.values[[1]]
rd <- data.frame(x=perf@x.values[[1]],y=perf@y.values[[1]])
p <- ggplot(rd,aes(x=x,y=y)) + geom_path(size=1)
p <- p + geom_segment(aes(x=0,y=0,xend=1,yend=1),colour="black",linetype= 2)
p <- p + geom_text(aes(x=1, y= 0, hjust=1, vjust=0, label=paste(sep = "", "AUC = ",round(auc,3) )),colour="black",size=4)
p <- p + scale_x_continuous(name= "False positive rate")
p <- p + scale_y_continuous(name= "True positive rate")
p <- p + opts(
            axis.text.x = theme_text(size = 10),
            axis.text.y = theme_text(size = 10),
            axis.title.x = theme_text(size = 12,face = "italic"),
            axis.title.y = theme_text(size = 12,face = "italic",angle=90),
            legend.position = "none",
            legend.title = theme_blank(),
            panel.background = theme_blank(),
            panel.grid.minor = theme_blank(), 
            panel.grid.major = theme_line(colour='grey'),
            plot.background = theme_blank()
            )
p

data.csv包含以下数据:

x;group;order;test
56;Tumor;1;1
55;Tumor;1;1
52;Tumor;1;1
60;Tumor;1;1
54;Tumor;1;1
43;Tumor;1;1
52;Tumor;1;1
57;Tumor;1;1
50;Tumor;1;1
34;Tumor;1;1
24;Normal;2;0
34;Normal;2;0
22;Normal;2;0
32;Normal;2;0
25;Normal;2;0
23;Normal;2;0
23;Normal;2;0
19;Normal;2;0
56;Normal;2;0
44;Normal;2;0

Answers:


30

感谢所有提出这个问题的人。我同意,没有一个正确的答案,而且标准在很大程度上取决于特定诊断测试背后的目的。

最终,我找到了一个R包OptimalCutpoints,专门用于在这种类型的分析中查找临界点。实际上,有几种确定截止点的方法。

  • “ CB”(成本收益法);
  • “ MCT”(最小化分类错误的费用期限);
  • “ MinValueSp”(为特异性设置的最小值);
  • “ MinValueSe”(为灵敏度设置的最小值);
  • “ RangeSp”(为“特异性”设置的值的范围);
  • “ RangeSe”(为灵敏度设置的值范围);
  • “ ValueSp”(为“特异性”设置的值);
  • “ ValueSe”(为灵敏度设置的值);
  • “ MinValueSpSe”(为特异性和敏感性设置的最小值);
  • “ MaxSp”(最大化特异性);
  • “ MaxSe”(最大化灵敏度);
  • “ MaxSpSe”(同时最大化灵敏度和特异性);
  • “ Max-SumSpSe”(最大化灵敏度和特异性之和);
  • “ MaxProdSpSe”(最大化灵敏度和特异性的乘积);
  • “ ROC01”(最小化ROC图和点(0,1)之间的距离);
  • “ SpEqualSe”(灵敏度=特异性);
  • “ Youden”(Youden索引);
  • “ MaxEfficiency”(最大化效率或准确性);
  • “ Minimax”(最小化最常见的错误);
  • “ AUC”(最大化一致性,这是AUC的功能);
  • “ MaxDOR”(最大化诊断几率);
  • “ MaxKappa”(最大化Kappa指数);
  • “ MaxAccuracyArea”(最大化精度区域);
  • “ MinErrorRate”(最小化错误率);
  • “ MinValueNPV”(为负预测值设置的最小值);
  • “ MinValuePPV”(为正预测值设置的最小值);
  • “ MinValueNPVPPV”(为预测值设置的最小值);
  • “ PROC01”(最小化PROC图和点(0,1)之间的距离);
  • “ NPVEqualPPV”(负预测值=正预测值);
  • “ ValueDLR.Negative”(为负诊断可能性比设置的值);
  • “ ValueDLR.Positive”(为“阳性诊断可能性”设置的值);
  • “ MinPvalue”(最小化与统计卡方检验相关的p值,该统计卡方检验测量标记与使用切点获得的二进制结果之间的关联);
  • “ ObservedPrev”(与观察到的患病率最接近的值);
  • “ MeanPrev”(最接近诊断测试值平均值的值);
  • “ PrevalenceMatching”(预测流行率实际上等于观察到的流行率的值)。

因此,现在的任务是缩小选择适合每种情况的最佳方法。

软件包文档中介绍了许多其他配置选项,包括确定置信区间的几种方法以及每种方法的详细说明。


18
大量的方法表明了临界值的任意性。而且由于在输入变量上使用截断是完全不合适的,并且仅适合于(如果必须)对整体预测值进行截断,因此尚不清楚为什么要为此花费很多精力。如果您使用损失函数设置贝叶斯最优决策规则,那么一切都会得到照顾。没有ROC曲线,没有诸如灵敏度和特异性之类的倒时概率,也没有输入变量的临界值。
Frank Harrell

@FrankHarrell您能详细说明一下吗?“如果您设置具有损失函数的贝叶斯最优决策规则,一切都会得到照顾。” 在哪里可以找到更多关于此的文献?
黑色牛奶

1
查看有关贝叶斯最佳决策和适当评分规则的文献。
弗兰克·哈雷尔

26

我认为,有多个截止选项。您可能会以不同的方式权衡灵敏度和特异性(例如,对您而言,进行高敏感性测试更为重要,即使这意味着特异性测试较低,反之亦然)。

如果敏感性和特异性对您同样重要,则计算截止值的一种方法是选择一个使ROC曲线与图形左上角之间的欧式距离最小的值。

另一种方法是使用最大化的值(敏感性+特异性-1)作为临界值。

不幸的是,由于没有从教授或其他统计学家那里学到这两种方法,因此我没有参考。我只听说过将后一种方法称为“ Youden的索引” [1]。

[1] https://zh.wikipedia.org/wiki/Youden%27s_J_statistic


15

抵制寻找门槛的诱惑。除非您具有预先指定的效用/损失/成本函数,否则,面对最佳决策时,临界值会消失。ROC曲线与此问题无关。


7

从数学上讲,您需要另一个条件来解决截止值。

您可以将@Andrea的观点翻译为:“使用有关潜在问题的外部知识”。

条件示例:

  • 对于此应用,我们需要灵敏度> = x,和/或特异性> = y。

  • 假阴性是假阳性的10倍。(这将使您修改最接近理想角的点。)


1
完全正确,您需要外部知识来获得最佳决策。但是,损失函数并未以上述数量表示,最佳决策来自单个受试者结果的预测概率以及损失函数。
Frank Harrell 2015年

6

可视化精度与截止值。您可以在ROCR文档中阅读更多详细信息,并从中获得非常好的介绍

在此处输入图片说明


1
如果您仔细查看源代码,我已经使用了此软件包并阅读了此软件包的文档。它没有工具来确定正确的截止点和“灰色区域”
Yuriy Petrovskiy 2012年

1
我确实读过您的代码,但是没有“正确截止”这样的术语,但是“准确度vs截止”图可以为您提供正确的见解。使用此图,您可以找出如何找到最大精度的截止值。
弗拉基米尔·楚帕钦

2

更重要的是-这条曲线后面几乎没有数据点。当您决定要如何进行敏感性/特异性折衷时,我强烈建议您重新引导曲线和所得的截止数。您可能会发现估计的最佳临界值存在很多不确定性。


1
实验仍在进行中,因此我将获得更多数据点。我对方法学感兴趣(我认为对于任何数量的数据点都是相同的)。我还没有发现确定“灰色区域”的任何统计方法,尽管该方法广泛用于此类测试。
尤里·彼得罗夫斯基
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.