ROC曲线的问题,其中“测试为阳性”'低于某个阈值

时间:2016-09-11 22:32:01

标签: r roc diagnostics medical

我正在评估骨质疏松症的筛查测试,我有大量的数据来测量骨密度值。我们将个体归类为“疾病阳性”和“疾病阳性”。对于骨质疏松症,如果我们采取骨密度测量时图像上有椎骨骨折。

疾病阳性'连续值的分布低于疾病阴性组。

我们希望确定连续变量的哪个阈值最适合确定个体未来骨折的风险是否更高。我们发现价值越低,风险越高。我使用Stata创建了一些表来计算几个不同阈值的灵敏度和特异性。同样,一个人是测试积极的'如果它们的值低于阈值。 I made this table here:

我们想以图形形式显示它,所以我决定制作一个ROC曲线,我使用ROCR包来这样做。这是我在R中使用的代码:

library(ROCR)
prevalentfx <- read.csv("prevalentfxnew.csv", header = TRUE)    

pred <- prediction(prevalentfx$l1_hu, prevalentfx$fx)
perf <- performance(pred, "tpr", "fpr")

plot(perf, print.cutoffs.at = c(50,90,110,120), points.pch = 20, points.col = "darkblue", 
         text.adj=c(1.2,-0.5))

以下是出现的内容: Not what I expected!

这对我没有意义,因为根据我手动计算灵敏度和特异性的少数阈值(在表中),50 HU是最小敏感阈值,120是大多数敏感。另外,我觉得曲线沿对角线轴翻转。我知道这个测试不是 差。

我认为这个问题是由于一个人的测试呈阳性而且是正确的。如果值低于阈值,而不是高于它们。所以,我刚刚创建了一个新的值向量,我翻转了二进制分类并重新创建了ROC图,并得到了一个与数据更好地对齐的数字。但是,阈值仍然与它们应该是相反的。

我对此的看法是否存在根本性的错误?我已经多次仔细检查了我们的数据,以确保我没有错误计算灵敏度和特异性值,这一切看起来都是正确的。感谢。

编辑:

这是一个有效的例子:

library(ROCR)

low <- rnorm(200, mean = 73, sd = 42)
high<- rnorm(3000, mean = 133, sd = 51.5)

measure <- c(low, high)
df = data.frame(measure)

df$fx <- rep.int(1, 200)
df$fx[201:3200] <- rep.int(0,3000)

pred <- prediction(df$measure, df$fx)
perf <- performance(pred, "tpr", "fpr")

plot(perf,print.cutoffs.at=c(50,90,110,120), points.pch = 20, points.col = "darkblue", 
     text.adj=c(1.2,-0.5))

1 个答案:

答案 0 :(得分:1)

最简单的解决方案(虽然不优雅)可能是使用负值(而不是颠倒你的分类):

pred <- prediction(-df$measure, df$fx)
perf <- performance(pred, "tpr", "fpr")
plot(perf, 
     print.cutoffs.at=-c(50,90,110,120), 
     cutoff.label.function=`-`,
     points.pch = 20, points.col = "darkblue", 
     text.adj=c(1.2,-0.5))

enter image description here