ROC曲線下の面積

ROC曲線のAUC(Area Under the Curve)はAUCは0から1までの値をとる。値が1だと完全に判別ができており、ランダムであるとき、AUC = 0.5となる。

医学で尺度(連続変数)と診断(2値)の一致度、つまり併存妥当性を表すときに使うらしい。論文でもよく使われるそうだ。僕は馴染みがないがない方法なので、使用例をどこかで探しておこうと思う。

ちなみに、ROC曲線は奥村晴彦先生の解説がわかりやすいと思う。

データの作成

尺度と診断の一致度を見るという設定で書いてみる。サンプルサイズは100である。

set.seed(101)
N   <- 100
x  <- rnorm(N, 20, 8)
y  <- x + rnorm(N, 0, 8)
y2 <- ifelse(y <= median(y), 0, 1)
x2 <- round(x)
summary(x2)
summary(y2)

仮想の尺度をx2として作成した。最小値が1、最大値が35である。こういった尺度はよくあるタイプのものだ。

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
1.00   14.00   20.00   19.67   25.00   35.00

y2は診断で0/1で示してある。

> table(y2)
y2
 0  1
50 50

計算

ROC曲線のを求めるのにpROCパッケージを使用する。

library(pROC)
rocRes <- roc(y2 ~ x2, plot=TRUE, ci=TRUE,
               main="ROC-curve",
               xlab="specificity (TN / (TN+FP))",
               ylab="sensitivity (TP / (TP+FN))")
rocCI <- ci.se(rocRes) # 感度の信頼区間を計算
plot(rocCI, type="shape")

roc関数のmainはタイトル、xlabはx軸の名前、ylabはy軸の名前でごちゃごちゃしている感じになっている。

とりあえず1行目だけはしっかり書いておけば問題ない。plotはプロットするかどうか、ciは信頼区間を表示するかどうかである。2つとも通常は利用するのでそのままでよい。

結果は次のようになった。

Area under the curve: 0.8558
95% CI: 0.7841-0.9275 (DeLong)

一致度を見るのであれば、感度の信頼区間の計算は必要がないので省いてもいい。つまりci.se関数を使用している下2行は不要ということだ。ブートストラップを使用するので計算時間が比較的かかってマシン的につらい状態になる。

f:id:iDES:20191008152532p:plain