jiku log

データサイエンスの核心を掴む : 学びと発見の記録

「データ解析のための統計モデリング入門」を読む ~第3章 一般化線形モデル(GLM)~

はじめに

数理統計学より実践的な内容の理解に向けて,久保 拓弥 著「データ解析のための統計モデリング入門 一般化線形モデル・階層ベイズモデル・MCMC」を読んでいる。

本記事は,第3章「一般化線形モデル(GLM)」の読書メモである。なおPythonコードは,ChatGPT 3.5を用いて作成し,動作確認を行なっている。

  • 本書の紹介ページ

www.iwanami.co.jp

第3章 一般化線形モデル(GLM) ―ポアソン回帰―

3.1 例題 : 個体ごとに平均種子数が異なる場合

本節では,第2章と第3章の問題設定の違いを説明している。

興味がある変数は,いずれも種子数 y_iである。
第2章では,この種子数を決めるのはポアソン分布のパラメータ \lambdaのみであり,全ての種子に共通であった。
一方第3章では,体の大きさ x_iと施肥の有無 f_iが追加されており,これらによって個体差が表現できるようになっている。

3.2 観測されたデータの概要を調べる

本節では,データの準備および基本統計量の計算のためのコードを説明している。

本書では,コードはR言語を用いているが,今回は同様の挙動をするPythonコードをGoogle Colab上で作成した。

コード

from google.colab import drive
drive.mount('/content/drive')

出力

Mounted at /content/drive


本書のサポートページから'data3a.csv'を入手し,読み込む。
コード

import pandas as pd
d = pd.read_csv('/content/drive/My Drive/Colab Notebooks/StatModeling/data3a.csv')
print(d.head())

出力

    y      x  f
0   6   8.31  C
1   6   9.44  C
2   6   9.50  C
3  12   9.07  C
4  10  10.16  C

3.3 統計モデリングの前にデータを図示する

本節では,データの可視化の例として,体の大きさ x_iと種子数 y_iの散布図を紹介している。この散布図に,さらに施肥の有無の情報も追加している。

コード

import matplotlib.pyplot as plt

# 散布図を作成
plt.scatter(d[d['f'] == 'C']['x'], d[d['f'] == 'C']['y'], color='white', edgecolor='black', label='C') # 'C'に対して白い丸
plt.scatter(d[d['f'] == 'T']['x'], d[d['f'] == 'T']['y'], color='black', label='T') # 'T'に対して黒い丸

# ラベルと凡例を追加
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

# グラフを表示
plt.show()


出力


次に,箱ひげ図を描く。
コード

grouped_data = [d[d['f'] == 'C']['y'], d[d['f'] == 'T']['y']]

# 箱ひげ図を描画
plt.figure(figsize=(8, 6))
plt.boxplot(grouped_data, labels=['C', 'T'])

# ラベルを追加
plt.xlabel('f')
plt.ylabel('y')

# グラフを表示
plt.show()


出力

3.4 ポアソン回帰の統計モデル

本節では,本書のテーマの一つである一般化線形モデルが導入されている。
一般化線形モデルのうち,カウントデータを表現するための統計モデルとして,ポアソン回帰モデルが説明されている。
ポアソン回帰モデルでは,まず種子数の確率 p(y_i|\lambda _i)ポアソン分布


 \begin{align}
p(y_i|\lambda _i) = \frac{ \lambda_i^{y_i} \exp{(-\lambda _i)} }{ y_i !}
\end{align}

にしたがうと仮定する。

ポアソン回帰モデルでは,さらに線形予測子(linear predictor)リンク関数(link function)を導入する。
ポアソン分布のパラメータ \lambda _iを,説明変数 x_iをもちいて


 \begin{align}
\lambda _i &= \exp{ ( \beta _1 + \beta _2 x_i ) } \\
\Rightarrow \log{\lambda _i } &=  \beta _1 + \beta _2 x_i
\end{align}


と表現する。この右辺 \beta _1 + \beta _2 x_i線形予測子と呼ぶ。この線形予測子を用いることで,ポアソン回帰のパラメータに,個体ごとの情報である x_iを含めることができる。
また,この左辺 \log{\lambda _i }の関数を,リンク関数と呼ぶ。この例では対数関数が使われているので,対数リンク関数と呼ぶ。
対数リンク関数を用いることで,ポアソン分布のパラメータについて \lambda _i \geq 0が満たされる。


ポアソン回帰では,観測データを用いて,ポアソン分布を用いた統計モデルのパラメータの推定を行なう。Pythonポアソン回帰を行なうためには,statmodelsパッケージを用いる。

コード

import numpy as np
import statsmodels.api as sm

# 説明変数と目的変数を定義
X = d['x']
y = d['y']

# 説明変数に定数項を追加
X = sm.add_constant(X)

# ポアソン回帰モデルをフィット
poisson_model = sm.GLM(y, X, family=sm.families.Poisson()).fit()

# モデルの要約を表示
print(poisson_model.summary())


出力

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                      y   No. Observations:                  100
Model:                            GLM   Df Residuals:                       98
Model Family:                 Poisson   Df Model:                            1
Link Function:                    Log   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -235.39
Date:                Tue, 15 Oct 2024   Deviance:                       84.993
Time:                        13:34:09   Pearson chi2:                     83.8
No. Iterations:                     4   Pseudo R-squ. (CS):            0.04414
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          1.2917      0.364      3.552      0.000       0.579       2.005
x              0.0757      0.036      2.125      0.034       0.006       0.145
==============================================================================

