【GLMM】一般化線形混合モデルについてわかりやすく解説
1. 一般化線形モデル (GLM) と固定効果モデル
まずは、前提知識を確認しましょう。
- 一般化線形モデル (Generalized Linear Model)
- 応答変数 ${Y}$ が、正規分布や二項分布、ポアソン分布などの指数型分布族に従うと仮定するモデル枠組み。
- 応答変数の期待値 ${\mu}$ と線形予測子 ${\eta}$ を、リンク関数 ${g(\cdot)}$を通じて結び付ける。
- ${g(\mu_i) = \eta_i = X_i \beta }$
- 例: ロジスティック回帰(リンク関数がロジット)、ポアソン回帰(リンク関数が対数)
- 固定効果モデル (Fixed Effects Model)
- 例えばパネルデータ分析などで、データをグループや個体単位にダミー変数を加えることで固定効果(グループごとに一定の差)を推定する。
- 多くのダミー変数を入れざるを得なくなる場合や、グループ数が大きい場合、パラメータが膨大になるなどの実務的な制約が生じることがある。
2. 一般化線形混合モデル (GLMM) の位置づけと特長
「GLMM = 一般化線形モデル + 混合効果」
GLMM は、一般化線形モデルに「ランダム効果」を導入したものであり、固定効果とランダム効果を同時に扱う混合効果モデルの一種に位置づけられます。
一般線形モデルじゃないですよ。
2.1 モデルの定式化
一般化線形混合モデルでは、GLM の「線形予測子」部分にランダム効果項を含めた拡張形を考えます。
具体的には、ある観測 ${i}$ について応答変数 ${Y_i}$の期待値が
$${g(\mu_i) = X_i \beta + Z_i u}$$
という形で表されます。
- ${X_i}$ は固定効果に対応するデザイン行列
- ${\beta}$ は固定効果のパラメータベクトル
- ${Z_i}$ はランダム効果に対応するデザイン行列
- ${u}$ はランダム効果パラメータ
- ${u \sim \mathcal{N}(0, G)}$
ランダム効果 ${u}$ は、各グループや被験者、あるいは施設などに固有の影響をモデル化するための変量効果であり、これによって集団全体の平均的効果(固定効果)に加えて、各グループに固有の差異を推定可能になります。

混合効果という名称は、このように固定効果とランダム効果の両方を「混合」して推定することに由来します。
2.2 固定効果とランダム効果の違い
計量経済学でよく使われる概念なのですが、書籍やサイトによっては定義が揺れていたりします。
- 固定効果 (Fixed Effects)
固定効果は、「モデル化対象となる集団全体に共通する影響」を表し、最終的に推定されるパラメータは特定の値をとります。- 宗教観や住む場所の文化など、定量化しづらいand観測しづらい事象でも、結婚するかどうかなどの目的変数に影響があるものはあります。
- 特徴として、時間を通じて常に変わらない値
- ランダム効果 (Random Effects)
ランダム効果は、データが所属するグループや被験者などに個体固有の影響を表すために導入されます。グループや被験者が多数あり、それぞれに別々のパラメータを割り当てるのが現実的でない場合に、一種の確率分布を仮定して推定します。
- ランダム効果の導入
- 「個体差」や「グループ差」を確率効果としてモデル化し、より柔軟にデータの階層構造や変動要因を考慮できる。
- ただ説明変数とは、相関しないという強めの前提が置かれているため、固定効果推定量よりも信憑性が低いと言われています…
- 「個体差」や「グループ差」を確率効果としてモデル化し、より柔軟にデータの階層構造や変動要因を考慮できる。
- より少ないパラメータで大規模データにも対応
- 固定効果モデルのように多数のパラメータを増やさず、ランダム効果の分散成分を推定することで、階層データにうまくフィットできる。
- 様々な分布とリンク関数
- GLM 同様、二項分布やポアソン分布などの指数型分布族を用いた上で、ロジットや対数などのリンク関数を自由に選択できる。
何が嬉しいか
GLMM は「集団全体に共通する平均的な影響(固定効果)と、グループや個体ごとに異なる影響(ランダム効果)の両面を考慮したモデル」
4. 代表的なリンク関数の例
GLMM でもリンク関数は一般化線形モデルと同様に、用途に応じて様々なリンク関数が用いられます。
- ロジットリンク: 二項分布モデル(ロジスティック回帰)で用いられる
- ${\eta = \log \left(\frac{\mu}{1 – \mu}\right)}$
- プロビットリンク: 二項分布モデル(プロビット回帰)で用いられる
- ${\eta = \Phi^{-1}(\mu)}$(${\Phi}$ は標準正規分布の累積分布関数)
- 対数リンク: ポアソン回帰で用いられる
- ${\eta = \log(\mu)}$
- 恒等リンク: 正規分布の場合に用いられる
- ${\eta = \mu}$
ロジットリンクや対数リンクがよく登場しますね。
3. GLMM の活用例 マーケ領域 (広告効果検証)
- シナリオ: オンライン広告を複数の顧客セグメント(年齢層、地域など)で配信して効果を検証する場合。
- 何が問題か: 各セグメントで広告クリック率や購入率などが違うため、単純なロジスティック回帰(GLM)ではセグメント間の変動を一括で扱えず、固定効果モデルでは膨大なセグメント数に応じたダミー変数が必要になる。

