在 R 中如何计算 ROC 下面积的 p 值

机器算法验证 r p 值
2022-02-10 02:00:56

我很难找到一种方法来计算接收器操作特征 (ROC) 下区域的 p 值。我有一个连续变量和一个诊断测试结果。我想看看 AUROC 是否具有统计意义。

我发现了许多处理 ROC 曲线的软件包:pROC、ROCR、caTools、verification、Epi。但是,即使花了很多时间阅读文档和测试,我也找不到方法。我想我只是错过了它。

4个回答

在您的情况下,绘制 ROC 曲线并计算该曲线下的面积会很好,但这应该被认为是对您的主要分析的补充,而不是主要分析本身。相反,您想要拟合逻辑回归模型。

逻辑回归模型将作为一个整体的模型测试成为标准。(实际上,由于您只有一个变量,因此该 p 值将与您的测试结果变量的 p 值相同。)该 p 值就是您所追求的。该模型将允许您计算观察结果患病的预测概率。如果您使用不同的阈值将预测概率转换为预测分类,接收器操作特征会告诉您灵敏度和特异性将如何权衡。由于预测概率将是您的测试结果变量的函数,它还告诉您如果您使用不同的测试结果值作为阈值,它们将如何权衡。


如果您对逻辑回归不是非常熟悉,互联网上有一些可用的资源(除了上面链接的 Wikipedia 页面):

基本上你想测试 H0 =“AUC 等于 0.5”。

这实际上相当于说H0 =“两组中的排名分布相等”。

后者是 Mann-Whitney (Wilcoxon) 检验的原假设(例如参见Gold,1999)。

换句话说,您可以安全地使用 Mann-Whitney-Wilcoxon 测试来回答您的问题(例如参见Mason & Graham, 2002)。这正是 Franck Dernoncourt 提到的验证包所做的。

您可以使用验证中的roc.area()

install.packages("verification")
library("verification")

# Data used from Mason and Graham (2002).
a<- c(1981, 1982, 1983, 1984, 1985, 1986, 1987, 1988, 1989, 1990,
 1991, 1992, 1993, 1994, 1995)
d<- c(.928,.576, .008, .944, .832, .816, .136, .584, .032, .016, .28, .024, 0, .984, .952)

A<- data.frame(a,d)
names(A)<- c("year", "p2")

# For model without ties
roc.area(A$event, A$p2)

它会回来$p.value [1] 0.0069930071

可以在 pROC 中使用 比较两条 ROC 曲线roc.test()这也会产生一个 p 值。此外,使用roc(..., auc=TRUE, ci=TRUE)将在创建 ROC 对象时为您提供较低和较高的置信区间以及输出中的 AUC,这可能很有用。

以下是工作示例代码,用于测试每加仑英里数或汽车重量是否能更好地预测其配备的变速器类型(自动或手动):

library(pROC)
roc_object_1 <- roc(mtcars$am, mtcars$mpg, auc=T, ci=T) #gives AUC and CI
roc_object_2 <- roc(mtcars$am, mtcars$wt, auc=T, ci=T) #gives AUC and CI

roc.test(roc_object_1, roc_object_2) #gives p-value

看起来,重量是比油耗更好的预测指标。但是,这是比较两条曲线,而不是一条曲线与诸如 0.5 之类的数字。查看置信区间以查看它是否包含数字 0.5 告诉我们它是否显着不同,但它不会产生 p 值。