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


12

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

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


1
曲线下的面积“显着”可能意味着什么?
gung-恢复莫妮卡

我想说的是测试AUC值是否在统计上是否不同于0.5
user32530

您的ROC曲线来自何处?大概您希望对此进行检验(例如,整体上采用的逻辑回归模型有一个p值)。
gung-恢复莫妮卡

好吧,我的数据如下:我有一个标准测试,可以将疾病分为有/无疾病,我想找到一个用于从血样中进行生物学测定的临界值。另外,我需要曲线下的面积。所以不,我没有任何回归模型
user32530

因此,您需要对从患者身上抽取的血液样本进行一些测试,从而得出一个数字。&您将要使用该数字对患者是否患有该疾病进行分类。目前,您从此测试中获得了一组数字,用于您知道其真实疾病状态的一组患者。所有这些正确吗?
gung-恢复莫妮卡

Answers:


12

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

逻辑回归模型将通过对模型整体进行测试而成为标准配置。(实际上,由于您只有一个变量,因此该p值将与测试结果变量的p值相同。)该p值就是您所追求的。该模型将使您能够计算观察到的疾病的预测概率。一个接收器工作特性将告诉您如何在灵敏度和特异性会权衡,如果使用不同的阈值来预测概率转化为预测分类。由于预测概率将取决于测试结果变量,因此,如果您使用不同的测试结果值作为阈值,它还会告诉您如何权衡。


如果您对逻辑回归不十分熟悉,则可以从Internet上获得一些资源(除了上面链接的Wikipedia页面之外):


这非常有启发性。谢谢!所以我适合逻辑模型glm binomial(logit)。然后,我将其与空模型进行比较,该测试为我提供了所要查找的p值?
user32530

是的,应该为您做。LR还将使很多其他事情成为可能,但这可能就是您所需要的。
gung-恢复莫妮卡

所以代码如下所示?GLM.1 <-glm(Group〜ContinuousVar,family = binomial(logit),data = diagnosticData)摘要(GLM.1)GLM.2 <-glm(Group〜1,family = binomial(logit),data = diagnosticData) anova(GLM.2,GLM.1,test =“ Chisq”)
2013年

summary(GLM.1)应该会为您提供所需的信息,我想anova(GLM.1)将它与没有实际需要的null模型进行比较。但是,您的方式肯定会有效,是的。
gung-恢复莫妮卡

9

基本上,您要测试H0 =“ AUC等于0.5”。

实际上,这等效于说H0 =“两组中的等级分布相等”。

后者是曼-惠特尼(Wilcoxon)检验的原假设(例如参见Gold,1999年)。

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


为什么有趣的是显示预测不是随机的?那没有评估有用性。
Frank Harrell 2014年

1
@FrankHarrell因为在许多情况下,您的预测可能并不比随机预测好-在这种情况下,您报告的实用性实际上为零。当然,报告有用性度量的置信区间(敏感性和特异性)会更有用。但是至少在临床文献中测试两组之间的差异是很平常的(实际上,两组之间通常没有差异),我看到审稿人对此有特别的要求。
Calimo 2014年

恕我直言,这毫无意义。我想知道某物有多有用,而不是它是否比掷硬币好。
Frank Harrell 2014年

如果这不比掷硬币好,那您为什么还要经历所有这些工作呢?只需掷硬币。
斯科特,

4

您可以从包验证中使用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


非常感谢您,但我没有任何c和d值。我有一个标准测试,可以将疾病分为有/无疾病,我想找到从血样中进行生物学测定的临界值。另外,我需要曲线下的面积。所以不,我没有任何回归。我有stdtest二进制变量和biovalue连续变量
user32530

哦,好吧,我以为你已经知道了,因为我以为你已经有了ROC曲线。
Franck Dernoncourt,2013年

3
当与疾病几率的真实关系很顺利时,寻求一个任意的界限通常是一个错误。同样,测试ROC面积为0.5的零假设是一个很无聊的假设。对于大多数预测,您关心的是预测的好坏,而不管它是否是随机的。
Frank Harrell

没问题,谢谢弗兰克·德莫库特(Frank Demoncourt),也许有办法获得d。
user32530

在医学领域,有时他们需要这些临界点来创建诊断测试。他们想与那些人找出受试者是否生病,而不要预测某些事情。有时,他们需要以更便宜的价格来确定疾病状态,从而削减成本。
user32530

0

可以使用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值。


它也提供p值吗?
Michael R. Chernick

尽管问题是专门针对R提出的,但我们的总体政策是我们是一个统计(机器学习等)问答网站。因此,Q必须具有统计内容,并且强烈优选不仅以软件特定术语提供A。有鉴于此,除了提及R中存在的测试并显示其R代码外,您能否进一步说明该测试的含义和工作方式?
gung-恢复莫妮卡

好吧,我将更新我的答案以反映一些统计背景
naco
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.