🔖 キーワード索引
「fixed effects 」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「fixed effects」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
fixed effects 統計分析 SSDSE-B-2026 前提条件 適用範囲 落とし穴 関連手法 Python 実装 検証方法
これらのキーワードは「fixed effects の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
💡 30秒で分かる結論
🍰 まずはやさしく
個人のクセを無視する仕組みです。
正しく原因と結果を知るために使います。
部活で人による能力の差をなくす例です。
この手法で何ができるかを紹介します。
定義 :個体ごとの「観察できない固有の差」を吸収する変数を入れたパネルモデル。時間不変の交絡を完全に除去。カテゴリ :パネル分析
fixed effects を 30 秒で把握する重要ポイント:
何ができるか : パネルデータで「個体ごとに観測できない時間不変の特性 (α_i)」を吸収し、 個体内変動から係数 β を一致推定する。
いつ使うか : 都道府県・企業・個人など個体特性が説明変数と相関する観察研究で、 RCT が無理な場面 (Hausman 検定 p<0.05 で FE 優位)。
注意点 : 時間不変変数の係数は推定不能 / 標準誤差はクラスタ頑健 (vcovCR) 必須 / two-way FE は heterogeneous treatment で偏る (Goodman-Bacon 2021)。
関連 : 変量効果 ・パネルデータ ・DiD ・within 推定量・Mundlak 近似と接続。
📍 あなたが今見ているもの
🍰 まずはやさしく
分析でよく使われる重要な道具です。
データの偏りをなくすために使います。
都道府県のデータ分析で役立ちます。
定義から使い方まで順番に解説します。
論文中に 「固定効果モデル」 として登場する用語。
固定効果モデル とは:個体ごとの「観察できない固有の差」を吸収する変数を入れたパネルモデル。時間不変の交絡を完全に除去。
本ページでは「fixed effects」を扱う。 統計データ分析コンペティション (2026) の教材で、 SSDSE-B-2026 (47 都道府県 × 複数年 × 100 超列) の実データを使った再現可能な学習を目指す。
「fixed effects」は統計・データサイエンスの体系における重要概念のひとつ。 本ページは「定義・直感・数式・実装・落とし穴・関連手法」の 6 視点で構成され、 各視点は独立して読めるが順序通り読むと体系的な理解が得られる。
🎨 直感で掴む — 固定効果モデル
🍰 まずはやさしく
個人のもともとの差を消すイメージです。
純粋な変化だけを見るために使います。
身長の絶対値ではなく伸び方を見る例です。
図を使って直感的に仕組みを説明します。
固定効果 (Fixed Effects, FE) モデルは、 SSDSE-B-2026 の 都道府県ごとに自前のダミー変数 を 1 本ずつ追加するイメージです(最大 46 本)。 これにより「東京の出生率がもとから低い理由」のような 時間を通じて変わらない地域特性 を完全に吸収できます。 残った変動は 各都道府県内の年次変化 のみ — つまり「同じ都道府県内で年が進むと $x$ が変化したとき、 $y$ も変化したか」を見ています。
比喩で言うなら、 各人の身長を年齢の関数で表現するときに「身長の絶対値の差(個人差)」を一旦消して、 各人の身長の伸びだけで議論する のと同じ発想。 個体差という最大の交絡をエレガントに退治できるので、 観察研究で因果に最も近づける推定量の一つとして広く使われます。
🎨 概念図で押さえる
固定効果モデルは「個体ごとに異なる切片(観測されない時間不変の特性)」を吸収することで、 時間内変動だけから因果効果を推定する。 ここでは「プール OLS との違い」「within 変換」「県固有切片の意味」を概念図で視覚化する。
図 A. 左:個体間の差を無視する OLS は交絡により急な傾きを推定する。 右:固定効果は各個体(青/赤/橙)内の変動だけで傾きを推定するため、 個体差の影響を除外できる。
図 B. within 変換の流れ。 各観測値から「その個体の平均」を引くことで、 時間不変な個体効果 α_i を機械的に消去する。 これが固定効果推定量の核心。
図 C. Hausman 検定で固定効果 vs 変量効果を選ぶ。 説明変数と個体効果が相関するなら FE が一致推定量、 独立なら RE が効率的。 経済データでは FE が選ばれることが多い。
🎮 触って理解する
4 つの個体(グループ)からなるパネルデータを散布図に色分け表示しています。 各個体の中では傾き +0.80 の同じ正の関係 がありますが、 個体ごとに切片(=観測されない時間不変の個体固有効果 αi )が異なります。 スライダーで個体効果の強さ k を上げると、 個体間の切片差が説明変数 x と相関して交絡を生み、 全体をプールした OLS(黒破線)の傾きが真値からずれ、 やがて符号まで反転 します。 「表示切替」ボタンで within 変換 (各個体の平均を引く)後の図に切り替えると、 個体固有効果が消去され真の個体内効果 +0.80 が復元 される様子が体感できます。
個体効果の強さ k = 1.00
表示切替:プール OLS ⇄ 固定効果(within)
図を左右にドラッグ(スマホはタッチ)しても k を変えられます。 左端=交絡なし、右端=交絡最大。
🧠 直感 — なぜ「平均を引く」と交絡が消えるのか
固定効果は「観測されない時間不変 の個体差」をまるごと吸収する仕組みです。 各個体の平均を引く within 変換を行うと、 個体ごとに固定された切片 αi はその個体の平均に完全に含まれるため差し引きゼロになります。 残るのは「同じ個体の中で x が動いたとき y がどう動いたか」という個体内の変動だけ 。 上の図で k をいくら上げても within の傾きが +0.80 のまま揺らがないのは、 個体固有効果がどれほど強い交絡を生んでも、 平均差分によって機械的に除去されるからです。
⚠️ よくある落とし穴 — 何でも消せるわけではない
除去できるのは「時間不変」の交絡だけ :地理・気候・歴史・県民性など、 期間中に変化しない個体属性は吸収されます。 しかし時間とともに変化する交絡(時変交絡)は残る 。 例:景気・全国的な政策変更・技術トレンドが x と y の両方に影響する場合、 固定効果では取り除けません(年ダミー=時間固定効果の併用や DID が必要)。
時間不変な説明変数は推定できない :within 変換で消えるため、 「その個体でずっと一定の変数」の係数は識別不能になります。
個体内変動が小さいと不安定 :x がほとんど動かない個体では within 推定の分母が小さく、 標準誤差が大きくなります。
🚀 発展 — 隣接手法との関係
変量効果モデル(Random Effects) :個体効果 αi が説明変数と無相関 と仮定できるなら、 より効率的な推定が可能。 相関があるかどうかは Hausman 検定 で判定します(詳細は 変量効果モデル )。
差分の差分法(DID) :2 群 × 2 時点の設計では、 個体固定効果+時間固定効果を組み合わせた特殊形が DID に相当し、 政策評価で多用されます。
前提の整理 :固定効果が対処するのは 交絡 /内生性 の一形態であり、 ベースは OLS ・パネルデータ の枠組みです。 within 変換は「各個体の平均からの偏差」を用いる操作を指します。
🔬 数式を言葉で読み解く — 記号 → 意味
記号 意味 SSDSE-B-2026 解釈
$\alpha_i$ 個体固定効果(定数として扱う) 「東京は東京、 沖縄は沖縄」という時間不変の地域特性
$\bar{y}_i$ 個体 $i$ の被説明変数の時間平均 東京の出生率の年平均
$y_{it} - \bar{y}_i$ 個体内偏差(within 変動) 東京の今年の出生率と東京の平均との差
$\boldsymbol{\beta}$ 時間内(within)係数 「同じ都道府県内で $x$ が動くと $y$ がいくら動くか」
FE は時間不変な変数(地域固定の制度、 緯度、 海岸線など)の係数は推定できない(withinゼロになる)点に注意。 そういうときは RE か Mundlak 型を検討します。
📖 詳細な解説
固定効果(Fixed Effects, FE)は、 パネルデータで「個体(県・企業・人)ごとに観測されない時間不変の特性」をダミー変数として吸収する手法です。 同一個体内の時間方向の変動だけを使って係数を推定するため、 個体固有の交絡因子(県の地形・気候、 企業の経営方針、 個人の性格など)に強い識別が可能になります。 観測値 y_it = α_i + βX_it + u_it の α_i を消去(within 変換または LSDV)するのが核です。
固定効果が活きる場面
SSDSE-B-2026 (47 都道府県 × 12 年、 2012-2023) のように同じ個体を複数時点で観測するパネルでは、 OLS は県間の異質性で交絡を起こします。 固定効果はそれを構造的に除去します。
使い時の判断基準(FE vs RE vs Pooled OLS)
個体内の時間変動が十分あるか(時間不変変数は推定不可)
Hausman 検定で RE 仮定が棄却されるか(p < 0.05 → FE 推奨)
個体数 N と時間数 T のバランス(T が小さく N が大きい microeconometric panel に FE は強い)
残差の系列相関・クラスタリングを確認し robust SE / クラスタ SE を採用しているか
Python による実装例
▼ コード解説(固定効果モデル(PanelOLS FE))
🎯 解説: linearmodels.PanelOLS(EntityEffects=True) で各県のダミー変数を全て含める。 時間不変の県特性をすべて吸収。
📥 入力例: SSDSE-B-2026 の 47 県 × 12 年(2012〜2023)= 564 行
y = 出生率(A4101÷A1101×1000), X = 高齢化率(A1303÷A1101×100)
📤 実行例(実測)
Intercept 17.4317
Aging_rate -0.3538
Name: parameter, dtype: float64
within R2 = 0.7998
県ダミーの F 検定: F = 45.2, 自由度 = 46, p < 1e-15
💬 読み方: 高齢化率の係数は -0.354 で、同じ県の中で高齢化率が 1 ポイント高い年は出生率が人口千対で約 0.35 低い。within R² 0.80 は県内の年次変動の 8 割を高齢化率 1 本で説明している形だが、どの県でも 12 年間に高齢化と出生率低下が同時に進んでいるので、共通の時間トレンドを拾っている分が大きい(年固定効果を足す次のブロックで確かめる)。県ダミーの F = 45.2(自由度 46)は、県ごとに切片が違うことを強く支持する。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 # 県固定効果(EntityEffects)で「高齢化率 → 出生率」を推定する
import pandas as pd
from linearmodels.panel import PanelOLS
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
df = df . rename ( columns = { 'SSDSE-B-2026' : 'Year' })
df [ 'Aging_rate' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100 # 高齢化率(%)
df [ 'Birth_rate' ] = df [ 'A4101' ] / df [ 'A1101' ] * 1000 # 出生率(人口千対)
panel = df . set_index ([ 'Prefecture' , 'Year' ]) # 47 県 × 12 年 = 564 行
# EntityEffects: 県ごとの切片(時間不変の県特性)をすべて吸収する
mod = PanelOLS . from_formula ( 'Birth_rate ~ 1 + Aging_rate + EntityEffects' , data = panel )
res = mod . fit ( cov_type = 'clustered' , cluster_entity = True )
print ( res . params . round ( 4 ))
print ( 'within R2 =' , round ( res . rsquared_within , 4 ))
fp = res . f_pooled # 「県の切片がすべて等しい」の F 検定
print ( f '県ダミーの F 検定: F = { fp . stat : .1f } , 自由度 = { fp . df } , p < 1e-15' if fp . pval < 1e-15
else f '県ダミーの F 検定: F = { fp . stat : .1f } , p = { fp . pval : .2e } ' )
📖 包括的解説 — この概念を完全マスター
📍 学習の3ステップ
定義を理解する :この概念は何か? 数式や条件を確認
具体例を見る :実データ(SSDSE 等)で計算してみる
応用する :自分のデータに適用、 結果を解釈
🔧 Python実装パターン
▼ コード解説(両方向 FE(個体 + 時間))
🎯 解説: EntityEffects=True かつ TimeEffects=True で双方向 FE。 全国共通ショックと県特性を同時に吸収。
📥 入力例: 上と同じ 564 行のパネル。式に TimeEffects(年ダミー)を足して、県 FE だけの推定と並べる
📤 実行例(実測)
県 FE : β(Aging_rate) = -0.3538, SE = 0.0114, within R2 = 0.800
県 + 年 FE: β(Aging_rate) = -0.0161, SE = 0.0273, within R2 = 0.071
💬 読み方: 年固定効果を足すと β は -0.354 から -0.016 まで縮み、その大きさが SE 0.027 を下回るので有意でもなくなる。県 FE だけで見えた強い負の関係の大半は、全国で同時に進んだ高齢化と出生率低下という共通の年次変化だったことになる。within R² が 0.800 から 0.071 に落ちるのも、年ごとの全国的な動きを先に取り除いた残りだけを説明対象にしているため。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 # 両方向 FE(県 + 年): EntityEffects と TimeEffects を同時に入れる
import pandas as pd
from linearmodels.panel import PanelOLS
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
df = df . rename ( columns = { 'SSDSE-B-2026' : 'Year' })
df [ 'Aging_rate' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100 # 高齢化率(%)
df [ 'Birth_rate' ] = df [ 'A4101' ] / df [ 'A1101' ] * 1000 # 出生率(人口千対)
panel = df . set_index ([ 'Prefecture' , 'Year' ])
for f in [ 'Birth_rate ~ 1 + Aging_rate + EntityEffects' ,
'Birth_rate ~ 1 + Aging_rate + EntityEffects + TimeEffects' ]:
res = PanelOLS . from_formula ( f , data = panel ) . fit ( cov_type = 'clustered' , cluster_entity = True )
label = '県 FE ' if 'TimeEffects' not in f else '県 + 年 FE'
print ( f ' { label } : β(Aging_rate) = { res . params [ "Aging_rate" ] : .4f } , '
f 'SE = { res . std_errors [ "Aging_rate" ] : .4f } , within R2 = { res . rsquared_within : .3f } ' )
📚 統計概念マップでの位置
このページの上にある3つの概念マップ (関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 固定効果モデルは within 推定量・LSDV・差分の差分(DID)・操作変数法(IV)・Hausman 検定・クラスタ標準誤差・Mundlak 装置といった関連概念と直接結びつき、 時間不変な交絡をコントロールしたい場面の起点となる手法です。
🎯 固定効果モデルを SSDSE-B-2026 で活かす実践テーマ
県固定効果での家計支出分析 : 消費支出(L3221)を従属変数、 65歳以上人口比率(A1303/A1101)を独立変数にし、 県ダミーで時間不変な地域特性を吸収して β を推定
2-way FE で年・県をコントロール : 全国共通の景気変動 (時間 FE) と県固定の文化要因を同時に除去
Hausman 検定で FE vs RE 選択 : χ² 統計量と p 値で「Random Effects の不偏推定」が成立するか判定
Mundlak 装置の実装 : 県平均を共変量に加えると RE が FE と等価になることを linearmodels で確認
💡 固定効果モデルでよく使うコマンド集
機能
Python (linearmodels/statsmodels)
補足
FE 推定 PanelOLS(y, X, entity_effects=True).fit() within 推定量、 個体内変動のみ利用
2-way FE PanelOLS(y, X, entity_effects=True, time_effects=True).fit() 県+年の両方で吸収
クラスタ SE .fit(cov_type='clustered', cluster_entity=True) パネルでは原則必須 (Cameron & Miller 2015)
Hausman 検定 compare(re_result, fe_result) χ² で FE vs RE 選択
LSDV (ダミー回帰) smf.ols('y ~ x + C(entity)', data=df).fit() FE と数値一致、 county FE 多数で重い
RE 推定 RandomEffects(y, X).fit() GLS、 E[α_i|X]=0 が前提
DID smf.ols('y ~ treated*post + C(entity) + C(time)', data=df).fit() 2-way FE と等価
動学パネル linearmodels.IVGMM / Arellano-Bond y_{t-1} を入れる場合 Nickell バイアスを GMM で修正
🚧 固定効果モデルに固有の落とし穴と対策
時間不変な変数は識別不能 : 性別ダミー・出身地など個体内で動かない変数は β が出ない。 Hausman-Taylor 推定量や Mundlak 装置で工夫
within 変換でノイズ増幅 : T が小さい (T=2-3) と個体平均を引いた残差の SNR が悪化、 標準誤差が大きくなる
Nickell バイアス : 動学項 y_{t-1} を OLS で入れると T が小さいとき β が O(1/T) のバイアスを持つ → Arellano-Bond GMM
不均衡パネル : 一部の県が一部の年だけ観測される場合、 within 平均が群によって精度が違う → drop_absorbed=True で対応
クラスタ SE 忘れ : i.i.d. SE は深刻に過小評価。 個体クラスタ SE、 必要なら 2-way clustering
時間 FE 忘れ : 全国共通の景気変動を吸収しないと年次トレンドが β に紛れ込み因果として誤解
📊 固定効果モデルの結果報告フォーマット
モデル指定 : entity FE / time FE / both / クラスタ SE の指定
係数表 : β, クラスタ SE, t 値, 95% CI
within R² : 個体内変動のうち説明されている割合 (between R² と分離)
n, T, NT : 個体数, 時点数, 観測総数 (balanced/unbalanced 区別)
Hausman 検定 : χ² 値, df, p 値 → FE 採用根拠
F 検定 (全 FE = 0) : 固定効果が有意か OLS との比較
🌐 固定効果モデルの応用分野
労働経済学 : 個人パネル (PSID, NLSY) で賃金回帰、 能力 (時間不変) を吸収
地域経済 : 都道府県・市町村パネルで政策効果 (補助金, 規制) を識別
企業財務 : Compustat パネルで R&D 投資の収益率、 企業固定効果で経営者効果を吸収
マクロ経済 : 国別パネル (Penn World Table) で成長率回帰、 国固定効果で文化・制度を吸収
教育研究 : 学校・教師固定効果モデルで教師の付加価値 (value-added) を推定
医療経済学 : 病院パネルで質指標、 病院固定効果で経営方針を吸収
🎓 固定効果モデルを深掘りする文献
Wooldridge "Econometric Analysis of Cross Section and Panel Data" (2010) — パネルデータの定番教科書
Angrist & Pischke "Mostly Harmless Econometrics" (2009) — FE と DID の因果推論的解釈
Cameron & Trivedi "Microeconometrics: Methods and Applications" (2005) — Hausman 検定、 Mundlak 装置の詳細
Cameron & Miller (2015) "A Practitioner's Guide to Cluster-Robust Inference" — クラスタ SE 実務ガイド
Arellano & Bond (1991) "Some Tests of Specification for Panel Data" — 動学パネル GMM の原典
🔗 固定効果モデルと関連用語の地図
固定効果モデルは 3 つの軸 で位置づけられます: (1) パネルデータ手法として RE/Mixed Effects と並列、 (2) 因果推論手法として DID/IV と並列 (実は 2-way FE = DID)、 (3) 時間不変な交絡をコントロールする道具として propensity score / matching と相補的。
固定効果モデルを取り巻く計量経済学用語グループ
グループ
主要概念
パネル推定量 FE (within), RE, Pooled OLS, Between, First-Difference
FE vs RE 判定 Hausman 検定, Mundlak 装置, Hausman-Taylor
DID 関連 2-way FE, parallel trends, event study, TWFE bias (Goodman-Bacon)
動学パネル Arellano-Bond, System GMM, Nickell bias, IV
標準誤差 クラスタ SE, 2-way clustering, Driscoll-Kraay, ブロックブートストラップ
階層モデル Mixed Effects, Random Slope, ICC, BLUP
時間 FE 年ダミー, 半期ダミー, week-of-year, trend
不均衡パネル attrition, missing-at-random, Heckman 補正
識別戦略 DID, RDD, IV, synthetic control, matching
パッケージ linearmodels.PanelOLS, statsmodels, plm (R), reghdfe (Stata)
診断 Wooldridge AR(1) test, Pesaran CD test, BP-LM test
頑健性 drop1, leave-one-out, placebo test, alternative cluster
固定効果モデルの学習順序
パネルデータとロング/ワイド変換の理解 (long panel = 個体 × 時間)
Pooled OLS で β を推定 → 個体ダミーを追加 (LSDV)
within 変換 y_it - ȳ_i で β を再推定し LSDV と一致を確認
RE 推定 + Hausman 検定で FE 採用の根拠を示す
クラスタ SE を導入し i.i.d. SE と比較
2-way FE で時間ダミーを追加、 DID と等価性を確認
Mundlak 装置 (県平均を追加) で RE が FE と等価になる現象を体験
不均衡パネル・欠損対応、 attrition の影響評価
動学項 y_{t-1} を入れて Arellano-Bond GMM に挑戦
📝 固定効果モデルの実践練習 — SSDSE-B-2026 で挑戦
初級課題
SSDSE-B-2026 の県×年パネルを long 形式に変換し、 観測数 NT を確認
Pooled OLS で 65歳以上人口比率(A1303/A1101)→ 消費支出(L3221)を回帰し、 β と R² を取得
linearmodels.PanelOLS で entity_effects=True を指定し within β を取得
LSDV (smf.ols with C(entity)) を実行し、 PanelOLS と β が一致することを確認
中級課題
RE モデルを推定し、 Hausman 検定で FE vs RE を判定
クラスタ SE (cluster_entity=True) を有効化し、 i.i.d. SE と比較
2-way FE (entity + time) を推定し、 1-way FE との β 差を解釈
Mundlak 装置 (県平均を追加) で RE が FE と等価になることを数値で確認
上級課題
都道府県と年の 2-way FE モデルで「特定の政策導入年×処置県」の DID 効果を識別
動学項 (前年人口対数) を加えて Arellano-Bond GMM で Nickell バイアスを修正
Driscoll-Kraay SE (横断的相関に頑健) を実装、 クラスタ SE と比較
Goodman-Bacon decomposition (2021) で 2-way FE が含む処置効果の重みを分解
🧮 SSDSE-B パネルデータでの固定効果モデル実値計算例
SSDSE-B-2026 は 47都道府県 × 複数年度(2012-2023)のパネルデータ。 これは固定効果モデルの典型的なテストケースです。 「人口あたり医療費」を「人口あたり病院数」で予測する例で実演します。
📊 ステップ1:データ準備(pandas でロング形式に)
▼ コード解説(階差(first difference))
🎯 解説: Δy = y_it - y_{i,t-1} で階差をとって回帰。 個体効果を消去する別の方法。
📥 入力例: panel(year / pref / pop / hospitals の 564 行)を県ごとに前年差をとる
→ 47 県 × 11 年 = 517 行(各県の 2012 年は差がとれず落ちる)
📤 実行例(実測)
(564, 4) 2012 - 2023
階差データの行数: 517
const -0.728052
d_pop 0.000016
dtype: float64
💬 読み方: Δpop の係数 0.000016 は「前年より人口が 10 万人増えた県では一般病院が約 1.6 施設増える」と読め、下の①の二元固定効果(0.000014)と近い。定数 -0.73 は、人口が変わらなくても 1 県あたり毎年 0.7 施設ほど病院が減っていく全国的な流れを表す。階差は県の切片を消す点で Within 変換と同じ働きをするが、T が 3 以上では両者の推定値は一致しない。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 import pandas as pd
import numpy as np
import statsmodels.api as sm
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
# パネル化:都道府県 × 年度
panel = df [[ 'SSDSE-B-2026' , 'Prefecture' , 'A1101' , 'I510120' ]] . copy ()
panel . columns = [ 'year' , 'pref' , 'pop' , 'hospitals' ]
print ( panel . shape , panel [ 'year' ] . min (), '-' , panel [ 'year' ] . max ()) # (564, 4) 2012 - 2023
# 階差: 同じ県の前年との差をとると、県固有の切片 α_i が消える
d = panel . sort_values ([ 'pref' , 'year' ]) . copy ()
d [ 'd_hosp' ] = d . groupby ( 'pref' )[ 'hospitals' ] . diff ()
d [ 'd_pop' ] = d . groupby ( 'pref' )[ 'pop' ] . diff ()
d = d . dropna () # 各県の最初の年(2012)は差がとれない
fd = sm . OLS ( d [ 'd_hosp' ], sm . add_constant ( d [ 'd_pop' ])) . fit (
cov_type = 'cluster' , cov_kwds = { 'groups' : d [ 'pref' ]})
print ( '階差データの行数:' , len ( d ))
print ( fd . params . round ( 6 ))
📊 ステップ2:3つの推定法を比較
手法
推定式
病院数の係数(仮想例)
解釈
プールド OLS $y_{it}=\alpha+\beta x_{it}+\epsilon$ +0.85 *** 県固有性無視(過大評価のおそれ)
県FE(Within) $y_{it}=\alpha_i+\beta x_{it}+\epsilon$ +0.22 * 「同じ県の中で病院が増えると医療費がどう変わるか」
県+年FE(Two-way) $y_{it}=\alpha_i+\gamma_t+\beta x_{it}+\epsilon$ +0.18 * 時間共通ショック(コロナ等)も除去
💡 得られる洞察 :プールド OLS では「病院が多い県は医療費が高い」という県間の差 に引きずられて係数が大きく出ますが、 FE で県固有要因を除くと、 「同じ県の中で病院が増えても医療費は思ったほど増えない」という別の現実が見えます。
📊 ステップ3:クラスタ頑健標準誤差
パネル分析では「同じ県の年度間で誤差が相関」しているため、 通常の標準誤差は過小評価。 必ず cluster='pref' でクラスタ頑健標準誤差を使うこと。
🧮 SSDSE-B-2026 拡張ハンズオン — 固定効果モデルの実装
都道府県 × 年度のパネルで出生率(人口千対、 A4101÷A1101×1000)を被説明変数とし、 高齢化率と消費支出(L3221)を説明変数として固定効果モデルを推定します(SSDSE-B-2026 には「県民所得」「完全失業率」の列が無いため、 実在列から導出できる変数を使います)。 OLS(プールド)・ LSDV・ within 変換の 3 通りで係数が一致することを実データで確かめましょう。
🎯 学習目的
LSDV(最小二乗ダミー変数法)と within 変換が同じ係数を返すことを SSDSE-B-2026 で確認する。
📥 入力
SSDSE-B-2026 の都道府県 × 年度パネル。 説明変数は Aging_rate(高齢化率、 A1303÷A1101×100) ・ L3221(消費支出)。
📤 出力
OLS / LSDV / within の係数表、 標準誤差、 R^2。
💬 解説
プールド OLS は県固有事情を見逃すため係数が歪む。 LSDV は県ダミーを 46 個入れる愚直法、 within は各列から県平均を引く高速法。 結果は同じになる(Frisch-Waugh-Lovell の定理)。
🐍 3 方式の比較
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 import pandas as pd
import numpy as np
import statsmodels.api as sm
from linearmodels.panel import PanelOLS
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
df = df . rename ( columns = { 'SSDSE-B-2026' : 'Year' })
df [ 'Aging_rate' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100 # 高齢化率(%)
df [ 'Birth_rate' ] = df [ 'A4101' ] / df [ 'A1101' ] * 1000 # 出生率(人口千対)
df = df . set_index ([ 'Prefecture' , 'Year' ])
y = df [ 'Birth_rate' ]
X = df [[ 'Aging_rate' , 'L3221' ]] # 高齢化率と消費支出
# 1. プールド OLS(固定効果を入れない)
pooled = sm . OLS ( y , sm . add_constant ( X )) . fit ()
print ( 'pooled :' , pooled . params . values )
# 2. LSDV
D = pd . get_dummies ( df . index . get_level_values ( 0 ), drop_first = True , dtype = float )
D . index = df . index
Xd = pd . concat ([ X , D ], axis = 1 )
lsdv = sm . OLS ( y , sm . add_constant ( Xd )) . fit ()
print ( 'LSDV :' , lsdv . params [[ 'Aging_rate' , 'L3221' ]] . values )
# 3. within 変換
Xw = X - X . groupby ( level = 0 ) . transform ( 'mean' )
yw = y - y . groupby ( level = 0 ) . transform ( 'mean' )
within = sm . OLS ( yw , Xw ) . fit ()
print ( 'within :' , within . params . values )
# 4. linearmodels の PanelOLS(クラスタロバスト SE)
res = PanelOLS ( y , X , entity_effects = True ) . fit ( cov_type = 'clustered' , cluster_entity = True )
print ( res . params )
📤 実行例(実測)
pooled : [ 1.72069962e+01 -2.39917115e-01 -1.08067305e-05]
LSDV : [-3.53775747e-01 -2.50851621e-06]
within : [-3.53775747e-01 -2.50851621e-06]
Aging_rate -0.353776
L3221 -0.000003
Name: parameter, dtype: float64
💬 高齢化率の係数はプールド OLS では -0.240 だが、県ごとの固定効果を入れると -0.354 に強まった。県の恒久的な違い(都市か地方か等)を除くと、同じ県の中で高齢化が 1 ポイント進むごとに出生率が人口千対で 0.35 下がる関係がより強く出る。LSDV と within 変換の係数が小数 9 桁まで一致するのは両者が数学的に同じ推定量だからで、PanelOLS も同じ点推定を返す。消費支出の係数 -0.0000025 は 1 円あたりの値なので、1 万円あたりに直すと -0.025 と読む。
読み解きの観点
3 つの方式で Aging_rate 係数が(小数点誤差を除いて)同じ値になることを確認。
クラスタロバスト SE は通常の SE より大きくなるはず。 これを反映しない論文の有意性は信用しない。
固定効果を入れた瞬間に消える係数(時間不変な変数)がある。 これが固定効果モデルの最大の弱点。
追加の落とし穴
incidental parameters problem : T が小さく N が大きい場合、 個体固定効果の数が増えすぎて推定誤差が累積する。 SSDSE-B-2026 は N=47 と小さく T も短いことが多いので注意。
時間不変な政策ダミー : 県境界の改編など、 県固定効果と完全多重共線になる変数は推定できない。
動学パネル : 被説明変数のラグを右辺に入れると Nickell バイアスが出る。 GMM(Arellano-Bond 等)に移行が必要。
❓ よくある質問 — 固定効果モデルの実務 12 問
Q1. 固定効果と変量効果の選び方
Hausman 検定が原則だが、 ドメイン知識で「個体効果と説明変数に相関がある」と判断できれば固定効果一択。 SSDSE-B-2026 の都道府県分析では通常、 固定効果が安全。
Q2. 個体固定効果と時間固定効果の両方を入れるべきか
全国共通のショック(景気変動など)があるなら時間固定効果も必要。 二元固定効果(two-way FE)が標準。
Q3. 時間不変な説明変数は推定できるか
個体固定効果と完全多重共線になるので推定不可 。 これは固定効果モデルの最大の欠点。
Q4. 固定効果モデルでの R^2 の解釈
「within R^2」「between R^2」「overall R^2」を分けて報告する。 固定効果モデルでは within R^2 が主役。
Q5. クラスタロバスト SE はクラスタ数いくつから安全か
経験則で 30 クラスタ以上。 SSDSE-B-2026 の N=47 はギリギリ安全圏。 不安なら wild cluster bootstrap を併用。
Q6. 固定効果と差分の差は同じか
2 期間 ・ 2 群 DID は one-way FE と等価。 多期間 DID は二元固定効果と等価(ただし staggered adoption で問題が出る)。
Q7. 「県内変動」が小さい説明変数は使えるか
使えるが、 標準誤差が爆発する。 within 分散が小さい変数で因果推論しようとするのは無理がある。
Q8. ロバスト標準誤差 vs クラスタロバスト
パネルではクラスタロバスト が原則。 通常のロバスト SE は系列相関を無視する。
Q9. fixed effects の数値計算
LSDV はダミーが増えると行列計算が重い。 within 変換(demean)の方が効率的で、 結果は同じ。
Q10. 動学パネルでの固定効果
被説明変数のラグを右辺に入れると Nickell バイアス。 Arellano-Bond GMM で対処。
Q11. unbalanced パネルでの固定効果
linearmodels.PanelOLS や statsmodels の plm が自動対応。 ただし脱落理由が処置と相関するなら IPW が必要。
Q12. 固定効果モデルでの予測
新しい個体への予測には使えない(固定効果は推定済み個体の値)。 一般化したい場合は変量効果か階層モデルへ。
🚀 発展研究の方向性 — 固定効果モデルの最前線 6 題
staggered DID : 処置のタイミングが個体ごとに異なる場合、 二元固定効果は偏る。 Callaway-Sant'Anna ・ Sun-Abraham 推定量。
固定効果と機械学習 : Athey-Wager の Double ML で固定効果を残差化する。
合成統制法 : 1 つの処置単位に複数対照単位の重み付き平均を当てる。
panel matrix completion : 因子モデルでパネル欠損を補完しつつ処置効果推定。
異質処置効果 : 固定効果と HTE の組み合わせ。 Callaway-Sant'Anna の event study。
ネットワーク固定効果 : 個体間の相互作用を考慮する spatial panel。
📋 ケーススタディ — SSDSE-B-2026 で起こる固定効果分析 4 シナリオ
シナリオ A: 県固有の気候・地理を吸収する
農業就業者比率を被説明変数として、 「政策効果」を見たいときに、 県固有の気候や地理は時不変なので固定効果で完全に吸収 される。 これにより気候を別途モデル化する必要がなくなる。
シナリオ B: 全国共通の景気ショックを吸収する
リーマンショックやコロナのような全国共通の年次ショックは、 年固定効果 で吸収。 これにより「景気のせい」と「政策のせい」を分離できる。
シナリオ C: 県境界の改編
「平成の大合併」のような大規模合併があった年は個体ダミーの定義が壊れる。 SSDSE-B-2026 は都道府県単位なので合併の影響は限定的だが、 市区町村単位の分析では深刻。
シナリオ D: 異質処置効果のシグナル
「同じ政策を導入しても、 大都市県と地方県で効果が逆」というケース。 固定効果+ HTE モデル(処置 × 都市規模ダミー)で異質性を可視化する。
🧮 数式に値を入れて手で計算する: パネルデータの個体平均差分
合成データで個体内変動 (within) を計算する。
Step 1: 2 個体 × 3 時点
i t y y - ȳ_i
1 1 10 -2 1 2 12 0 1 3 14 +2 2 1 20 -2 2 2 22 0 2 3 24 +2
ȳ_1 = 12, ȳ_2 = 22
Step 2: 個体内変動 (within)
Σ(y - ȳ_i)² = 2·(4+0+4) = 16
全変動 = Σ(y - ȳ)² with ȳ=17: Σ = (49+25+9+9+25+49) = 166
個体間効果 = 166 - 16 = 150
個体内変動率 = 16/166 ≈ 0.096
🐍 Python で再現
📋 コピー import numpy as np
y = np . array ([ 10 , 12 , 14 , 20 , 22 , 24 ])
ids = np . array ([ 1 , 1 , 1 , 2 , 2 , 2 ])
within = sum (( y [ ids == i ] - y [ ids == i ] . mean ()) ** 2 for i in [ 1 , 2 ]) . sum ()
total = (( y - y . mean ()) ** 2 ) . sum ()
print ( f "within: { within } " )
print ( f "total: { total } " )
print ( f "within/total: { within / total : .3f } " )
📤 実行結果
within: 16
total: 166
within/total: 0.096
💬 手計算 (Step 2) 16 / 166 と Python 出力が完全一致。
🐍 Python 実装バリエーション
① linearmodels(最も標準的)
▼ コード解説(クラスター標準誤差(県別))
🎯 解説: 前のブロックで作った panel(列は year / pref / pop / hospitals)に、 県固定効果(EntityEffects)と年固定効果(TimeEffects)を入れて「総人口 → 病院数」を推定する。 cov_type='clustered', cluster_entity=True で県内系列相関を補正する。
📥 入力例: panel(47 県 × 12 年 = 564 行、 47 クラスタ)
year / pref / pop(総人口 A1101)/ hospitals(一般病院数 I510120)
📤 実行例(実測)
Intercept 118.566094
pop 0.000014
Name: parameter, dtype: float64
within R2 = 0.1136
💬 読み方: pop の係数 0.000014 は「同じ県の中で人口が 10 万人増えると病院が約 1.4 施設増える」。 within R² = 0.11 と小さいのは、 県内の年次変動の大半が人口以外の要因で説明されるため。 クラスター SE は FE の標準作法で、 同一県の時間誤差は相関するので通常 SE では過小評価される。
📋 コピー from linearmodels.panel import PanelOLS
# panel の列は year / pref / pop / hospitals。被説明変数は hospitals(病院数)、
# 説明変数は pop(総人口)。'y' や 'x' という列は存在しない
panel = panel . set_index ([ 'pref' , 'year' ])
mod = PanelOLS . from_formula ( 'hospitals ~ 1 + pop + EntityEffects + TimeEffects' ,
data = panel )
res = mod . fit ( cov_type = 'clustered' , cluster_entity = True )
print ( res . params . round ( 6 ))
print ( 'within R2 =' , round ( res . rsquared_within , 4 ))
② statsmodels(OLS + 県ダミー)
少ない個体数なら、 ダミー変数を直接作って OLS で推定する古典的アプローチも有効。
▼ コード解説(F 検定(プール vs FE))
🎯 解説: ダミー変数群が全てゼロかを F 検定。 棄却されれば FE が必要。
📥 入力例: panel 564 行。プール OLS(y ~ x)と、県ダミー 46 個を加えた OLS(y ~ x + C(pref))の残差平方和を比べる
📤 実行例(実測)
プール OLS: β(x) = -0.2320, RSS = 323.6
県 FE : β(x) = -0.3538, RSS = 64.3
F = 45.2, 自由度 = (46, 516), p = 1.92e-151
💬 読み方: 県ダミーを入れると残差平方和は 323.6 から 64.3 へ約 8 割減り、F = 45.2(自由度 46, 516)、p は 1e-151 の桁で「全県の切片が等しい」は棄却される。この F は最初の PanelOLS の例が出した県ダミーの F 検定と同じ値。β(x) も -0.232 から -0.354 に変わるので、県差を無視したプール推定では係数そのものがずれる。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import pandas as pd
import statsmodels.formula.api as smf
# ── この抜粋だけで動くように、都道府県 × 年度のパネルを作り直す ──
panel = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
panel = panel . rename ( columns = { 'SSDSE-B-2026' : 'year' , 'Prefecture' : 'pref' })
panel [ 'y' ] = panel [ 'A4101' ] / panel [ 'A1101' ] * 1000 # 出生率(人口千対)
panel [ 'x' ] = panel [ 'A1303' ] / panel [ 'A1101' ] * 100 # 高齢化率(%)
# プール OLS(県ダミーなし)と、C(pref) で県ダミー 46 個を加えた FE(LSDV)
pooled = smf . ols ( 'y ~ x' , data = panel ) . fit ()
fe = smf . ols ( 'y ~ x + C(pref)' , data = panel ) . fit ()
F , p , df_diff = fe . compare_f_test ( pooled ) # 「県ダミーがすべて 0」の F 検定
print ( f 'プール OLS: β(x) = { pooled . params [ "x" ] : .4f } , RSS = { pooled . ssr : .1f } ' )
print ( f '県 FE : β(x) = { fe . params [ "x" ] : .4f } , RSS = { fe . ssr : .1f } ' )
print ( f 'F = { F : .1f } , 自由度 = ( { int ( df_diff ) } , { int ( fe . df_resid ) } ), p = { p : .2e } ' )
③ scikit-learn 風(参考用、 厳密ではない)
scikit-learn には公式の固定効果クラスはありません。 代わりにダミー変数を OneHotEncoder で作り、 LinearRegression に通す方法があります。 ただし正規方程式に直結する形なので、 大規模パネルでは linearmodels が圧倒的に速い。
④ Within 変換を手動実装
▼ コード解説(Within 変換を手動実装)
🎯 解説: 各県の 12 年平均を y と x から引き(Within 変換)、切片なしの OLS に通す。PanelOLS の EntityEffects が内部でしている計算を手で再現する。
📥 入力例: SSDSE-B-2026 の 564 行
y = 出生率(人口千対), x = 高齢化率(%)
y_within = y - 県平均, x_within = x - 県平均
📤 実行例(実測)
OLS Regression Results
=======================================================================================
Dep. Variable: y_within R-squared (uncentered): 0.800
Model: OLS Adj. R-squared (uncentered): 0.799
Method: Least Squares F-statistic: 2249.
Date: Sat, 26 Sep 2026 Prob (F-statistic): 8.49e-199
Time: 02:29:53 Log-Likelihood: -188.01
No. Observations: 564 AIC: 378.0
Df Residuals: 563 BIC: 382.4
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
x_within -0.3538 0.007 -47.428 0.000 -0.368 -0.339
==============================================================================
Omnibus: 29.562 Durbin-Watson: 0.579
Prob(Omnibus): 0.000 Jarque-Bera (JB): 33.072
Skew: -0.591 Prob(JB): 6.58e-08
Kurtosis: 3.094 Cond. No. 1.00
==============================================================================
Notes:
[1] R² is computed without centering (uncentered) since the model does not contain a constant.
[2] Standard Errors assume that the covariance matrix of the errors is correctly specified.
💬 読み方: x_within の係数 -0.3538 は PanelOLS の県 FE・LSDV と同じ値で、県平均を引くだけで県ダミー 46 個を入れたのと同じ推定になる。ただし std err 0.007 は、県平均 47 個を推定済みであることを自由度に反映せず(Df Residuals 563、本来は 516)、同じ県の誤差の相関も無視しているので、クラスタ SE の 0.011 より小さく出る。R² 0.800 は切片なしの uncentered だが、平均 0 のデータなので県 FE の within R² と同じ値になる。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13 import pandas as pd
import statsmodels.api as sm
# この抜粋だけで動くように、都道府県 × 年度のパネルを作り直す
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
df = df . rename ( columns = { 'SSDSE-B-2026' : 'year' , 'Prefecture' : 'pref' })
df [ 'y' ] = df [ 'A4101' ] / df [ 'A1101' ] * 1000 # 出生率(人口千対)
df [ 'x' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100 # 高齢化率(%)
# 各県の年度平均を引いて Within 変換
df [ 'y_within' ] = df [ 'y' ] - df . groupby ( 'pref' )[ 'y' ] . transform ( 'mean' )
df [ 'x_within' ] = df [ 'x' ] - df . groupby ( 'pref' )[ 'x' ] . transform ( 'mean' )
print ( sm . OLS ( df [ 'y_within' ], df [ 'x_within' ]) . fit () . summary ())
これは linearmodels が内部で行っている処理と同じ。 自由度補正は手動で必要。
🐍 拡張ハンズオン — SSDSE-B-2026 で TWFE と通常 OLS の比較
🎯 学習目的
同じデータに対して (1) プールド OLS、 (2) 個体固定効果、 (3) 二元固定効果 (TWFE) の 3 モデルを推定し、 係数の符号や大きさがどう変わるかを観察する。
📥 入力
SSDSE-B-2026 をパネル化(Prefecture × Year)したデータ。
📤 出力
3 モデルの係数(params)。プールド OLS には定数項も付く。
💬 解説
どのモデルを選ぶかで係数の大きさ、場合によっては符号まで変わる。このデータでは高齢化率の係数は 3 モデルとも負のままだが、大きさはプールド OLS・個体 FE・TWFE で大きく違う。
🐍 比較スクリプト
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 import pandas as pd
import statsmodels.api as sm
from linearmodels.panel import PanelOLS , PooledOLS
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
df = df . rename ( columns = { 'SSDSE-B-2026' : 'Year' })
df [ 'Aging_rate' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100 # 高齢化率(%)
df [ 'Birth_rate' ] = df [ 'A4101' ] / df [ 'A1101' ] * 1000 # 出生率(人口千対)
df = df . set_index ([ 'Prefecture' , 'Year' ])
y = df [ 'Birth_rate' ]
X = df [[ 'Aging_rate' , 'L3221' ]] # 高齢化率と消費支出
# 1. プールド OLS(切片が必要なので定数列を足す)
pool = PooledOLS ( y , sm . add_constant ( X )) . fit ( cov_type = 'clustered' , cluster_entity = True )
print ( 'Pooled:' )
print ( pool . params )
# 2. 個体固定効果
fe = PanelOLS ( y , X , entity_effects = True ) . fit ( cov_type = 'clustered' , cluster_entity = True )
print ( 'FE (entity):' )
print ( fe . params )
# 3. 二元固定効果 (TWFE)
twfe = PanelOLS ( y , X , entity_effects = True , time_effects = True ) . fit ( cov_type = 'clustered' , cluster_entity = True )
print ( 'TWFE:' )
print ( twfe . params )
📤 実行例(実測)
Pooled:
const 17.206996
Aging_rate -0.239917
L3221 -0.000011
Name: parameter, dtype: float64
FE (entity):
Aging_rate -0.353776
L3221 -0.000003
Name: parameter, dtype: float64
TWFE:
Aging_rate -1.650372e-02
L3221 -5.313677e-07
Name: parameter, dtype: float64
💬 高齢化率の係数はプールド OLS で -0.240、個体 FE で -0.354、TWFE で -0.0165 と、同じデータでもモデルによって 20 倍以上違う。県 FE で強まった関係が年 FE を足すとほぼ消えるのは、全国共通の年次トレンドが両変数を同時に動かしていたため。消費支出(L3221)の係数も -0.000011 → -0.000003 → -0.0000005 と縮み、TWFE では 1 万円あたり -0.005 にすぎない。
読み解きの観点
プールド OLS では「県間の水準差」が支配的で、 高齢化率と出生率の関係はクロスセクション的な姿 になる。
個体固定効果に切り替えると、 「同じ県の中で高齢化率が変動したときの出生率変動」のみが残り、 多くの場合係数の大きさが変化する。
TWFE では全国共通の景気変動も除去され、 「県固有 ・ 時点固有要因を除いた純粋な関係」が見える。
🧭 固定効果モデルの実務 FAQ 補遺 — さらに 8 問
Q1. 固定効果モデルで個体数が時間ごとに変わる場合は
unbalanced panel として扱う。 linearmodels.PanelOLS は自動対応。 ただし脱落が処置と相関するなら IPW で補正。
Q2. 固定効果モデルでの相互作用項
「処置 × 時間」は DID と同義。 「処置 × 共変量」は HTE 分析。 どちらも固定効果モデルに組み込み可能。
Q3. 残差の自己相関は無視してよいか
無視すると標準誤差が過小評価される。 クラスタロバスト SE で対処するのが標準。
Q4. 固定効果モデルでの予測区間
新規個体の予測区間は通常出せない。 既存個体の将来予測は固定効果が利用可能。
Q5. R^2 が固定効果モデルで小さくなるのは正常か
「個体内の変動」だけを説明するのが within R^2 なので、 値が小さくなりやすい。 比較は同じ FE モデル間で行う。
Q6. 固定効果モデルと階層モデルの違い
固定効果は個体効果を「自由パラメータ」、 階層モデルは「確率変数」として扱う。 後者は予測に強い。
Q7. 固定効果モデルでサイズの小さい N は問題か
N が小さいとクラスタロバスト SE の漸近近似が崩れる。 wild cluster bootstrap が代替。
Q8. 固定効果モデルと機械学習
Athey-Wager の Double ML で、 機械学習を「残差化」のステップに使う。 固定効果はそのまま残せる。
✨ ベストプラクティス集 — 固定効果モデルの作法 12 箇条
パネルデータと分かった瞬間に「個体内変動」と「個体間変動」を分離して眺める。
between R^2 / within R^2 / overall R^2 の 3 つを必ず報告する。
クラスタロバスト SE を標準採用する。 通常の SE は系列相関を無視する。
時間固定効果は迷ったら入れる。 全国共通ショックを吸収できる。
Hausman 検定の結果だけで固定効果 vs 変量効果を選ばない。 ドメイン知識を優先。
動学パネルでは Nickell バイアスに留意し、 GMM を検討。
クラスタ数が 30 未満なら wild cluster bootstrap で SE を再評価。
時間不変な変数を強引に入れない。 推定不可能で誤解を招く。
処置効果推定では二元固定効果と DID の同値性を確認する。
感度分析として「個体固定効果のみ」「二元固定効果」「個体 × 線形時間」を比較する。
staggered な処置の場合は Callaway-Sant'Anna 推定量に切り替える。
固定効果モデルでは新規個体への予測ができない。 階層モデルへの移行を検討する。
📝 練習問題 — SSDSE-B-2026 で固定効果分析 4 タスク
練習 1: 分散分解
「高齢化率(A1303÷A1101)」を Prefecture × Year のパネルで眺め、 between 分散 / within 分散 / overall 分散の比率を求めよ。 80% 以上が between なら固定効果モデルは多くの情報を捨てることになる。
練習 2: 個体固定効果 vs 二元固定効果
「高齢化率 → 出生率(人口千対)」の回帰を 2 通り(個体固定効果のみ / TWFE)で推定し、 係数と SE を比較せよ。 全国共通の景気変動が混在する場合、 TWFE で係数が変わるはず。
練習 3: クラスタロバスト SE
同じ回帰で通常 SE とクラスタロバスト SE を比較し、 後者が大きくなることを確認せよ。 数十倍違うことも珍しくない。
練習 4: Hausman 検定
変量効果モデルと固定効果モデルを推定し、 Hausman 検定で適切なモデルを判定せよ。 都道府県データではほぼ常に固定効果に軍配が上がる。
📊 まとめ表 — 固定効果モデルの全体像
項目 固定効果モデル (FE) 変量効果モデル (RE) プールド OLS
個体効果の扱い 自由パラメータ 確率変数 無視
個体効果と説明変数の相関 許す 仮定: 無相関 無関係
時間不変変数の推定 不可 可 可
必要な漸近性 N → ∞ (or T → ∞) N → ∞ N → ∞
効率性 低(自由度を多く消費) 高(仮定が成り立てば) 最高(仮定が成り立てば)
不偏性(固定効果と相関ある場合) 不偏 偏 偏
適切な検定 F 検定 ・ Hausman Breusch-Pagan —
📜 歴史的文脈 — 固定効果モデルの発展史
パネルデータ分析と固定効果モデルは、 ミクロ計量経済学の発展と密接に関わってきました。 ここでは主要な発展を時系列で振り返り、 「なぜ二元固定効果が DID の標準になったのか」「なぜクラスタロバスト SE が必須になったのか」を歴史的視点から理解します。
第一期: 1950-1960 年代 — 個体効果の認識
計量経済学の初期、 ヘテロジニアスな個体を「個体ダミー変数」で扱うアイデアが登場。 ただし当時の計算機では大量のダミー変数を含む回帰は重く、 within 変換による計算量削減が重要視されました。
第二期: 1970 年代 — 変量効果との対比
Mundlak (1978) が「個体効果と説明変数の相関」が固定効果と変量効果の選択を決めることを示しました。 Hausman (1978) は両者を統計的に判定する検定を提示。
第三期: 1980-1990 年代 — 動学パネルと GMM
Nickell (1981) は動学パネルでの固定効果バイアスを指摘。 Arellano-Bond (1991) ・ Blundell-Bond (1998) が GMM 推定量を提案し、 動学パネル分析の標準ツールになりました。
第四期: 1990-2010 年代 — クラスタロバスト SE と DID
Bertrand-Duflo-Mullainathan (2004) は DID 分析でクラスタロバスト SE が必須であることを示しました。 これ以降、 パネル因果推論ではクラスタ SE が標準になりました。
第五期: 2010 年代以降 — staggered DID と新手法
Goodman-Bacon (2021) は staggered な処置タイミングで二元固定効果が偏ることを示し、 Callaway-Sant'Anna (2021) ・ de Chaisemartin-D'Haultfœuille (2020) などの新推定量が登場しました。
⚠️ 固定効果モデルの落とし穴(深掘り版・7件)
① 時間不変変数の係数が推定できない
FE は個体内変動だけを使うため、 個体内で値が変わらない変数(性別、 出生年、 県のコード自体など)の係数は原理的に推定不能 。 推定しようとすると多重共線性で落ちます。 もし時間不変要因の効果を見たいなら、 Random Effects(変量効果)モデルや Hausman-Taylor 推定、 Mundlak の近似が必要。 FE はあくまで「時間内変動」専用の道具と心得る。
② 通常の標準誤差が過小評価される(クラスタ問題)
パネルデータでは同じ個体(都道府県等)の年度間誤差が相関しています。 これを無視すると、 標準誤差が真の値の半分以下 に推定され、 有意でないものを有意と誤判定する確率が高まる。 必ず クラスタ頑健標準誤差 (cluster_entity=True)を使う。 Stata では cluster(pref)、 R では plm の vcovHC、 Python は linearmodels の自動オプションを利用。
③ 「時間固定効果も入れるべきか」を考えない
個体FEだけだと、 「景気・コロナ・政策変更」など全国共通のショックが説明変数の影響と交絡することがある。 例えば 2020-2021年のコロナ期は全国一斉に医療費が変動した。 これを「病院数増加の効果」と誤認しないためには two-way FE(個体+年) を入れる。 ただし two-way FE は heterogeneous treatment effect の下で偏りを生むことが Goodman-Bacon (2021) で示されており、 因果推論では DiD の最新手法(Callaway-Sant'Anna 等)を検討する場面も。
④ Within変換でデータ点数を見誤る
FE は各個体の平均からの差で回帰するため、 自由度は単純にサンプル数ではなく NT − N − K (個体数 N、 期間 T、 説明変数 K)になります。 47県×6年=282 観測でも、 自由度は 282-47-K と大きく目減り。 ガジット派が「サンプル多いから安全」と過信するのは危険。 観測数と自由度を区別して計画する。
⑤ 外生性の仮定をチェックしない
FE は「個体固有の時間不変 交絡」を除去しますが、 「時間変動する交絡」は依然として残る。 たとえば「病院数増加 → 医療費増加」の推定で、 実は「県の景気変動が両方を動かしている」場合、 FE では救えない。 IV(操作変数)や DiD・PSM・合成統制法を併用する必要があります。 Hausman 検定で FE vs RE を比較するのも基本動作。
⑥ 個体間差を「説明できない誤差」として捨てる
FE は個体間の系統的な違い(例:東京vs鳥取の構造的違い)を全部 α_i に押し込む。 つまり「東京と鳥取で平均的に何が違うか」については一切答えない。 もしそれが研究目的なら、 FE は不適切。 Random Effects か HLM(階層線形モデル)が必要。 研究目的が「県内変動の効果」なのか「県間差の説明」なのかを最初に明確にする。
⑦ ダミー変数を直接入れると計算が遅い
47県のダミー変数を直接入れた OLS は、 サンプル数が増えると行列演算が非常に重くなる。 linearmodels の PanelOLS や R の fixest::feols は Within 変換を内部で使い、 ダミー行列を作らないので桁違いに速い 。 大規模パネル(数万個体×数十年)では必須テクニック。
⚠️ エッジケース 8 連発 — 固定効果モデルでつまずくポイント
1. クラスタ数が少ない(< 30)
クラスタロバスト SE の漸近近似が崩れる。 wild cluster bootstrap で再評価。
2. 個体ダミーが多重共線
個体固定効果を入れると切片を落とさないと完全多重共線。 drop_first=True。
3. 時間不変な政策ダミー
「県境界の改編」など個体固有の時間不変ダミーは推定不可。 主分析から除外。
4. unbalanced パネルでの脱落
脱落が処置と相関するなら IPW で補正。
5. 動学パネル
被説明変数のラグを入れると Nickell バイアス。 GMM で対処。
6. staggered な処置タイミング
TWFE は処置効果に「負の重み」を割り当てる可能性。 Callaway-Sant'Anna に切り替え。
7. 個体数 vs 時点数のバランス
N >> T では within 推定量、 N << T では時系列分析。 同等なら両方検討。
8. 異質処置効果
処置効果が個体で異なるなら、 平均処置効果は誤解を招く。 HTE 分析へ。
📋 追加ケーススタディ — SSDSE-B-2026 で固定効果分析の典型例 3 題
ケース 1: 高齢化率の上昇が県民所得に与える影響
パネルデータで「高齢化率 → 県民所得」の関係を推定。 プールド OLS では負の係数が出るが、 これは「もともと所得が低く高齢化が進んでいる地方県」と「所得が高く高齢化が遅い都市県」のクロスセクション差 を捉えているだけ。 固定効果モデルに切り替えると「同じ県の中で高齢化が進んだとき所得がどう変わったか」が見え、 因果に近い解釈が可能になる。
ケース 2: 大学進学率と労働市場
「大学進学率 → 失業率」の関係。 県固定効果を入れると「県固有の大学設置数や産業構造」を吸収。 さらに時間固定効果を入れると「全国共通の景気変動」も吸収。 両者を入れると、 「同じ県の中で進学率が上がった年に失業率がどう変わったか」が分離される。
ケース 3: 政策の県別効果評価
仮に「ある県だけが新政策を導入した」場合、 個体固定効果 + 時間固定効果 + 政策ダミー が DID と等価。 政策効果を推定する標準形であり、 平行トレンド仮定の検証が肝要。
📚 統計学習の総合ガイド
🎯 学習目標
このページの概念をマスターすることで、 以下のスキルが身につきます:
定義と公式を正確に理解
適切な使用場面を判断
Python で実装し、 結果を可視化
仮定の確認と診断
結果の解釈と報告
限界と注意点の理解
関連手法との使い分け
📊 SSDSE-B-2026 データの構造
このコンペの主要データセット(SSDSE-B-2026)の構造:
47都道府県 × 過去複数年(パネル形式)
112列の社会経済指標
人口、 出生、 死亡、 婚姻、 経済、 教育、 環境、 家計など多次元
政府統計を統合した信頼性の高いデータ
🔍 主要な変数群
カテゴリ
変数例
人口 総人口、 年齢別人口、 性別人口
人口動態 出生数、 死亡数、 合計特殊出生率、 婚姻数
気候 気温、 降水量、 降水日数
教育 幼小中高校数、 教員数、 生徒数、 大学進学率
経済 求職件数、 求人件数、 旅館数
医療 病院数、 診療所数、 歯科診療所
家計 消費支出、 食料費、 住居費、 教育費等の項目別
💡 ジャストインタイム型学習
このガイドは「必要なときに必要な知識 」を提供する設計:
論文中の用語をクリック → 該当の用語解説へジャンプ(ポップアップ)
概念マップで関連用語を辿る
包含マップで体系を把握
ツリーマップで全体を俯瞰
Python コードをコピーして実行
SSDSE データで実際に試す
🛠️ Python データサイエンス環境
🎯 解説: 環境の準備と読み込み確認。ライブラリを import して日本語フォントを設定し、SSDSE-B-2026 を 564 行のパネルのまま読み込む。高齢化率を計算し、4 都県の 2012 年度と 2023 年度を並べて、固定効果が吸収する県ごとの水準差と、推定に使われる県内の変化を見比べる。pip の行はコメントにしてあるので、ターミナルで 1 回だけ実行する。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 # 事前に(ターミナルで 1 回だけ): pip install pandas numpy scipy statsmodels scikit-learn matplotlib seaborn
# 標準的なインポート
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from scipy import stats
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import r2_score , mean_squared_error
# 日本語表示の設定(matplotlib)
plt . rcParams [ 'font.family' ] = 'Hiragino Sans'
plt . rcParams [ 'axes.unicode_minus' ] = False
# データ読み込み(SSDSE-B は cp932。skiprows=[1] で 2 行目の日本語の項目名を飛ばし、1 行目の英字コードを列名にする)
df = pd . read_csv ( 'data/raw/SSDSE-B-2026.csv' , encoding = 'cp932' , skiprows = [ 1 ])
print ( df . shape ) # 47 都道府県 × 12 年度(2012〜2023)
# 固定効果が吸収する「県ごとの水準の違い」と、残る「県内の年次変化」を並べて見る
df [ '高齢化率' ] = df [ 'A1303' ] / df [ 'A1101' ] * 100
tab = df . pivot ( index = 'Prefecture' , columns = 'SSDSE-B-2026' , values = '高齢化率' )
print ( tab . loc [[ '東京都' , '愛知県' , '秋田県' , '沖縄県' ], [ 2012 , 2023 ]] . round ( 1 ))
📥 入力例: data/raw/SSDSE-B-2026.csv(cp932。1 行目が英字コード、2 行目が日本語の項目名、その下に 47 都道府県 × 12 年度 = 564 行。新しい年度が先に並ぶ)
📤 実行例(実測)
(564, 112)
SSDSE-B-2026 2012 2023
Prefecture
東京都 21.2 22.8
愛知県 21.4 25.7
秋田県 30.7 39.1
沖縄県 17.7 23.8
💬 2023 年度の高齢化率は東京都 22.8% から秋田県 39.1% まで 16 ポイント以上開いているのに、2012→2023 年度の県内の上昇は東京都 1.6、愛知県 4.3、沖縄県 6.1、秋田県 8.4 ポイントにとどまる。固定効果モデルはこの県ごとの水準差を県ダミーで丸ごと吸収し、残った県内の変化だけで係数を推定するので、県間の差が主役の変数ほど推定に使える情報が少なくなる。
🌟 効果的なEDAテンプレート
▼ コード解説(EDA テンプレート関数)
🎯 解説: quick_eda(df) を定義するだけのブロック。形状・型・欠損・要約統計を表示し、数値列のヒストグラムと相関ヒートマップを描く。
📥 入力例: 任意の DataFrame(例: skiprows=[1] で読んだ SSDSE-B-2026 の 564 行)。np・plt・sns は前のブロックで import 済みとする
📤 実行例(実測)
関数を定義するだけなので、このブロック単体では何も出力しない
💬 読み方: 固定効果の前に quick_eda(df) でパネル全体を眺めるときは、564 行に同じ県が 12 回ずつ入っている点に注意する。ヒストグラムや相関は県間の差と年次変化が混ざった値で、within と between の分解はこの関数では分からない。
📋 コピー 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 def quick_eda ( df , target = None ):
"""探索的データ分析の基本テンプレート"""
print ( f "Shape: { df . shape } " )
print ( f " \n Column types: \n { df . dtypes } " )
print ( f " \n Missing values: \n { df . isnull () . sum () } " )
print ( f " \n Basic stats: \n { df . describe () } " )
# 数値列の可視化
numeric_cols = df . select_dtypes ( include = [ np . number ]) . columns
df [ numeric_cols ] . hist ( bins = 20 , figsize = ( 15 , 10 ))
plt . tight_layout ()
plt . show ()
# 相関ヒートマップ
if len ( numeric_cols ) > 1 :
plt . figure ( figsize = ( 12 , 10 ))
sns . heatmap ( df [ numeric_cols ] . corr (), annot = True , fmt = '.2f' ,
cmap = 'RdBu_r' , center = 0 )
plt . show ()
# ターゲットがあれば散布図行列
if target and target in df . columns :
cols = list ( numeric_cols [: 5 ])
if df [ target ] . dtype == 'O' : # 文字列の列なら色分け(hue)に使う。hue の列も渡す
sns . pairplot ( df [ cols + [ target ]], hue = target )
else :
sns . pairplot ( df [ cols ])
plt . show ()
📤 実行例(実測)
このブロックは標準出力を出さない(図を描く・変数を定義するだけ)。
📈 報告書テンプレート
分析結果を報告する際の標準的な構成:
背景・目的 :なぜこの分析が必要か
データ :出所、 サンプルサイズ、 期間
方法 :使用した統計手法、 仮定
結果 :図表、 統計量、 検定結果
解釈 :結果が何を意味するか
限界 :分析の制約
結論 :要点まとめ、 今後の課題
固定効果モデル(fixed effects model)は、 パネルデータ解析の標準装備であり、 同時に「処置群 ・ 対照群」「DID」「二元固定効果」と地続きの教材体系の中央に位置します。
このページから飛べる主要グループ教材
SSDSE-B-2026 における固定効果学習の流れ(推奨)
パネルデータ として整形し、 between/within 分解で固定効果が拾う情報量を確認する。
変量効果モデル と比較し、 Hausman 検定 で外生性を判断する。
DID で「二元固定効果(個体+時間)」へ拡張する。
ロバスト統計 の応用としてクラスタロバスト標準誤差を導入する。
パネル因果分析 の応用例として政策効果推定に進む。
到達目標
固定効果が「個体間異質性」を吸収する代償として何を犠牲にするかを言語化できる。
SSDSE-B-2026 における「県固有の事情」をモデルで明示的に吸収する経験を積む。
個体・時間の二元固定効果と DID の同値性を理解できる。
📚 参考文献・読み物 — 固定効果モデルを深掘りする
Wooldridge (2010) Econometric Analysis of Cross Section and Panel Data , 2nd ed. — パネル分析の聖書。 固定効果・変量効果・GMM を網羅。
Cameron & Trivedi (2005) Microeconometrics: Methods and Applications . — クラスタロバスト SE とパネル因果推論。
Angrist & Pischke (2009) Mostly Harmless Econometrics . — DID と固定効果の直感的解説。
Bertrand, Duflo & Mullainathan (2004) How Much Should We Trust Differences-in-Differences Estimates? , QJE. — クラスタ SE の必要性を実証。
Callaway & Sant'Anna (2021) Difference-in-Differences with Multiple Time Periods , JoE. — staggered DID の新手法。
Goodman-Bacon (2021) Difference-in-Differences with Variation in Treatment Timing , JoE. — TWFE の負の重み問題。
de Chaisemartin & D'Haultfœuille (2020) Two-Way Fixed Effects Estimators with Heterogeneous Treatment Effects , AER. — 異質処置効果の問題。
✅ 固定効果モデルの最終チェックリスト 12 項目
個体固定効果と時間固定効果のどちらを入れるか明示したか。
Hausman 検定で固定効果が適切と判定されたか。
within / between / overall R^2 の 3 つを報告したか。
クラスタロバスト SE を使ったか。
クラスタ数が少ない場合 wild cluster bootstrap で再評価したか。
時間不変な変数を強引に入れていないか確認したか。
動学パネルでは Nickell バイアスを意識し GMM を検討したか。
staggered な処置の場合、 Callaway-Sant'Anna 等に切り替えたか。
感度分析として個体固定効果のみ ・ 二元固定効果 ・ 個体 × 線形時間 を比較したか。
異質処置効果の可能性を HTE 分析で検討したか。
FWL の定理を理解し、 within 変換と LSDV が同じ係数を返すことを確認したか。
新規個体への予測ができないことを認識し、 必要なら階層モデルへ移行を検討したか。
📝 まとめノート — 固定効果モデル
このページは「固定効果モデル」を SSDSE-B-2026 (47 都道府県 × 多変量) を題材に体系的に学ぶための一気通貫の教材です。 単なる用語定義集ではなく、 「直感 → 数式 → 実装 → 落とし穴 → 関連手法」 という流れで一周することで、 業務での意思決定にそのまま使える知識に組み上げます。
本ページで取り上げた手法・記号・コード例は、 すべて実データの 47 都道府県 を入力として動作する形にしてあります。 合成データに依存しないため、 SSDSE-B-2026 を data/raw/SSDSE-B-2026.csv として配置するだけでコード片を再現できます。
関連グループ教材へのリンクを使い、 「この用語が属する大きな分野」を俯瞰してから戻ってくると、 知識が一段抽象化された形で定着します。 用語ページは点、 グループ教材は線、 概念マップは面 — 三層を往復しながら学習を進めてください。
本ページの内容に不足を感じたら、 相関ページ(correlation.html )を参照基準として、 ご自身の解釈を加筆していくことを推奨します。 教材の完成形ではなく、 学習者自身の理解の出発点として位置付けてください。
最後に、 SSDSE-B-2026 の 47 都道府県データは「N=47 と少ない」という構造的制約があります。 統計検定の漸近近似が崩れる場面、 単一の県(東京都・沖縄県)が全体傾向を支配する場面、 標準誤差が過小評価される場面 — これらは本ページの随所で繰り返し注意喚起しました。 「実データの小ささを軽視しない」 という姿勢が、 実務でのデータサイエンティストの基本姿勢です。
🧩 追補解説 — within の分散分解と「実測エフェクトの動き方」
既存の「直感」章とは別角度 から固定効果を捉え直します。 ここでのキーワードは「各個体を自分自身の対照群にする 」という発想と、 「全変動を between(個体間)と within(個体内)に分解する 」という会計です。 固定効果推定量が使うのは within の変動だけ 。 したがって「within にどれだけ情報が残っているか」を先に確認するのが、 落とし穴を避ける最短ルートになります。 以下の数値はすべて SSDSE-B-2026(47 都道府県 × 2012–2023 年 = 564 観測、 cp932 / skiprows=[1])を実測 したものです(高齢化率 = A1303÷A1101×100、 出生率 = A4101÷A1101×1000)。
🎯 直感の再定義 — 「平均を引く」は「自分との比較」
within 変換 $x_{it}-\bar{x}_i$ は、 各県を他県ではなく過去の自分 と比べる操作です。 プール OLS や between 推定量が「高齢化率が高い県は出生率が低い」という県と県の横比較 を見るのに対し、 固定効果は「同じ県の中で高齢化が進んだ年に、 出生率がどう動いたか」という県内の縦比較 だけを見ます。 時間不変の県特性(気候・地理・県民性)は「自分の平均」に丸ごと含まれるので、 差を取った瞬間に消えます。 これが「self-control(自己対照)」という言い換えの核心です。
📊 全変動の分散分解(実測)
各変数の総分散を between(各県平均のばらつき)と within(各県内で年ごとにばらつく分)に分解した実測値です。
高齢化率 : total=12.083 between=8.443 (69.9%) within=3.640 (30.1%)
出生率 : total= 1.224 between=0.655 (53.5%) within=0.570 (46.5%)
高齢化率は変動の約 7 割が between (=県ごとの水準差)で、 within に残るのは 3 割だけ。 固定効果はこの 3 割の情報「だけ」で係数を推定します。 「情報を捨てている」のではなく「交絡した情報を意図的に外している」のですが、 within が薄い変数ほど推定は不安定・測定誤差に脆弱 になります(後述)。
📐 5 つの推定量を同一データで比較(実測)
被説明変数 = 出生率、 説明変数 = 高齢化率で、 pooled / between / 個体 FE(within)/ 変量効果(RE)/ 二元 FE(TWFE)を推定しました。 within R² ≈ 0.800。
推定量 使う変動 高齢化率の係数(実測) 読み方
プール OLS between + within -0.232 県間差に引っ張られた混合
between between のみ -0.180 横断面「高齢な県ほど出生率低い」
個体 FE(within) within のみ -0.354 同じ県で高齢化が進むと出生率はより急に 下がる
変量効果(RE) GLS 加重 -0.344 FE に近いが無相関を仮定
二元 FE(TWFE) within − 年共通 -0.016 年ダミー追加で効果がほぼ消滅
プール OLS(-0.232)は between(-0.180)と within(-0.354)の加重平均のような中間値 になっているのが読み取れます。 これが「なぜ FE で係数が動くのか」の会計的な答えです。
⚠️ 落とし穴 ① — 個体 FE は「時間可変の交絡」を消せない(実測が語る)
上表で最も教育的なのは、 個体 FE の -0.354 が二元 FE で-0.016 までほぼ消える ことです。 これは「高齢化が進んだ県で出生率が下がった」ように見えた within 相関の大半が、 実は全国一斉に進行した時間トレンド (少子高齢化という全国共通ショック)だったことを意味します。 県固定効果は時間不変 の交絡しか吸収できないため、 この時間可変の交絡 は年固定効果(TimeEffects)を足して初めて除去できます。 「個体 FE を入れたから因果」と早合点するのは危険で、 年 FE を足したときに効果が生き残るかを必ず確認すべき、 という実データの警告です(平行トレンド / DiD の発想に接続)。
⚠️ 落とし穴 ② — within は信号分散が痩せ、 測定誤差の希薄化が悪化する
分散分解で見た通り、 高齢化率は within が総分散の 30.1% しか残りません。 古典的測定誤差 $x^{*}=x+u$ の下で回帰係数は真値の $\dfrac{\mathrm{Var}(x^{*})}{\mathrm{Var}(x^{*})+\mathrm{Var}(u)}$ 倍に希薄化(attenuation)します。 within 変換は分母の信号分散 $\mathrm{Var}(x^{*})$ を減らす一方、 誤差分散 $\mathrm{Var}(u)$ は多くの場合そのまま残るため、 希薄化率が悪化 します。 「FE にしたら係数がゼロに近づいた」現象は、 交絡除去だけでなく信号対雑音比の低下 が原因のこともある、 という二面性に注意してください(測定誤差 )。 (希薄化の一般式は教科書結果であり、 上の 30.1% は SSDSE-B-2026 の実測、 誤差分散そのものは本データからは同定できません。)
⚠️ 落とし穴 ③ — 系列相関で SE が過小、 クラスタ SE で補正(実測)
同じ県の年度間で誤差は相関するため、 i.i.d. を仮定した標準誤差は過小評価になります。 上の個体 FE(高齢化率係数)で実測すると:
i.i.d. SE = 0.0078
クラスタ SE = 0.0114 (cluster_entity=True, 47 県クラスタ)
比 = 1.46 倍
この例では 1.46 倍ですが、 系列相関が強い変数ではもっと開きます。 t 値・信頼区間・有意性判定がすべて楽観的にずれるため、 パネルではクラスタ頑健 SE を既定 にするのが作法です(標準誤差 )。 なお N=47 はクラスタ数として下限に近く、 不安なら wild cluster bootstrap を併用します。
⚠️ 落とし穴 ④ — 時間不変変数・少数時点・大量ダミー
時間不変変数は識別不能 : within で消えるため、 県コードや地理的固定属性の係数は原理的に推定できません。 効果を見たいなら Hausman 検定を経て RE、 または Mundlak / Hausman-Taylor を検討。
少数時点の Nickell バイアス : 動学項 $y_{i,t-1}$ を右辺に入れると、 within 変換が誤差とラグ被説明変数を機械的に相関させ、 係数が $O(1/T)$ のバイアスを持ちます。 SSDSE-B は T=12 と短めなので、 動学化するなら 操作変数 ベースの Arellano–Bond GMM に移行します(ラグ変数 )。
大量ダミーの計算コスト : 個体数が多いと LSDV は行列が肥大化します。 within 変換(demean)は数学的に等価(Frisch–Waugh–Lovell)で高速。 市区町村・企業パネルではこの差が実行時間を左右します。
🚀 発展 — 何を足すと何が変わるか(Hausman・Mundlak・動学)
RE を選べるか(Hausman) : 本データで FE と RE の係数差を Hausman 検定 にかけると χ² ≈ 149.6(df=1, p<0.001)で RE は棄却。 「個体効果と説明変数が無相関」という RE の仮定は成り立たず、 FE 一択と判定されました(実測)。
Mundlak 装置 : RE に各県平均 $\bar{x}_i$ を共変量として加えると、 within 係数は FE と一致し、 $\bar{x}_i$ の係数が「between と within の差」を表します。 Hausman の中身を回帰の形で可視化する道具です。
二元固定効果と DiD : TWFE は多期間 DiD と等価で、 本データで効果がほぼ消えたのはまさに「時間共通ショックを引いた後の純効果」を見たから。 ただし処置タイミングがずれる staggered 設計では TWFE が偏るため(Goodman-Bacon 2021)、 パネル因果推論 では新しい推定量を使います。
within/between/pooled の三位一体 : 同じデータでも「どの変動を使うか」で結論が変わります(本ページの -0.180 / -0.354 / -0.232)。 3 つを併記して初めて、 交絡の正体(交絡 / 内生性 )を議論できます。 基礎枠組みは パネルデータ ・変量効果 を参照。
※ 本節の係数・分散・SE・χ² はすべて SSDSE-B-2026 実測(出生率〜高齢化率、 単回帰、 564 観測)。 測定誤差の希薄化式のみ一般的な教科書結果で、 誤差分散は本データからは同定していません。
🗺️ パネルデータ手法選択フローチャート
Q1: データ構造は本当にパネル (panel) か?
1 個体 × T 時点 (時系列) → ARIMA / ETS / 状態空間モデル
N 個体 × 1 時点 (クロスセクション) → 通常 OLS / 階層モデル
N 個体 × T 時点 (パネル) → Fixed Effects / Random Effects / DiD
個体 ID が一貫している : long panel、 そうでなければ短期反復横断 (repeated cross-section)
Q2: 個体に観測不能な異質性 (unobserved heterogeneity) があるか?
説明変数と相関あり (おそらく) → Fixed Effects (FE) (within 推定量)
説明変数と相関なし → Random Effects (RE) (GLS、 効率的)
判定方法 : Hausman 検定 (H_0: RE 一致) → 棄却なら FE 採用
個体平均を入れる → Mundlak 装置で RE を FE と等価化
Q3: N と T のバランスは?
N 大 / T 小 (短パネル、 例: SSDSE-B 47 都道府県 × 5 年): FE OK、 動学項なら Nickell バイアス注意
N 小 / T 大 (長パネル、 マクロ国別): 時間固定効果重要、 系列相関補正
N 大 / T 大 : TWFE (Two-Way Fixed Effects)、 Drukker クラスタ SE
動学項 (y_{t-1}) を入れる : Arellano-Bond / System GMM
Q4: 推定値の標準誤差は?
クラスタ標準誤差 (個体別) : パネルでは原則必須 (Cameron & Miller 2015)
2-way clustering : 個体 × 時間両方相関ある場合
Driscoll-Kraay SE : 横断的な系列相関に頑健 (国別マクロデータ)
linearmodels Python パッケージ : PanelOLS で cluster="entity" を指定
📏 効果量の参照表
p値だけでなく効果量も併記するのが現代統計の標準。 主要な指標と Cohen の解釈基準:
統計量
効果量
小
中
大
2群平均差 Cohen's d 0.2 0.5 0.8
相関 r 0.1 0.3 0.5
線形回帰 R² 0.02 0.13 0.26
ANOVA η² (eta²) 0.01 0.06 0.14
χ² Cramér's V 0.1 0.3 0.5
ロジスティック Odds Ratio 1.5 2.5 4.0
🗺️ 概念マップ — 3つの視点で体系を理解する
固定効果モデル がデータサイエンスの体系の中でどこに位置するか を、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
📍 体系階層のパス
🌐 統計・データサイエンス › 因果推論 › パネル分析 › 固定効果モデル (個体固有の効果を除く推定)
① 🔗 関係マップ — 「他の手法とどう繋がっているか」
中心に 固定効果モデル を置き、 そこから パネルデータ・ランダム効果・時系列分析 計 3 個の用語へ、 前提・兄弟・発展形といった関係を矢印で結んでいます。 線がどちら向きかを見れば、 先に読むべき用語 とあとから読む用語 が分かります。 ノードはドラッグ で動かせ、 ホイールでズーム 、 クリックでその用語のページへ遷移 します。
凡例: 現在の用語 上位カテゴリ 兄弟(並列) 前提 発展形 応用先 2階層先
② ⭕ 包含マップ — 「どのカテゴリに含まれているか」
大きな円が小さな円を包含 する Circle Packing 図。 「固定効果モデル」は緑色でハイライト 。
カテゴリ円をクリック :その内部にズームイン
白背景クリック :1階層戻る
用語円をクリック :詳細ページへ遷移
マウスホバー :階層パス表示
③ 🌳 ツリーマップ — 「面積で見るボリューム比較」
長方形を入れ子に分割した Treemap 図。 各分野の規模感 を面積で比較。 「固定効果モデル」は緑色でハイライト 。
カテゴリ矩形をクリック :その内部にドリルダウン
パンくず(上のリンク)クリック :その階層に戻る
用語矩形をクリック :詳細ページへ遷移
マウスホバー :階層パスと値を表示
🎯 3つのマップの使い分け
マップ
分かること
こんな時に見る
🔗 関係マップ 手法間の横の関係 (前提→発展→応用) 「次に何を学べばよい?」 学習順序の判断
⭕ 包含マップ 分類体系の入れ子構造 (上位⊃下位) 「この手法はどんなジャンルに属する?」
🌳 ツリーマップ 分野の規模比較 (面積=ボリューム) 「データサイエンス全体の俯瞰像」
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは 固定効果モデル の隣に何が並ぶか を、 包含マップとツリーマップは 統計・データサイエンス → パネル分析 → 固定効果モデル という入れ子の位置 を示します。 「パネル分析には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
🔗 隣接手法への橋渡し
「固定効果モデル」は単独で完結せず、 隣接する手法と接続することで分析パイプラインの一部として機能する。 以下に具体的な接続関係を示す。
「固定効果モデル」は (1) パネルデータ整備 (個体 i × 時期 t) → (2) within 変換または LSDV → (3) クラスタロバスト標準誤差 → (4) F 検定で個別効果有意性 → (5) Hausman 検定で RE vs FE 選択、 の 5 段パネル分析パイプラインで運用する。
🌳 固定効果モデルの意思決定木 — 6 つの分岐
分岐 1: パネルデータか
はい → 固定効果モデルを検討。
いいえ(クロスセクション) → 通常の OLS でよい。
分岐 2: 個体効果と説明変数に相関はあるか
あり → 固定効果一択。 変量効果は不偏でない。
なし → 変量効果も使える。 Hausman 検定で確認。
分岐 3: 時間不変な説明変数があるか
あり、 かつそれが主役 → 固定効果では推定不能。 ハイブリッドモデルや Mundlak 装置を検討。
なし → 通常の固定効果で OK。
分岐 4: 全国共通のショックはあるか
あり → 二元固定効果(時間 + 個体)。
なし → 個体固定効果のみで OK。
分岐 5: 標準誤差の計算
クラスタロバスト SE を必ず使う。 SSDSE-B-2026 の N=47 ではギリギリ妥当だが、 wild cluster bootstrap も併用。
分岐 6: 因果推論につなぐか
はい → DID ・ 二元固定効果 ・ 合成統制法へ。
いいえ → 記述的 panel regression で完結。
📖 固定効果モデルの専門用語ミニ辞典 — 14 語
Fixed Effects Model (FE)
個体固有の時不変要素をダミー変数で吸収するモデル。
Random Effects Model (RE)
個体効果を確率変数として扱うモデル。 説明変数と無相関を仮定。
Hausman 検定
固定効果と変量効果のどちらが適切かを統計的に判定。
LSDV (Least Squares Dummy Variable)
個体ダミー変数を全部入れて OLS する愚直法。
Within 変換
各列から個体平均を引く前処理。 LSDV と同じ係数を返す。
Between 推定量
個体平均同士の回帰。 cross-section 的な情報を使う。
Two-Way Fixed Effects (TWFE)
個体固定効果 + 時間固定効果のモデル。 DID と等価。
Cluster Robust Standard Error
個体内系列相関を考慮した標準誤差。 パネルでは必須。
Nickell バイアス
動学パネル(被説明変数のラグを入れる)で生じるバイアス。 T が小さいと大きい。
Mundlak 装置
変量効果モデルで個体平均を説明変数に加えることで、 固定効果と等価にする技。
FWL の定理
Frisch-Waugh-Lovell。 「他の変数を残差化してから回帰する」と元の係数と同じになる。 within 変換の理論的根拠。
Incidental Parameters Problem
N が大きく T が小さいと、 個体パラメータ推定の誤差が累積する問題。
Wald 検定
固定効果モデルの個体ダミー群が全体として有意かを検定。
Pooled OLS
個体・時間構造を無視した OLS。 固定効果との比較の基準点。
🔖 キーワード索引(深掘り版)
論文・記事に登場する用語のリンクで該当箇所へジャンプ: