从数据框手动创建 ROC 曲线

Create ROC curve manually from data frame

我有以下概念性问题,我无法理解。

下面是调查数据的示例,其中我有一个时间列,指示某人需要多长时间来回答某个问题。

现在,我对清洁量如何根据此阈值发生变化感兴趣,即如果我增加阈值会发生什么,如果我减少它会发生什么。

所以我的想法是创建一条 ROC 曲线(或其他模型指标)以获得关于潜在阈值的视觉提示。问题是我没有类似机器学习的模型可以给我 class 概率。所以我想知道是否有任何方法可以用这种类型的数据创建 ROC 曲线。我的想法是在大约 100 个不同的阈值处循环我的数据,计算每个阈值的假阳性率和真阳性率,然后做一个简单的线图,但我希望有一个更优雅的解决方案,不需要我循环.

有什么想法吗?

示例数据:


set.seed(3)
df <- data.frame(time      = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
                 truth     = rep(c("cleaned", "final"), each = 5)) %>%
  mutate(predicted = if_else(time < 2.5, "cleaned", "final"))

So my idea was to just create a ROC curve

创建 ROC 曲线就像

一样简单
library(pROC)
set.seed(3)
data.frame(time      = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
           truth     = rep(c("cleaned", "final"), each = 5)) |>
    roc(truth, time) |>
    plot()

The problem is that I don't have a machine-learning-like model that would give me class probabilities.

抱歉,我不明白类似机器学习的问题。

I had the idea of just looping through my data at maybe 100 different thresholds

如果您有 10 个观察值,则循环超过 100 个可能的阈值是没有意义的。合理的截止点是位于 time 值之间的九个。你可以从 roc:

df <- data.frame(time      = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
                truth     = rep(c("cleaned", "final"), each = 5))

thresholds <- roc(df, truth, time)$thresholds
print(thresholds)

> print(thresholds)
 [1]     -Inf 1.195612 1.739608 1.968531 2.155908 2.329745 2.561073
 [8] 3.093424 3.969994 4.586341      Inf

术语循环的确切含义是什么,以及您是否只想排除一个 for 和一个 while 循环,或者您认为是循环的任何东西都需要一些精确的定义。 c(1, 2, 3, 4) * 5 是循环吗?引擎盖下会有一个循环运行。

你也可以使用 ROCR

library(ROCR)

set.seed(3)
df <- data.frame(time      = c(2.5 + rnorm(5), 3.5 + rnorm(5)),
                 truth     = rep(c("cleaned", "final"), each = 5)) %>%
  mutate(predicted = if_else(time < 2.5, "cleaned", "final"))

pred <- prediction(df$time, df$truth)
perf <- performance(pred,"tpr","fpr")
plot(perf,colorize=TRUE)

您还可以查看AUC值:

auc <- performance(pred, measure = "auc")
auc@y.values[[1]]

[1] 0.92

pROC

交叉检查 AUC 值
library(pROC)

roc(df$truth, df$time)

Call:
roc.default(response = df$truth, predictor = df$time)

Data: df$time in 5 controls (df$truth cleaned) < 5 cases (df$truth final).
Area under the curve: 0.92

两种情况都是一样的!