MENU

【無料プレゼント付き】学会発表・論文投稿に必要な統計を最短で学ぶことができる無料メルマガ

Rで実践:3つ以上のROC曲線を1つのグラフにまとめる手法


医療統計や機械学習において、複数の予測モデルの性能を比較する際、ROC曲線(受信者動作特性曲線)を1つのグラフに重ねて描画することは、視覚的な評価において極めて重要である。

本記事では、Rの標準的なパッケージであるpROCを用い、1本から3本、さらにはそれ以上のROC曲線を同一グラフ上に描画する手順を詳説する。


>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

目次

ROC曲線の基礎知識

ROC曲線は、判別モデルの閾値を変化させた際の「感度(Sensitivity)」と「1-特異度(1-Specificity)」の軌跡をプロットしたものである。

  • 縦軸(感度): 陽性のものを正しく陽性と判定する割合。
  • 横軸(1-特異度): 陰性のものを誤って陽性と判定してしまう割合。

グラフが左上隅に近ければ近いほど、そのモデルは優秀である。この曲線の下側の面積をAUC(Area Under the Curve)と呼び、この値が1に近いほど高精度であることを意味する。


事前準備:パッケージのインストール

ROC曲線を扱うための強力なパッケージ pROC をインストールして読み込む。

# パッケージのインストール(初回のみ)
install.packages("pROC")

# ライブラリの読み込み
library(pROC)

今回は、パッケージに付属している練習用データ aSAH(くも膜下出血のデータ)を使い、3つの予測指標(s100b, ndka, wfns)を比較する。


>>もう統計で悩むのは終わりにしませんか? 

↑1万人以上の医療従事者が購読中

基本:ROC曲線を1本だけ書く

まずは基本の1本である。roc() 関数でデータを計算し、plot() で描画する。

# データの準備(例:s100bという指標で結果を予測)
data(aSAH)
roc1 <- roc(aSAH$outcome, aSAH$s100b)

# 描画
plot(roc1, col="blue", main="ROC曲線")

※ ここでは、roc() 関数でROCオブジェクトを作成し、それを plot() に渡すという基本の流れを理解することが肝要である。


応用:2本のROC曲線を重ねる

2本目を重ねる際のポイントは、2回目のplot関数で add = TRUE という引数を追加することである。

# 2本目の計算(ndkaという別の指標)
roc2 <- roc(aSAH$outcome, aSAH$ndka)

# 1本目を描画(凡例のために少し余白を意識)
plot(roc1, col="blue", main="ROC曲線の比較")

# 2本目を重ねる
plot(roc2, col="red", add = TRUE)

※ add = TRUE を指定することで、新しいグラフを作成するのではなく、現在表示されているグラフの上に重ね書きを行う。これを忘れると、1本目のグラフが消えて新しいグラフに上書きされてしまうため注意が必要である。


本題:3本以上のROC曲線を1つにまとめる

3本以上になっても、基本は「2本目以降に add = TRUE を繰り返す」だけである。最後に凡例(Legend)を付け、どの色がどのモデルに対応するかを明示する。

# 3本のデータを準備
roc1 <- roc(aSAH$outcome, aSAH$s100b)
roc2 <- roc(aSAH$outcome, aSAH$ndka)
roc3 <- roc(aSAH$outcome, aSAH$wfns)

# 1本目:グラフの枠組みと最初の曲線を作成
plot(roc1, col="blue", lwd=2, main="3つのモデル比較")

# 2本目以降を重ねる
plot(roc2, col="red",  lwd=2, add=TRUE)
plot(roc3, col="green", lwd=2, add=TRUE)

# 凡例を追加して分かりやすく
legend("bottomright", 
       legend = c("S100B", "NDKA", "WFNS"), 
       col = c("blue", "red", "green"), 
       lwd = 2)

さらに見栄えを良くするコツ

実務や論文に掲載する場合、視認性を高めるために以下の設定を推奨する。

  • AUCを表示する: print.auc = TRUE を使うと、グラフ内に数値を表示できる。
  • 線を太くする: lwd = 2 などで視認性を向上させる(上記ですでに組み込み済み)。
  • 格子線を入れる: grid = TRUE で値が読み取りやすくなる。
# 数値表示を含めた例
plot(roc1, col="blue", lwd=2, print.auc=TRUE, print.auc.y=0.3, grid=TRUE, main="3つのモデル比較")
plot(roc2, col="red",  lwd=2, print.auc=TRUE, print.auc.y=0.2, add=TRUE)
plot(roc3, col="green", lwd=2, print.auc=TRUE, print.auc.y=0.4, add=TRUE)

print.auc.y は、AUCの数値が重ならないよう表示する高さを調整するための引数である。


まとめ

Rで複数のROC曲線を1つのグラフにまとめる手順は以下の通りである。

  1. roc() で各モデルのデータ(ROCオブジェクト)を作成する。
  2. 1本目を plot() 関数で描画する。
  3. 2本目以降は add = TRUE を付加して plot() を実行する。
  4. legend() で凡例を添える。

これにより、複数の手法の性能差をひと目で比較できる。解析の目的に応じて、色の使い分けやAUC値の表示を組み合わせて活用していただきたい。

おすすめ書籍

誰も教えてくれなかった 医療統計の使い分け〜迷いやすい解析手法の選び方が,Rで実感しながらわかる! 


よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

リサーチクエスチョン探し?データ分析?論文投稿?、、、で、もう悩まない!

第1章臨床研究ではなぜ統計が必要なのか?計画することの重要性
  • 推定ってどんなことをしているの?
  • 臨床研究を計画するってどういうこと?
  • どうにかして標本平均を母平均に近づけられないか?
第2章:研究目的をどれだけ明確にできるのかが重要
  • データさえあれば解析でどうにかなる、という考え方は間違い
  • 何を明らかにしたいのか? という研究目的が重要
  • 研究目的は4種類に分けられる
  • 統計専門家に相談する上でも研究目的とPICOを明確化しておく
第3章:p値で結果が左右される時代は終わりました
  • アメリカ統計協会(ASA)のp値に関する声明で指摘されていること
  • そうは言っても、本当に有意差がなくてもいいの…?
  • なぜ統計専門家はp値を重要視していないのか
  • 有意差がない時に「有意な傾向があった」といってもいい?
  • 統計を放置してしまうと非常にまずい
第4章:多くの人が統計を苦手にする理由
  • 残念ながら、セミナー受講だけで統計は使えません。
  • インプットだけで統計が使えない理由
  • どうやったら統計の判断力が鍛えられるか?
  • 統計は手段なので正解がないため、最適解を判断する力が必要
第5章:統計を使えるようになるために今日から何をすれば良いか?
  • 論文を読んで統計が使えるようになるための5ステップ
第6章:統計を学ぶために重要な環境
  • 統計の3つの力をバランスよく構築する環境

以下のボタンをクリックして、画面に出てくる指示に従って、必要事項を記入してください。

この記事を書いた人

統計 ER ブログ執筆者

元疫学研究者

コメント

コメントする

目次