推定された回帰係数には,重回帰分析の出力のように,それぞれWald統計量の情報が示されている。最尤推定量が漸近的に正規分布にしたがうことから,信頼区間が算出されている,と解釈できる。

なお,最大対数尤度の値は出力の中に含まれており,

Log-Likelihood:                -235.39

と表示されている。

3.5 説明変数が因子型の統計モデル

3.4節では,施肥効果 f_iを用いていなかったが,本節ではこれを説明変数として組み込んだモデルを説明している。
この時のモデルは,


 \begin{align}
\lambda _i = \exp{ (\beta _1 + \beta _3 d_i) }

\end{align}


\begin{equation}
d_i=
\begin{cases}
0 & \text{if $f_i = C $ (施肥なし)} \\
1 & \text{if $f_i = T $ (施肥あり)}
\end{cases}
\end{equation}


である。

施肥効果 f_iは,値がCまたはTである2水準のカテゴリ変数であるため,ダミー変数に置き換える必要がある。

コード

# カテゴリ変数fをダミー変数に変換
# drop_first=Trueにより、'C'を基準カテゴリとして'T'のみをダミー変数にします
X = pd.get_dummies(d['f'], drop_first=True)

# 説明変数をfloat型に変換
X = X.astype(float)

# 定数項(切片)を追加
X = sm.add_constant(X)

# 目的変数
y = d['y']

# ポアソン回帰モデルをフィット
poisson_model = sm.GLM(y, X, family=sm.families.Poisson()).fit()

# モデルの要約を表示
print(poisson_model.summary())


出力

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                      y   No. Observations:                  100
Model:                            GLM   Df Residuals:                       98
Model Family:                 Poisson   Df Model:                            1
Link Function:                    Log   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -237.63
Date:                Tue, 15 Oct 2024   Deviance:                       89.475
Time:                        14:05:20   Pearson chi2:                     87.1
No. Iterations:                     4   Pseudo R-squ. (CS):          0.0003192
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          2.0516      0.051     40.463      0.000       1.952       2.151
T              0.0128      0.071      0.179      0.858      -0.127       0.153
==============================================================================

施肥効果 f_iを説明変数にした場合, x_iを説明変数にしたときと比べて,最大対数尤度が小さくなっている。

  •  x_iが説明変数の場合 : Log-Likelihood: -235.39
  •  f_iが説明変数の場合 : Log-Likelihood: -237.63

これは,施肥効果 f_iを説明変数にしたモデルの方が当てはまりが悪いためと考えられる。

3.6 説明変数が数量型+因子型の統計モデル

本節では,個体の体サイズ x_iと施肥効果 f_iの複数の説明変数を同時に組込んだ統計モデルを作っている。


 \begin{align}
\log{\lambda _i} =  (\beta _1 + \beta _2 x_i + \beta _3 d_i) 

\end{align}


コード

# カテゴリ変数fをダミー変数に変換
# drop_first=Trueにより、'C'を基準カテゴリとして'T'のみをダミー変数にします
X = pd.get_dummies(d[['x', 'f']], drop_first=True)

# 説明変数をfloat型に変換
X = X.astype(float)

# 定数項(切片)を追加
X = sm.add_constant(X)

# 目的変数
y = d['y']

# ポアソン回帰モデルをフィット
poisson_model = sm.GLM(y, X, family=sm.families.Poisson()).fit()

# モデルの要約を表示
print(poisson_model.summary())


出力

                 Generalized Linear Model Regression Results                  
==============================================================================
Dep. Variable:                      y   No. Observations:                  100
Model:                            GLM   Df Residuals:                       97
Model Family:                 Poisson   Df Model:                            2
Link Function:                    Log   Scale:                          1.0000
Method:                          IRLS   Log-Likelihood:                -235.29
Date:                Tue, 15 Oct 2024   Deviance:                       84.808
Time:                        21:45:52   Pearson chi2:                     83.8
No. Iterations:                     4   Pseudo R-squ. (CS):            0.04590
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          1.2631      0.370      3.417      0.001       0.539       1.988
x              0.0801      0.037      2.162      0.031       0.007       0.153
f_T           -0.0320      0.074     -0.430      0.667      -0.178       0.114
==============================================================================

3.7 「何でも正規分布」「何でも直線」には無理がある

今回作ったモデルは,種子数 y_iを予測するモデルである。線形回帰では,予測結果が負になることもある。また種子数 y_iは整数の値を取るので,誤差項として連続型確率密度関数である正規分布を用いることもふさわしくない。

本節では,上記のような理由から,データに合わせて確率分布とリンク関数を選べるGLMの方がよい,という説明をしていた。

まとめと感想

線形回帰モデルよりもデータの性質にあった予測ができるモデルとして,一般化線形モデルの一種であるポアソン回帰について説明がなされていて参考になった。
また,本書中ではRで書かれていたコードをPythonで書き直したが,実際にコードを動かしながら考えた方が,理解は進むと感じた。

本記事を最後まで読んでくださり,どうもありがとうございました。