39
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Pythonによる一般化線形モデル(GLM)入門

Last updated at Posted at 2016-02-06

一般化線形モデルとは

一般化線形モデルとは線形回帰やポアソン回帰、ロジスティック回帰などの、説明変数(x)によって応答変数(y)を説明する統計モデルの総称です。
さらに具体的に言うと、確率分布、線形予測子、リンク関数によって決まる統計モデルのことです。

確率分布

応答変数が従う確率分布です。
カウントデータなどの離散データを扱うためには、二項分布ポアソン分布がよく使われます。
株価などの連続量を表す連続データを扱うためには、正規分布ガンマ分布がよく使われます。

線形予測子

説明変数の一次結合で表されるモデル式のことです。
どの説明変数を使用するかであったり、どの交互作用項(説明変数の積で表される項)を使用するかを指定することができます。

z = β_0 + β_{1}x_{1} + β_{2}x_{2}

リンク関数

式を変換して線形予測子に対応させる関数のことです。
リンク関数のおかげで値が0から1しか取ることのできない確率も線形予測子に対応させることができます。
分布によって使うリンク関数はある程度決まっているので、詳しく知りたい人は記事下の参考にあるリンク先の書籍を参照してください。

log(y) = β_0 + β_{1}x_{1} + β_{2}x_{2}

Pythonでの実装

一般化線形モデルはRのglm関数を使えば簡単に実行することができます。
しかしながら、

  • R使いたくないよ
  • Pythonでやりたいよ

という人も多いと思うので、Pythonでやってみます。
探してみると、statsmodelsというRのglm関数のようなモジュールがありました。

モジュールのインストール

$ pip install statsmodels
$ pip install patsy # statsmodelsをimportしたら必要と言われたのでインストールしておく
$ pip install pandas # データ加工のためにインストールしておく

データ取得してモデリング

import statsmodels.api as sm
import pandas as pd

# 下の参考URLにあるデータを読み込み
data3a = pd.read_csv("http://hosho.ees.hokudai.ac.jp/~kubo/stat/iwanamibook/fig/poisson/data3a.csv")
# 変数xと定数項による線形予測子を作成
data3a.x_c = sm.add_constant(data3a.x)

# 分布はポアソン分布、リンク関数は対数リンク関数の一般化線形モデルを作成
# ポアソン分布の場合はデフォルトで対数リンク関数が指定される
model = sm.GLM(data3a.y, data3a.x_c, family=sm.families.Poisson())
result = model.fit()

# 結果
result.summary()

statsmodelsべんり!

おわりに

線形モデルなどの統計モデルを拡張した一般化線形モデルでしたが、やはり現実の事象はこれほど簡単なモデルには落とし込むことが難しいです。
下の書籍では一般化線形モデルの発展形である一般化線形混合モデルなどの手法も説明されているので、参考にしてください。

参考

39
43
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?