R ROCカーブの知識整理

こちらのページでもROCカーブを用いてきたが、改めて知識を整理しておく。ROCカーブはReceiver Operating Characteristicのことであり、モデルの善し悪しを表現する1つの手段と認識している。

以下は、あるメールがspamか否かをDecision Treeで予測した際のROCカーブとその関連用語の説明である。

f:id:nakhirot:20131016220031p:plain

f:id:nakhirot:20131016220046p:plain

1-False Positive RateはSpecificityとも呼ばれる。また、SensitivityはTrue Positive Rateとも呼ばれる。

8つの症例において、実際の疾患の有無と、検査結果(陽性/陰性)を検査値の閾値を変えて予測した場合のROCカーブを描いてみる。

Patient_ID <- c(1:8)
Disease <- c(0,0,1,0,1,0,1,1)
Test_Value <- c(2.5,4.5,5.5,6.5,8.5,9.5,13.5,15.5)
Predict <- rep(0,nrow(dat))
dat <- cbind(Patient_ID,Disease,Test_Value,Predict)
dat <- data.frame(dat)

sh <- c(2:16)
Specificity <- rep(0,length(sh))
Sensitivity <- rep(0,length(sh))
k <- 1

for (i in sh) {
  for (j in 1:nrow(dat)) {
    if (dat[j,"Test_Value"]>i) {
      dat[j,"Predict"] = 1
    } else {
      dat[j,"Predict"] = 0
    }
  }
  A <- nrow(subset(dat,dat[,"Disease"]==0 & dat[,"Predict"]==1))
  B <- nrow(subset(dat,dat[,"Disease"]==0 & dat[,"Predict"]==0))
  C <- nrow(subset(dat,dat[,"Disease"]==1 & dat[,"Predict"]==1))
  D <- nrow(subset(dat,dat[,"Disease"]==1 & dat[,"Predict"]==0))  
  Specificity[k] <- B/(A+B)
  Sensitivity[k] <- C/(C+D)
  k <- k + 1
}

plot(1-Specificity,Sensitivity,type="l")

結果はこちら。

f:id:nakhirot:20131016133813p:plain

前回はROCRなるパッケージを用いて描いた。上記の説明にあるようにROCRパッケージはcut-off pointをいろいろな断面にとり、予測モデルの予測値と実績値に対するROCカーブを描いてくれる(という理解である)。今回のコードでは、検査値の閾値を変えてROCカーブを描いている。どちらが真実なのであろうか?それとも、両者は同じ意味であるのだろうか?