ROC曲線

Receiver Operating Characteristic (ROC) 曲線は、ある連続変数によって2値変数の目的変数をどの程度識別できる可視化するグラフとして使用されます。つまり、2値ロジスティック回帰分析のような2値分類において、分類モデルの性能を評価するために使用されます。真陽性率 (sensitivity) と偽陽性率 (1-specificity) の関係をプロットすることとなります。ROC曲線の可視化とともに、ほとんどの場合、その曲線した面積 (area under curve; AUC) の大きさを合わせて報告することとなります。AUCが大きいほどモデルの性能が良いとされます。

感度と特異性

2値分類は例えばYesNo語彙テストのようなものが考えられます。YesNo語彙テストでは、実在語・擬似語を学習者に提示し、学習者は目標語を知っていればYes、知らなければNoと回答します。Gyllstad (2007) はコロケーションのYesNo語彙テスト (COLLMATCH) を作成しました。実在のコロケーションと実在しないコロケーションを提示し、実在するコロケーションにチェックをつけることとなります。YesNo形式のテストに擬似語を含める理由として、false alarm (知らない単語に対して知っていると回答してしまう) の割合は未知語の random guessing (overestimation) の指標となることが挙げられます。また、受験者が保守的になり、知っている実在語に対しても知らない (No) と回答してしまう (underestimation) 場合や、知らない実在語に対して知っている (Yes) と回答してしまう (overestimation) 場合があります。

実在語 擬似語
解答:Yes Hit (sensitivity) False Alarm
解答:No Miss (1-specificity) Correct Rejection

新型コロナウイルスのPCR検査キットの性能を評価するために、ROC曲線を使用するとします。このPCR検査キットでは、感染の可能性がある患者とそうではない患者に対して検査を行い、感染している確率を0から1の間で出力します。

ROC曲線は、異なる閾値でHit率とFalse Alarm率をプロットすることで作成されます。AUCが大きいほど、感染済みの患者と未感染の患者をより正確に識別できる検査法であると言えます。

Rでの実装

ROC曲線については2値ロジスティック回帰分析の際にモデル比較の方法として紹介していました。今回はより具体的に見ていきましょう。Rでデフォルトで読み込まれているirisデータを使います。

目的変数yは0か1となります。rbinom関数は二項分布に基づく2値データを自動で発生させる関数になります。

2値ロジスティック回帰分析を実行する関数はglm関数となります。

# パッケージの読み込み
library(performance)
library(bayestestR)
library(lmerTest)
library(mgcv)
library(pROC)

# テーマの設定
theme_set(theme_classic())

# データの読み込み
data(iris)

# 使用データの整形
set.seed(123)
iris$y <- rbinom(nrow(iris), size = 1, .4)
iris$ID <- rep(1:50, length.out = nrow(iris))

今回は2種類の回帰分析について検討します。線型回帰であるGLMとGLMM、非線形回帰であるGAMとGAMMを用いて2値ロジスティック回帰分析の予測精度を確認していきましょう。線型回帰に用いるのはlmerTestパッケージ、非線形回帰に用いるのはmgcvパッケージとなります。線型回帰においてはperformanceパッケージのperformance_roc関数を使うことができますが、非線形回帰においては使えません。そこでpROCパッケージのroc関数を使って実装してみます。

今回使用するデータはRにデフォルトで読み込まれているirisデータとなります。目的変数はyの0か1の2値データ、IDはランダム効果として扱います。

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species y ID
1          5.1         3.5          1.4         0.2  setosa 0  1
2          4.9         3.0          1.4         0.2  setosa 1  2
3          4.7         3.2          1.3         0.2  setosa 0  3
4          4.6         3.1          1.5         0.2  setosa 1  4
5          5.0         3.6          1.4         0.2  setosa 1  5
6          5.4         3.9          1.7         0.4  setosa 0  6

まずは一般化線型モデルから作成していきます。glm関数を用い、family = “binomial” を指定すると、2値ロジスティック回帰分析を実行することができます。GLMM、GAM、GAMMのいずれもfamilyの部分は共通しています。

# GLM
model_1 <- glm(y ~ Sepal.Length + Petal.Length, data = iris, family = "binomial")
model_2 <- glm(y ~ Sepal.Length + Sepal.Width, data = iris, family = "binomial")
model_3 <- glm(y ~ Sepal.Length, data = iris, family = "binomial")
model_4 <- glm(y ~ Sepal.Width, data = iris, family = "binomial")

続いてはGLMMの実行です。lme4パッケージのglmer関数を使い、(1 | ランダム切片) を指定するとランダム効果を考慮することができます。

# GLMM
model_5 <- glmer(y ~ Sepal.Length + Petal.Length + (1 | ID), data = iris, family = "binomial")
model_6 <- glmer(y ~ Sepal.Length + Sepal.Width + (1 | ID), data = iris, family = "binomial")
model_7 <- glmer(y ~ Sepal.Length + (1 | ID), data = iris, family = "binomial")
model_8 <- glmer(y ~ Sepal.Width + (1 | ID), data = iris, family = "binomial")

それではperformanceパッケージのperformance_roc関数を使ってみましょう。