不能產生與單個列聯表的全部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](https://i.stack.imgur.com/FkpCF.png)
現在讓我們假設,而不是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](https://i.stack.imgur.com/dvtZJ.png)
基本上我們所做的是一個點的線性插值,我們確實有在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