クイックノート

ちょっとした発見・アイデアから知識の発掘を

ロジスティック回帰の完全分離

ある事象が生じる確率を、
複数の変数から説明する際によく使われるのが、
ロジスティック回帰です。

ロジスティック回帰を行う上で、
上手く推定ができない問題として、
完全分離と呼ばれる現象があります。

ここでは、この完全分離が、
なぜロジスティック回帰を行う上で問題になるかを見ていきましょう。

ロジスティック回帰とは

ロジスティック回帰とは、
ある事象が生じる確率を複数の変数で説明するものです。

例えば試験に合格する・しないという事象を
Y=1,0 で表した時に、
試験に合格する確率 p = P(Y=1) を、
年齢などの変数 X で説明する問題が考えられます。

説明変数が一つの場合は、
確率 p を次の式で説明変数に回帰します。

 p = \frac{1}{1+e^{-(\alpha + \beta X)}}
ただし、\alpha,\betaはデータから推定すべきパラメータです。

説明変数が増えた場合は、次のような式になります。

 p = \frac{1}{1+e^{-(\alpha + \beta_1 X_1 + \beta_2 X_2 + \cdots)}}
説明変数の数だけパラメータ\beta_1,\beta_2,\cdotsが増えています。

モデルのパラメータは、
通常、最尤推定等を用いてデータにフィットした値を求めます。

完全分離

ロジスティック回帰のパラメータ推定が上手くいかなくなる原因として、
完全分離と呼ばれる現象があります。

完全分離とは、
説明変数の値をある境界値で分割することで、
説明しようとする事象の有無が綺麗にグループ分け出来ている状態です。

例えば、次のような状況では完全分離が生じます。
テストの点数が60点以上の人を合格とします。
ある人が合格かどうかをテストの点数を説明変数として、
合格確率を説明することを考えてみましょう。

この場合、テストに合格か否かは、
テストの点数Xが60点以上かどうかで綺麗に分かれます。
X \ge 60 \Leftrightarrow Y=1(合格)
X \lt 60 \Leftrightarrow Y=0(不合格) このような状況を完全分離と呼びます。

逆に完全分離じゃない状況とは、
テストに59点で合格の人がいたり、
61点でも不合格の人がいたりするように、
説明変数の値を二分して綺麗に合格・不合格が分かれない状況を指します。

完全分離でロジスティック回帰を強行すると

完全分離の状況で、
ロジスティック回帰を実行すると、
どんな問題が起こるでしょうか。

Rで試してみることにします。

データの生成

上で述べた例を試してみましょう。
テストに60点以上であれば合格であるとして、
合格する確率をテストの点数で説明します。

N = 100
x = rnorm(N,mean = 50,sd=30) 
x = sapply(x,function(x){
  max(min(x,100),0)
})
y = x > 60

Nはテストを受けた人の数で、
100人分のテストの点数を正規分布で生成し、xとしています。
また、点数が60点以上かどうかで合否の判定yを生成しています。

生成されたデータは下のようになります。
当然ですが、60点を界に合格・不合格が分かれていて、
完全分離なデータとなっています。

f:id:u874072e:20191128145323p:plain
生成されたデータ

ロジスティック回帰の実行

では、上で生成したデータに対してロジスティック回帰を行ってみましょう。

res = glm(y~x,family = binomial("logit"))

すると下のような警告が表示されます。
モデルのフィッティングが収束しなかったようですね。

警告メッセージ:
1: glm.fit: アルゴリズムは収束しませんでした
2: glm.fit: 数値的に 0 か 1 である確率が生じました

summary(res)で計算された係数パラメータをみてみると、

Coefficients:
      Estimate Std. Error z value Pr(>|z|)
(Intercept) -513.362 141611.471 -0.004 0.997
x      8.599 2373.034 0.004 0.997

となっていて、
Std.Error(標準誤差)が極めて大きい値になっていることが分かります。

何故パラメータの推定が収束しないか

それではどうして完全分離があると、
ロジスティック回帰は上手くできないのでしょうか。

結論から言うと、完全分離な状況では、
ロジスティック回帰モデルが上手くフィットするような、
パラメータの解が決まらないのです。

以降で詳しくみていきましょう。

シグモイド関数

ロジスティック回帰モデルの式は、
シグモイド関数と呼ばれる関数の形式をしています。

シグモイド関数は、次の式で表され、
\varsigma(x)=\frac{1}{1+e^{-x}}

これを使うと、ロジスティック回帰モデルは、
p=\varsigma(\alpha+\beta x)
と書けます。

シグモイド関数は0から1に値を取る函数で、
x に対して単調に増加します。

下のグラフはシグモイド関数\varsigma(ax)
係数aを様々に変えたものです。

f:id:u874072e:20191128153405p:plain
シグモイド関数

グラフから、S字の形で0から1に単調増加していること、
係数を変えるとS字の傾きが変わることが分かります。
係数を大きくするほどS字はよりシャープになります。

完全分離に対するシグモイド曲線のフィッティング

ロジスティック回帰モデルが、
シグモイド関数で表されることから、
パラメータの推定とは、
S字カーブを如何にフィッティングさせるかであることが分かります。

完全分離の状況では、説明変数のある値を界に、
事象が生じる確率が0から1に急激にシフトするので、
そのようなシグモイド曲線が得られるような
パラメータを探すことになります。

f:id:u874072e:20191128155025p:plain
完全分離のデータによって推定されたシグモイド曲線

実際、上のテストの例で無理やりフィットさせたモデルのパラメータを使うと、
60点の前後で確率が0から1へと急激にジャンプしている関数が得られます。

傾きが無限に大きくなる

ところが、あくまでシグモイド関数はS字のカーブなので、
どれだけ傾きを大きくしても、
有限の傾きでは、0から1の完全なジャンプが実現できる訳ではありません。

0から1への理想的な切り替わりを実現するには、
無限の傾きが必要になりますが、
これは、モデルのパラメータを無限に大きくする必要があることになります。

テストの点数の例で見てみましょう。
シグモイド関数x=0 でちょうど中間の0.5の値を取るので、
\alpha+\beta*60=0となるように、
係数を決めれば、60点を境界にできそうです。
(本当は合格に60点が含まれているので、
 59〜60点の間の値にする必要がありますが簡略化します。)

この時、\beta=-\frac{alpha}{60}betaを決めることにして、
\alphaを自由に動かしてシグモイド関数の傾きを変えることができます。

すると、下のグラフのように、
\alpha の値を-10,-20,-50と負の方向に大きくするにつれて、
S字の傾きがシャープになるのが分かります。

f:id:u874072e:20191128160443p:plain
αの値を変化させた時のシグモイド関数

では、パラメータをどこまで大きくすれば良いかと言うと、
理想的には無限に大きくしないと、
0から1へのジャンプする関数にならないので、
有限の値のパラメータでは完全分離のデータにフィットできません。

このため、完全分離のデータでは、
ロジスティック回帰が上手くいかないのです。

まとめ

ロジスティック回帰の際に生じる完全分離について紹介しました。

ここでは、テストの点数によって決まる合否をテストの点数で説明するという
自明な状況を例にとって説明しましたが、
実際には、データが少なすぎて、
たまたま領域が重なる説明変数がなくて、
完全分離に遭遇することもあります。

プライバシーポリシー