🟠

ロジスティック回帰 (二項分布)

2023/10/01に公開

はじめに

今回もロジスティック回帰(logistic regression)を扱います。
ただし、少し変わっているので(個人的にはどうやんだろう)ってなった問題です。
yが二項分布にしたがっているときのロジスティック回帰分析です。
普段は2値のロジスティック回帰だと思いますが、二項分布にしたがっているので分類という感じではなく、回帰のような使い方をしています。多クラス分類の話でもないです。

一般的なロジスティック回帰はこちら
https://zenn.dev/totopironote/articles/48e39f9b7fef2b

設定

用量反応実験

マウスがn=10匹の群が11個あり、薬の投与量xが少ない順に1,2,…,11と群に番号がついている。

y_i = 群iのマウスの死亡数 , 死亡率 p_i= y_i /10 とする。

x y p
1 0 0.0
2 0 0.0
3 0 0.0
4 3 0.3
5 6 0.6
6 6 0.6
7 5 0.5
8 9 0.9
9 9 0.9
10 10 1.0
11 10 1.0

yを二項分布でモデル化すると

y_i \hspace{2pt} i.i.d. \hspace{2pt}Bi(n_i,\pi_i) , i=1,2,...,N

N=11であり、n_iはすべて10である。

E[p_i]=E[y_i]/10=\pi_i

より\pi_ip_iによって不偏推定される。

ロジットパラメータ\lambdaが以下の一次関数でかけるとする。

\lambda_i = \log\left \{\frac{\pi_i}{1-\pi_i}\right\}=\beta_0+\beta_1x_i

xは投与量である。

\piについて書き直すと

\pi_i = (1+e^{-\lambda})^{-1}

最尤推定

最尤推定量(\hat{\beta_0},\hat{\beta_1})を求める。

まず、二項分布の尤度関数L

L = \Pi_{i=1}^N\begin{pmatrix}n_i\\ y_i\end{pmatrix}\pi^y_i(1-\pi_i)^{n_i-y_i}

マイナス対数尤度l

\begin{align*} l = -\log L &\propto -\sum_{i=1}^N\{y_i\log \pi_i + (n_i-y_i)\log (1-\pi_i)\} \\ &= -\sum_{i=1}^N\left\{y_i\log\left (\frac{\pi_i}{1-\pi_i}\right) +n_i \log(1-\pi_i)\right\}\\ &= \sum_{i=1}^N \{-y_i(\beta_0+\beta_1x_i)+n_i\log (1+e^{\beta_0+\beta_1x_i})\} \end{align*}

\beta_0,\beta_1で1回微分すると

\begin{align*} \frac{\partial l}{\partial \beta_0} &=\sum_{i=1}^N \{\frac{n_i\exp(\beta_0+\beta_1x_i)}{1+\exp(\beta_0+\beta_1x_i)}-y_i\}\\ &=\sum_{i=1}^N(n_i\pi_i-y_i)=0 \end{align*}
\begin{align*} \frac{\partial l}{\partial \beta_1} &=\sum_{i=1}^N \{\frac{n_ix_i\exp(\beta_0+\beta_1x_i)}{1+\exp(\beta_0+\beta_1x_i)}-x_iy_i\}\\ &=\sum_{i=1}^N\{x_i(n_i\pi_i-y_i)\}=0 \end{align*}

\pi_iの微分を考えると

\frac{\partial \pi_i}{\partial \beta_0} = \pi_i(1-\pi_i) , \frac{\partial \pi_i}{\partial \beta_1} = x_i\pi_i(1-\pi_i)

よって2回微分はx_0=1としている。j,k=0,1に対して

\frac{\partial^2 l}{\partial \beta_j\partial \beta_k}=\sum_{i=1}^Nx_{ij}x_{ik}n_i\pi_i(1-\pi_i)

以上の計算を綺麗にベクトル表記に直すと

\utilde{\beta}=\begin{pmatrix} \beta_0\\ \beta_1 \end{pmatrix}, X=\begin{pmatrix} 1 &x_{1} \\ 1 &x_{2}\\ \vdots & \vdots \\ 1 &x_{N} \end{pmatrix},\utilde{y}=\begin{pmatrix} y_1\\ \vdots\\ y_N \end{pmatrix}
\utilde{\pi} = \begin{pmatrix} \pi_1\\ \vdots\\ \pi_N \end{pmatrix}, \log\frac{\utilde{\pi}}{1_N-\utilde{\pi}}=\begin{pmatrix} \log\frac{\pi_1}{1-\pi_1}\\ \vdots\\ \log\frac{\pi_N}{1-\pi_N} \end{pmatrix}=X\utilde{\beta},\utilde{\mu}=\begin{pmatrix} n_1\pi_1\\ \vdots\\ n_N\pi_N \end{pmatrix}

これらを用いると、

マイナス対数尤度は

l = \log(1+\exp(X\utilde{\beta}))-\utilde{y}^TX\utilde{\beta}

1回微分は

\dot{l} = X^T(\utilde{\mu}-\utilde{y})=0

2回微分は

\ddot{l} = X^TVX, V=diag(v_1,\cdots,v_N),v_i=n_i\pi_i(1-\pi_i)

よってニュートンラフソン法より

\begin{align*} \utilde{\beta}^{new}&=\utilde{\beta}^{old}-\ddot{l}^{-1}\dot{l}\\ &=\utilde{\beta}^{old}-(X^TVX)^{-1}X^T(\utilde{\mu}-\utilde{y}) \end{align*}

回帰曲線の図示

まず、回帰曲線は最尤推定量(\hat{\beta_0},\hat{\beta_1})を代入したものである。

\hat{\pi}(x)=(1+e^{-(\hat{\beta}_0+\hat{\beta}_1x)})^{-1}

pythonでsklearnを用いて図示する方法を説明する。

2値のロジスティック回帰の文脈に乗っけて使う。

そのためpの値が0.5より大きいものを1,0.5以下を0としている。

x = range(1, 12)
y = [0, 0, 0, 3, 6, 6, 5, 9, 9, 10, 10]
y_ = [0 if i/10 <= 0.5 else 1 for i in y]

from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
# データをフィットさせる
X = [[i] for i in x]  # データを2D配列に変換
model.fit(X, y_)

new_x = np.linspace(0, 12, 100)  # 0から12の範囲を100等分したデータを生成
new_X = np.array([[i] for i in new_x])
predicted_probabilities = model.predict_proba(new_X)  # クラスの所属確率を取得
predicted_p = predicted_probabilities[:, 1]  # 死亡率が1となる確率を取得

p =[i/10 for i in y]
plt.scatter(x,p)
plt.xlabel('投与量')
plt.ylabel('死亡率')
plt.plot(new_x, predicted_p, color='r', label='Predicted')  # 予測結果のプロット
plt.legend()  # 凡例の表示
plt.show()  # グラフの表示

標準誤差

単純な標準誤差を求める。

sd = [\hat{\pi}(x)(1-\hat{\pi}(x))/10]^{1/2}
x 1 2 3 4 5 6 7 8 9 10 11
sd 0.058424 0.081335 0.109124 0.137118 0.155646 0.155277 0.136224 0.108096 0.08043 0.057721 0.040653

まとめ

教科書と若干数値がずれたのが気になるけど、ほぼ2値のロジスティック回帰と同じような感じになった。

参考文献

  • Bradley Efron,Trevor Hastie 「大規模計算時代の統計推論」

Discussion