如何使用 r 中的 ROCR 包绘制 ROC 曲线,*只有分类列联表*

Posted

技术标签:

【中文标题】如何使用 r 中的 ROCR 包绘制 ROC 曲线,*只有分类列联表*【英文标题】:How to plot a ROC curve using ROCR package in r, *with only a classification contingency table* 【发布时间】:2015-04-11 04:52:41 【问题描述】:

如何在r中使用ROCR包绘制ROC曲线,只有分类列联表

我有一个列联表,其中可以计算出真阳性、假阳性……等所有评分。我有 500 个复制,因此有 500 个表。但是,我无法生成一个预测数据来指示估计概率和真实性的每个单一案例。如何在没有个人数据的情况下获得曲线。 以下是使用的包装说明。

## computing a simple ROC curve (x-axis: fpr, y-axis: tpr)
library(ROCR)
data(ROCR.simple)
pred <- prediction( ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr","fpr")
plot(perf)    

【问题讨论】:

我的问题是我的文件没有“ROCR.simple”。 好吧,如果您没有个人数据,请分享一些您确实为您的数据提供的示例输入。 你的表是 2×2 的表,每个唯一阈值对应一个表(例如,您有 500 个表,而创建它们的数据集有 500 条记录?) 【参考方案1】:

您无法使用单个列联表生成完整的 ROC 曲线,因为列联表仅提供单个灵敏度/特异性对(对于用于生成列联表的任何预测截止值)。

如果您有许多使用不同截止值生成的列联表,您将能够近似 ROC 曲线(基本上它将是列联表中灵敏度/特异性值之间的线性插值)。例如,让我们考虑使用逻辑回归预测鸢尾花数据集中的花是否杂色:

iris$isv <- as.numeric(iris$Species == "versicolor")
mod <- glm(isv~Sepal.Length+Sepal.Width, data=iris, family="binomial")

我们可以使用标准的ROCR 代码来计算这个模型的 ROC 曲线:

library(ROCR)
pred1 <- prediction(predict(mod), iris$isv)
perf1 <- performance(pred1,"tpr","fpr")
plot(perf1)

现在让我们假设我们所拥有的不是mod,而是带有多个预测截止值的列联表:

tables <- lapply(seq(0, 1, .1), function(x) table(iris$isv, factor(predict(mod, type="response") >= x, levels=c(F, T))))

# Predict TRUE if predicted probability at least 0
tables[[1]]
#     FALSE TRUE
#   0     0  100
#   1     0   50

# Predict TRUE if predicted probability at least 0.5
tables[[6]]
#     FALSE TRUE
#   0    86   14
#   1    29   21

# Predict TRUE if predicted probability at least 1
tables[[11]]
#     FALSE TRUE
#   0   100    0
#   1    50    0

从一个表到下一个表,由于截止值增加,一些预测从 TRUE 变为 FALSE,通过比较连续表的第 1 列,我们可以确定其中哪些代表真阴性和假阴性预测。遍历我们的列联表的有序列表,我们可以创建可以传递给 ROCR 的假预测值/结果对,确保我们匹配每个列联表的敏感性/特异性。

fake.info <- do.call(rbind, lapply(1:(length(tables)-1), function(idx) 
  true.neg <- tables[[idx+1]][1,1] - tables[[idx]][1,1]
  false.neg <- tables[[idx+1]][2,1] - tables[[idx]][2,1]
  if (true.neg <= 0 & false.neg <= 0) 
    return(NULL)
   else 
    return(data.frame(fake.pred=idx,
                      outcome=rep(c(0, 1), times=c(true.neg, false.neg))))
  
))

现在我们可以像往常一样将伪造的预测传递给 ROCR:

pred2 <- prediction(fake.info$fake.pred, fake.info$outcome)
perf2 <- performance(pred2,"tpr","fpr")
plot(perf2)

基本上我们所做的是对 ROC 曲线上的点进行线性插值。如果您有许多截止值的列联表,您可以更接近真实的 ROC 曲线。如果您没有广泛的截止范围,您就无法希望准确地再现完整的 ROC 曲线。

【讨论】:

以上是关于如何使用 r 中的 ROCR 包绘制 ROC 曲线,*只有分类列联表*的主要内容,如果未能解决你的问题,请参考以下文章

使用 ROCR 包的 R 中的 ROC 曲线

如何为 knn 模型绘制 ROC 曲线

使用 rocr 包的决策树 ROC 曲线

一个绘图中的多条 ROC 曲线 ROCR

R中的ROC曲线使用rpart包?

ROCR 包中截止值大于 1 的彩色 ROC 曲线