web-dev-qa-db-ja.com

rでROCRパッケージを使用してROC曲線をプロットする方法、*分類分割表のみ*

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)    
6
William Liu

分割表は単一の感度/特異度ペアのみを提供するため(分割表の生成に使用された予測カットオフに対して)、単一の分割表で完全な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)

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曲線を正確に再現することは期待できません。

13
josliber