'test positive' 低于特定阈值的 ROC 曲线问题
Issue with ROC curve where 'test positive' is below a certain threshold
我正在评估一项骨质疏松症筛查试验,并且我有大量数据,其中我们测量了骨密度值。如果在我们进行骨密度测量时图像上存在椎骨骨折,我们将个体归类为 'disease positive' 骨质疏松症。
'disease positive'的连续值分布低于疾病阴性组
我们想要确定连续变量的哪个阈值最适合确定个人未来骨折的风险是否较高。我们发现值越低,风险越高。我使用 Stata 创建了一些 tables 来计算几个不同阈值的灵敏度和特异性。同样,如果一个人的价值 低于 阈值,那么他就是 'test positive'。 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!
这对我来说没有意义,因为根据我手动计算灵敏度和特异性的几个阈值(在 table 中),50 HU 是 最小值 敏感阈值,120 是 最 敏感。此外,我觉得曲线沿着对角线轴翻转了。我知道这次考试不那个差
我认为这个问题是由于一个人 'test positive' 如果值 低于 阈值,而不是高于阈值。因此,我刚刚创建了一个新的值向量,在其中我翻转了二进制分类并重新创建了 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))
最简单的解决方案(虽然不够优雅)可能是使用负值(而不是反转您的分类):
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))
我正在评估一项骨质疏松症筛查试验,并且我有大量数据,其中我们测量了骨密度值。如果在我们进行骨密度测量时图像上存在椎骨骨折,我们将个体归类为 'disease positive' 骨质疏松症。
'disease positive'的连续值分布低于疾病阴性组
我们想要确定连续变量的哪个阈值最适合确定个人未来骨折的风险是否较高。我们发现值越低,风险越高。我使用 Stata 创建了一些 tables 来计算几个不同阈值的灵敏度和特异性。同样,如果一个人的价值 低于 阈值,那么他就是 'test positive'。 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!
这对我来说没有意义,因为根据我手动计算灵敏度和特异性的几个阈值(在 table 中),50 HU 是 最小值 敏感阈值,120 是 最 敏感。此外,我觉得曲线沿着对角线轴翻转了。我知道这次考试不那个差
我认为这个问题是由于一个人 'test positive' 如果值 低于 阈值,而不是高于阈值。因此,我刚刚创建了一个新的值向量,在其中我翻转了二进制分类并重新创建了 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))
最简单的解决方案(虽然不够优雅)可能是使用负值(而不是反转您的分类):
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))