2015-02-10 65 views
3

如何使用ROCR软件包绘制ROC曲线,仅带有分类列联表如何使用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)  
+0

我的问题是,我没有为我的文件“ROCR.simple”。 – 2015-02-10 23:26:42

+0

好吧,如果您没有个人数据,请分享一些您*为数据提供的样本输入。 – MrFlick 2015-02-10 23:27:55

+0

是你的表格的两个两个表格,每个独特的阈值有一个表格(例如,你有500张表格b/c他们创建的数据集有500个记录?) – Jthorpe 2015-02-11 00:37:41

回答

7

不能产生与单个列联表的全部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) 

enter image description here

现在让我们假设,而不是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) 

enter image description here

基本上我们所做的是一个点的线性插值,我们确实有在ROC曲线。如果你有很多临界值的列表,你可以更接近真实的ROC曲线。如果您没有广泛的截止频率,您无法准确再现完整的ROC曲线。