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

机器算法验证 r 数据可视化 置信区间 ggplot2
2022-02-04 07:03:39

我有可以用来区分正常细胞和肿瘤细胞的测试数据。根据 ROC 曲线,它看起来很适合这个目的(曲线下面积为 0.9):

ROC曲线

我的问题是:

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

ROCR图形是使用和ggplot2呈现的:

#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
4个回答

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

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

  • “CB”(成本效益法);
  • “MCT”(最小化误分类成本项);
  • “MinValueSp”(为特异性设置的最小值);
  • “MinValueSe”(为灵敏度设置的最小值);
  • “RangeSp”(为特异性设置的值范围);
  • “RangeSe”(为灵敏度设置的值范围);
  • “ValueSp”(为特异性设置的值);
  • “ValueSe”(为灵敏度设置的值);
  • “MinValueSpSe”(为特异性和灵敏度设置的最小值);
  • “MaxSp”(最大化特异性);
  • “MaxSe”(最大化灵敏度);
  • “MaxSpSe”(同时最大化灵敏度和特异性);
  • “Max-SumSpSe”(最大化灵敏度和特异性之和);
  • “MaxProdSpSe”(最大化灵敏度和特异性的乘积);
  • “ROC01”(最小化 ROC 图和点 (0,1) 之间的距离);
  • “SpEqualSe”(灵敏度 = 特异性);
  • “约登”(约登索引);
  • “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”(预测患病率实际上等于观察到的患病率的值)。

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

包文档中描述了许多其他配置选项,包括确定置信区间的几种方法以及每种方法的详细描述。

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

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

另一种方法是使用最大化的值(灵敏度 + 特异性 - 1)作为截止值。

不幸的是,我没有这两种方法的参考资料,因为我是从教授或其他统计学家那里学到的。我只听说过将后一种方法称为“约登指数”[1])。

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

抵制寻找截止点的诱惑。除非你有一个预先指定的效用/损失/成本函数,否则在最优决策面前会有一个临界值。ROC 曲线与这个问题无关。

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

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

示例条件:

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

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