如何使用 r 中的 ROCR 包绘制 ROC 曲线,*只有分类偶然性 table*
How to plot a ROC curve using ROCR package in r, *with only a classification contingency table*
如何使用 r 中的 ROCR 包绘制 ROC 曲线,只有分类偶然性 table?
我有一个意外事件 table 可以计算出真阳性、假阳性……等等。我有 500 次复制,因此有 500 tables。但是,我无法生成预测数据来指示估计概率和真相的每个案例。如果没有个人数据,我如何获得曲线。
下面是使用的包指令。
## 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)
您无法使用单个意外事件 table 生成完整的 ROC 曲线,因为意外事件 table 仅提供单个 sensitivity/specificity 对(对于用于生成意外事件的任何预测截止值table).
如果您有许多使用不同截止值生成的偶然事件 table,您将能够近似 ROC 曲线(基本上它将是您的 sensitivity/specificity 值之间的线性插值应急 tables)。例如,让我们考虑使用逻辑回归预测鸢尾花数据集中的花是否为云芝:
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
,而是具有多个预测截止值的偶然事件 table:
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
从一个 table 到下一个 table 由于截止值增加,一些预测从 TRUE 变为 FALSE,通过比较连续 table 的第 1 列,我们可以确定其中哪些代表真阴性和假阴性预测。遍历我们有序的意外事件 table 列表,我们可以创建假的预测 value/outcome 对,我们可以将其传递给 ROCR,确保我们匹配每个意外事件 table 的 sensitivity/specificity。
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 曲线上的点进行线性插值。如果您有许多截止点的偶然性 tables,您可以更接近真实的 ROC 曲线。如果您没有广泛的截止值,您就无法准确地重现完整的 ROC 曲线。
如何使用 r 中的 ROCR 包绘制 ROC 曲线,只有分类偶然性 table?
我有一个意外事件 table 可以计算出真阳性、假阳性……等等。我有 500 次复制,因此有 500 tables。但是,我无法生成预测数据来指示估计概率和真相的每个案例。如果没有个人数据,我如何获得曲线。 下面是使用的包指令。
## 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)
您无法使用单个意外事件 table 生成完整的 ROC 曲线,因为意外事件 table 仅提供单个 sensitivity/specificity 对(对于用于生成意外事件的任何预测截止值table).
如果您有许多使用不同截止值生成的偶然事件 table,您将能够近似 ROC 曲线(基本上它将是您的 sensitivity/specificity 值之间的线性插值应急 tables)。例如,让我们考虑使用逻辑回归预测鸢尾花数据集中的花是否为云芝:
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
,而是具有多个预测截止值的偶然事件 table:
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
从一个 table 到下一个 table 由于截止值增加,一些预测从 TRUE 变为 FALSE,通过比较连续 table 的第 1 列,我们可以确定其中哪些代表真阴性和假阴性预测。遍历我们有序的意外事件 table 列表,我们可以创建假的预测 value/outcome 对,我们可以将其传递给 ROCR,确保我们匹配每个意外事件 table 的 sensitivity/specificity。
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 曲线上的点进行线性插值。如果您有许多截止点的偶然性 tables,您可以更接近真实的 ROC 曲线。如果您没有广泛的截止值,您就无法准确地重现完整的 ROC 曲线。