不能产生与单个列联表的全部ROC曲线,因为列联表仅提供单个灵敏度/特异性对(无论预测截止值用于生成列联表)。
如果您有很多具有不同临界值的列联表,您可以近似ROC曲线(基本上它将是您的列联表中敏感性/特异性值之间的线性插值)。作为一个例子,让我们考虑预测采用Logistic回归花是否是菌在虹膜数据集:
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曲线。
我的问题是,我没有为我的文件“ROCR.simple”。 – 2015-02-10 23:26:42
好吧,如果您没有个人数据,请分享一些您*为数据提供的样本输入。 – MrFlick 2015-02-10 23:27:55
是你的表格的两个两个表格,每个独特的阈值有一个表格(例如,你有500张表格b/c他们创建的数据集有500个记录?) – Jthorpe 2015-02-11 00:37:41