如何仅使用分类列联表在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)
最佳答案
您无法使用单个列联表生成完整的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 - 如何使用r中的ROCR软件包绘制ROC曲线*仅带有分类列联表*,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28443834/