如何检验 AUC 的统计显着性?

机器算法验证 p 值
2022-03-26 08:00:16

(步骤 1)使用我的预测模型,我为我的样本数据集预测了 1000 个分数。

(第 2 步)然后我对随机数据集使用相同的方法计算随机分数。我首先拟合随机分数的分布。

(第 3 步)对于我的每个预测分数(第 1 步中的 1000 个分数),我计算了获得比我的样本样本数据集的预测分数更大的分数的 p 值。因此,获得了我的样本数据集的 1000 个 p 值。

(步骤 4)由于真正的分类是已知的,通过查看真阳性的富集,我发现当通过 p 值 < 0.05 过滤样本数据集时。获得了最好的真阳性值,它代表了我的样本数据集中的大约 150 个数据。

然后,我想通过 ROC 的 AUC(敏感性与 1-特异性图)来测试我的模型的预测能力。

但是,我现在面临一个问题,我应该为 ROC 图包含所有 1000 个数据以获得 AUC,还是应该只包含这 150 个数据(p < 0.05)用于我的 AUC 分析?

当我说 p < 0.05 时,p 值随机获得一个高于我的预测分数的分数。一般来说,是不是意味着我50%的数据是偶然获得的?


编辑

感谢@AlefSin、@steffen 和@Frank Harrell 的评论。

为了便于讨论,我准备了一个示例数据集(x),如下所示:

  • 我的模型预测分数(假设它是正态分布,均值 = 1,sd = 1)
  • 随机集(假设也有 mean=1, sd=1)
  • 每个预测分数的概率
  • 类预测如下,分四栏

x <- data.frame (predict_score=c(rnorm(50,m=1, sd=1)))
x$random <- rnorm(50, m=1, sd=1)
x$probability <- pnorm(x$predict_score, m=mean(x$random),sd=sd(x$random))
x$class <- c(1,1,1,1,2,1,2,1,2,2,1,1,1,1,2,1,2,1,2,2,1,1,1,1,2,1,2,1,2,2,1,1,2,1,2,1,2,2,1,1,1,1,1,1,2,2,2,2,1,1)

然后,我对所有数据点进行了 AUC,如下所示:

library(caTools)
colAUC(x$predict_score, x$class, plotROC=T, alg=c("Wilcoxon","ROC"))

结果:

       [,1]
1 vs. 2  0.6

假设当我按 p < 0.5 过滤数据集时,如果真阳性的丰富度更高(您的运行可能与我的不同,因为 rnorm 每次都会给出不同的结果),我对数据的子集进行 AUC,如下所示:

b <- subset(x, x$probability < 0.5)
colAUC(b$predict_score, b$class, plotROC=T, alg=c("Wilcoxon","ROC"))

结果:

             [,1]
1 vs. 2 0.7401961

我的问题是:当我进行 AUC 分析时,是否必须对整个数据集进行分析,还是我们应该首先根据真阳性的丰富性或在进行 AUC 之前的任何标准来过滤数据集?

1个回答

ROC 分析回答了以下问题(简而言之):您的预测变量在两组中是否不同?

您确信在第 4 步获得的子集高度丰富了真阳性。然而,这个结果并不能回答这个问题:“如果我提交一个新的数据点,我的预测方法会正确吗?” 这是 ROC 分析中的典型问题。相反,它会告诉您“如果它的 ap < 0.05,我是否非常有信心这是一个阳性结果?”。这不是 ROC 分析的重点。虽然这种类型的分析可能与您的情况相关(请注意我说可能,我不知道这里是否真的是这种情况),但它显然不是标准的 ROC 分析,您必须明确这一点。

要说服自己您的程序不正确,请多次重复上面显示的程序(生成随机数据集并计算 AUC)。如果这是随机数据,那么您希望平均获得 0.5 的 AUC,对吗?是你得到的吗?我打赌不会!


还有一些评论:

  • 如果您对阳性特别感兴趣,并且希望确保在阳性组中预测所有阳性观察结果,您可能会对 ROC 曲线下专注于高特异性区域的部分区域感兴趣。请参阅McClish 的这篇论文
  • 如果您对真阳性的富集感兴趣,您想检查阳性预测值而不是特异性/ROC。