はじめに:なぜ一般化線形モデル(GLM)を学ぶのか?
皆さん、こんにちは!線形回帰をマスターした皆さんなら、それが目的変数を予測するための強力なツールであることをすでにご存知でしょう。しかし、現実の世界、特にアクチュアリーの実務においては、データが綺麗な「正規分布」に従わないことがよくあります。例えば、事故件数は通常、整数値(ポアソン分布)をとりますし、損害額は正の値のみで、右に裾が長い分布(ガンマ分布)になることが一般的です。そこで登場するのが、一般化線形モデル(GLM)です!
この章では、Rを用いたGLMの実践的な側面に焦点を当てます。どの分布の「ファミリー(family)」を使うべきか、結果をどう解釈するか、そして作成したモデルが本当に優れているかをどのように判断するかを学んでいきます。Paper Aで理論が少し難しく感じた方も、心配しないでください。Paper Bで大切なのは、出力を「読み解き」、その意味を理解することです。
注:この章は、「線形回帰のフィッティングと出力の解釈」の知識をベースにしています。もし \(y \sim x\) という構文に慣れているなら、もう半分まで到達したも同然です!
1. glm() 関数の構造
Rでは、glm() 関数を使ってGLMを適合させます。構文は lm() と非常によく似ていますが、一つだけ重要な追加要素があります。それが family 引数です。
基本的なコード構造:
my_model <- glm(response ~ explanatory_variables, family = distribution(link = "link_function"), data = my_data)
ファミリー(Family)と連結関数(Link)の選択
family は目的変数の分布をRに伝え、連結関数(link function)は平均と線形予測子がどのように関連しているかを伝えます。CS1のシラバスでは、以下の一般的な組み合わせを覚えておく必要があります。
- 正規分布(Gaussian):
family = gaussian(link = "identity")— これは実質的に標準的な線形回帰と同じです! - ポアソン分布(Poisson):
family = poisson(link = "log")— 請求件数などのカウントデータに最適です。 - 二項分布(Binomial):
family = binomial(link = "logit")— 「はい/いいえ」の結果(例:保険契約が失効するかどうか)に使用されます。 - ガンマ分布(Gamma):
family = gamma(link = "inverse")またはlink = "log"— 請求コストのような、正の値で歪みのあるデータに使用されます。 - 指数分布(Exponential): ガンマ分布ファミリーの特殊なケースとして扱われます。
重要な概念:正準連結関数(Canonical Link)。 各分布には「自然な」連結関数が存在し、それを正準連結関数と呼びます。ポアソン分布なら log、二項分布なら logit です。Rでは、連結関数を指定しない場合、これらがデフォルトとして使用されます。
2. 線形予測子の理解
線形予測子は、通常 \(\eta\)(エータ)で表され、各変数の組み合わせで構成されます:
\(\eta = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + ...\)
Rでは、さまざまな種類の項を含めることができます:
- 変数(Variables): 連続的な数値(例:年齢、保険金額)。
- 因子(Factors): カテゴリカルデータ(例:地域、性別)。Rはこれらを自動的に「ダミー変数」として処理します。
- 交互作用項(Interaction Terms):
x1:x2またはx1*x2と記述します。ある変数の効果が別の変数の値によって変化する場合に使用します。
ヒント: 出力に RegionNorth と表示されている場合、そのモデルは「North(北)」地域を「Baseline(基準)」となる地域と比較していることを意味します。推定値(Estimate)は、その基準と比較したときの線形予測子の差を示しています。
3. summary() 出力の解釈
summary(my_model) を実行すると、Rは膨大な情報を表示します。試験で最も重要な部分を分解してみましょう。
係数表(Coefficients Table)
各変数について、Rは以下の値を提供します:
- Estimate(推定値): 計算された \(\beta\) の値。注意: これらは連結関数のスケール上での値です!対数(log)連結関数を使用した場合、推定値は平均の「対数」の変化量を表します。
- Std. Error(標準誤差): 推定値の不確実性。
- z value(z値): 検定統計量(\(Estimate \div Std. Error\))。
- Pr(>|z|): p値。これが0.05未満であれば、その変数は通常、5%有意水準で統計的に有意であるとみなされます。
逸脱度(Deviance)とスケール済み逸脱度
GLMでは、線形回帰で使われた「残差平方和」の代わりに逸脱度(Deviance)を使用します。これは、作成したモデルと完璧なモデル(飽和モデル)との「距離」を測定するものです。
- Null Deviance(ヌル逸脱度): 切片のみ(変数なし)のモデルで目的変数を予測したときの適合不足度。
- Residual Deviance(残差逸脱度): 自分のモデルで予測したときの適合不足度。
目安: 残差逸脱度はできるだけ小さい方が望ましいです。残差逸脱度がヌル逸脱度よりも大幅に小さければ、変数がうまく機能していることを示しています。
AIC (赤池情報量基準)
AICは、変数を増やしすぎることへのペナルティを課したモデル適合度の指標です。 AICが低い = 優れたモデル。 2つのモデルを比較する場合、一般的にAICが低い方が好まれます。
4. モデル選択のための統計的検定
変数を追加したことで実際にモデルが改善されたかどうかを、どうやって判断すればよいでしょうか?主に2つの検定を使用します。
尤度比検定(LRT) / 逸脱度分析
Rでは、anova() 関数を使って2つの入れ子(nested)構造のモデル(一方のモデルが他方の簡略版である場合)を比較します:
anova(model_simple, model_complex, test = "Chisq")
p値が小さければ(例:< 0.05)、複雑な方のモデルが統計的に有意に優れていることを意味します。
ピアソンのカイ二乗検定
これは主に適合度(Goodness of Fit)を確認するために使用されます。ピアソン残差を \(\chi^2\) 分布と比較します。p値が非常に小さい場合、そのモデルはデータにうまく適合していない可能性を示唆します。
5. 残差のチェック
p値が良好であっても、モデルの仮定が保持されているかを確認する必要があります。GLMでは主に2種類の残差を使用します:
- ピアソン残差(Pearson Residuals): 観測値と予測値の差に基づき、標準偏差でスケール調整したもの。
- 逸脱度残差(Deviance Residuals): 各データポイントが全体の逸脱度にどれだけ寄与しているかに基づくもの。
プロットで見るべきポイント:
plot(my_model) を使用します。点がランダムに散らばっている状態が理想です。もし特定のパターン(漏斗型や曲線など)が見られる場合は、交互作用項が不足しているか、連結関数が適切でない可能性があります。
避けるべきよくあるミス
- 連結関数と応答の混同: GLMの係数は連結スケール上にあることを忘れないでください。元のスケール(例:実際の請求件数)で予測値を得るには、Rで
predict(..., type = "response")関数を使用する必要があります。 - 過学習(オーバーフィッティング): 変数を増やしすぎると逸脱度は下がりますが、新しいデータに対しては役に立たないモデルになってしまうかもしれません。常に AIC を確認しましょう。
- 因子の無視: 5つのレベル(水準)を持つ因子がある場合、Rは4つの係数を表示します。最初の1つ目のレベルは「(Intercept)(切片)」の中に隠れています。
クイック復習ボックス
1. 関数: glm(y ~ x, family = poisson, data = d)
2. 有意性: サマリー表の Pr(>|z|) をチェック。
3. 比較: AIC と 残差逸脱度 が低いほど、適合度が高い。
4. 入れ子モデル: anova(m1, m2, test = "Chisq") で変数を追加する価値があるか確認。
5. スケール: 予測時に type = "response" を指定しない限り、結果は連結スケールで出力される。
まとめの重要ポイント
GLMのフィッティングとは、データに適した確率分布を選び、それを予測子に結びつける連結関数を選択することです。解釈にあたっては、p値の有意性を確認し、ヌルモデルからの逸脱度の減少を評価し、AICを用いて正確さとシンプルさのバランスを取ることが重要です。