まあ、CPAが低いなどの効率がいい広告に配信が寄るように、最適化はされちゃうのですが、「結局どんなターゲットに刺さりやすい?」「効率がいいメッセージングは何?」みたいな検証の振り返りの際には、必要なプロセスだとは思います。
- GLMM の利点:
- ランダム効果で多数のキャンペーン差異を扱う
- たとえばエリア別(都市部/地方)、デバイス別(スマホ/PC/APP)など、固定効果モデルでは煩雑になりがちなクラス分割を、各セグメントの「ランダム効果」として扱える。
- より多様な分布・リンク関数
- クリック率・CVR (Conversion Rate) などの二項データをロジットリンクで扱う典型例のほか、広告費やインプレッション数など、過剰分散のあるカウントデータをポアソン分布や負の二項分布で拡張するなど、多様な状況に適応しやすい。
- ランダム効果で多数のキャンペーン差異を扱う
負の二項分布は、ポアソン分布よりも過剰分散のデータを扱いやすいという理由で採用されたりしますね。
詳しくは、以下の記事をご覧ください。
4. Python での実装例
よく使われる statsmodels ライブラリを用いた実装例を簡単に示します。以下の例は、二項データ(例: 広告クリックあり/なし)をロジスティック回帰ベースの GLMM で分析するという想定です。
4.1 データの準備
import numpy as np
import pandas as pd
# 仮想データ作成
np.random.seed(42)
n_groups = 10
group_size = 50
n_samples = n_groups * group_size
# グループID
group_ids = np.repeat(range(n_groups), group_size)
# 固定効果の説明変数 (例: 広告のインプレッション数など)
X_continuous = np.random.normal(loc=10, scale=2, size=n_samples)
# 真の固定効果パラメータ
beta_0 = -2.0 # 切片
beta_1 = 0.3 # 広告インプレッションの効果
# ランダム効果の生成 (グループ単位)
u_true = np.random.normal(loc=0.0, scale=0.5, size=n_groups) # ランダム効果の分散=0.5^2と仮定
# 線形予測子の生成
eta = beta_0 + beta_1 * X_continuous + u_true[group_ids]
# ロジスティックリンク
p = 1 / (1 + np.exp(-eta))
# 応答変数 (クリックしたかどうか: 1 or 0)
Y = np.random.binomial(n=1, p=p, size=n_samples)
df = pd.DataFrame({
'Y': Y,
'X_cont': X_continuous,
'group_id': group_ids
})
4.2 GLMM のfit
statsmodels の混合効果モデル (MixedLM
) は、現時点ではガウス応答(線形混合モデル)を主にサポートしています。二項応答の一般化については、別途近似を入れて対処するか、statsmodels
の BinomialBayesMixedGLM
を使う方法などがいいっすね。
BinomialBayesMixedGLM の例
import statsmodels.api as sm
from statsmodels.formula.api import mixedlm, glm
# 二項分布 + ロジットリンクでのベイズ推定に基づくアプローチ
# 'Y ~ X_cont' の固定効果 + '0 + C(group_id)' のランダム効果
# ただしC(group_id)で切片をグループごとに推定するイメージ
model = sm.BinomialBayesMixedGLM.from_formula(
formula='Y ~ X_cont',
vc_formula={'group_id': '0 + C(group_id)'},
data=df
)
result = model.fit_vb() # 変分ベイズで推定
print(result.summary())
fit_vb()
は変分ベイズによる近似推定を行うメソッドです。
なお、 PyMC などのライブラリを使えば、MCMC によるより柔軟な階層モデルの推定も可能です。