「hausman」は統計データ分析の文脈で扱う重要概念のひとつ。 本ページでは「hausman」を取り巻く中核キーワードを以下にチップで一覧化する。 各キーワードは関連する概念・手法・道具立てを含み、 文献検索や学習計画の起点になる。
これらのキーワードは「hausman の理解 → 適用 → 検証」のプロセスを構成する。 各章で詳しく解説する。
🍰 まずはやさしく
分析方法を選ぶための判定基準です。
どちらの手法が正しいか決めるために使います。
部活の成績を年度ごとに比べる時に役立ちます。
この章では結論の出し方を学びます。
compare や Stata の hausman コマンドが代表的。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 | # ハウスマン検定:固定効果(FE) vs 変量効果(RE) を選ぶ import pandas as pd import numpy as np from linearmodels.panel import PanelOLS, RandomEffects from scipy.stats import chi2 # SSDSE-B-2026 を県×年度パネルとして読み込む(cp932・2行目の単位行を除外) 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['aging'] = df['A1303'] / df['A1101'] * 100 # 高齢化率(65歳以上人口/総人口) df['birth'] = df['A4101'] / df['A1101'] * 1000 # 出生率(人口千人当たり) df['spend'] = df['L3221'] / 1000 # 消費支出(千円) panel = df.set_index(['pref', 'year'])[['birth', 'aging', 'spend']].dropna() # FE と RE を両方推定する fe = PanelOLS.from_formula('birth ~ aging + spend + EntityEffects', panel).fit() re = RandomEffects.from_formula('birth ~ 1 + aging + spend', panel).fit() # ハウスマン統計量 H = (b_FE - b_RE)'(V_FE - V_RE)^-1 (b_FE - b_RE) ~ chi2(k) cols = ['aging', 'spend'] b_diff = fe.params[cols] - re.params[cols] v_diff = fe.cov.loc[cols, cols] - re.cov.loc[cols, cols] H = float(b_diff.values @ np.linalg.inv(v_diff.values) @ b_diff.values) p = 1 - chi2.cdf(H, df=len(cols)) print(f'Hausman H = {H:.2f}, df={len(cols)}, p = {p:.4f}') print('→ FE を採用' if p < 0.05 else '→ RE で可(より効率的)') |
📤 実行例(SSDSE-B-2026 実データ, 47 県 × 12 年 = 564 観測):
このページの上にある3つの概念マップ(関係マップ、 包含マップ、 ツリーマップ)でこの概念の位置づけが視覚的に分かります。 関連手法を辿って学習を進めましょう。
統計データ活用コンペティションのSSDSE-B-2026データは、 47都道府県の社会経済データ。 この概念を使って以下のような分析ができます:
| 機能 | Python (pandas) | Python (scipy) |
|---|---|---|
| 要約統計 | df.describe() | stats.describe() |
| 平均 | df.mean() | np.mean() |
| 標準偏差 | df.std() | np.std() |
| 相関 | df.corr() | stats.pearsonr() |
| t検定 | — | stats.ttest_ind() |
| 回帰 | — | stats.linregress() |
| 分布フィッティング | — | stats.norm.fit() |
この概念は、 他の多くの統計概念と密接に関連しています。 ジャストインタイム型学習では、 必要に応じて関連用語へジャンプしながら全体像を構築します。
| グループ | 主要概念 |
|---|---|
| 記述統計 | 平均、 中央値、 最頻値、 分散、 標準偏差、 共分散、 相関係数 |
| 可視化 | ヒストグラム、 散布図、 箱ひげ図、 ヒートマップ |
| 推測統計 | 標本平均、 標準誤差、 信頼区間、 p値、 有意水準 |
| 確率分布 | 正規分布、 t分布、 χ²分布、 F分布、 二項分布 |
| 仮説検定 | t検定、 F検定、 χ²検定、 ノンパラ検定 |
| 回帰 | 単回帰、 重回帰、 OLS、 Ridge、 LASSO |
| 分類 | ロジスティック回帰、 決定木、 SVM、 k-NN |
| 教師なし学習 | クラスタリング、 PCA、 因子分析 |
| 時系列 | ARIMA、 VAR、 指数平滑法、 自己相関 |
| 因果推論 | DiD、 IV、 傾向スコア、 交絡変数 |
| 前処理 | 標準化、 正規化、 欠損値処理、 多重共線性対策 |
| 評価 | R²、 残差、 CV、 RMSE、 効果量 |
🍰 まずはやさしく
データの分析で使われる道具です。
適切な計算方法を選ぶために使います。
県ごとの人口の変化を調べる時に便利です。
実際の調査でどう使われるかを見ていきましょう。
論文中に 「Hausman検定」として登場する用語。
Hausman検定 とは:パネルデータで「固定効果(FE)とランダム効果(RE)のどちらを使うべきか」を判定する検定。
日本における代表的な経済・社会学パネル調査と、 そこで Hausman 検定がどう使われているかをまとめる。
| 調査名 | N × T | 代表的な分析テーマ | 典型的 Hausman 結果 |
|---|---|---|---|
| SSDSE-B (47 都道府県) | 47 × 12 | 人口・経済・労働 | FE 採用 (本ページ例) |
| JHPS/KHPS (慶應) | ≈4000 × 15 | 家計・消費・労働供給 | 論文の 7 割で FE |
| JLPS-M (東大) | ≈3000 × 12 | 若年層キャリア・結婚 | 教育リターンで FE |
| JSTAR (高齢者) | ≈8000 × 6 | 健康・引退・年金 | 健康効果で FE |
| RIETI 企業 DB | 数万社 × 20+ | 生産性・R&D | 企業効果でほぼ FE |
SSDSE は教育用パネルとして手頃な規模で、 Hausman の手計算を学ぶ最良の素材。 実務では JHPS や JLPS のような個人レベルパネルで動学的・非線形モデルへ拡張するのが普通。
$$ \text{検出力} \propto \sqrt{N \cdot T} \cdot \frac{|\Delta\beta|}{\sigma_\Delta} $$
SSDSE (NT=564) は中規模で、 効果が中程度以上なら検出できる。 N が大きいほど Hausman は鋭敏になり、 小さな内生性も検出してしまうので注意。
🍰 まずはやさしく
計算方法の「使い分け」を決めるルールです。
データの個性が結果に影響するかを調べます。
地域ごとの歴史や気候などの個性を考えます。
直感的にどういう仕組みか解説します。
パネルデータ(同じ個体を複数時点で観測した縦断データ)を回帰するとき、固定効果モデル (Fixed Effects, FE) と 変量効果モデル (Random Effects, RE) のどちらを使うべきか —— その判定に使うのが Hausman 検定(Wu–Hausman 検定)。 1978 年に Jerry Hausman が提案した。
直感的には: 「個体ごとの未観測ヘテロジニティ $\alpha_i$ が説明変数 $X_{it}$ と相関しているか?」 を問う。 相関していれば RE は不偏でなくなり、 FE しか使えない。 相関していなければ RE がより効率的(小さな分散)。
| 観点 | Fixed Effects (FE) | Random Effects (RE) |
|---|---|---|
| $\alpha_i$ の扱い | 固定パラメータ(推定対象) | 確率変数 $\alpha_i \sim N(0, \sigma_\alpha^2)$ |
| $\mathrm{Cov}(\alpha_i, X_{it})$ | 任意(相関しててもよい) | = 0 を仮定(厳格) |
| 時不変変数 | 推定不可(吸収されて消える) | 推定可 |
| 効率性 | RE より分散大 | 仮定成立なら最小分散 |
| 不偏性 | 常に一致 (consistent) | $\mathrm{Cov}(\alpha_i, X_{it}) \neq 0$ なら不偏でない |
| Hausman 判定 | $H_0$ 棄却で FE | $H_0$ 採択で RE |
パネルデータ分析の 最初の選択肢 として、 Hausman は必ず通る関門。 経済学・労働経済・公衆衛生・政策評価ではほぼ全ての論文が報告する。
Hausman 検定は固定効果モデルとランダム効果モデルの推定値の差を比較する。 差を視覚化する 3 枚の概念図でイメージを補強する。



ハウスマン検定の核心は「2 つの推定量(FE と RE)が食い違うかどうか」で仮定を検定する点にある。 下のスライダーで 個体効果 $\alpha_i$ と説明変数 $X_{it}$ の相関 を強めていくと、 変量効果 (RE) の推定値がじわじわ真値からズレていき、 固定効果 (FE) との差が広がって、 ついにハウスマン統計量 $H$ が臨界値を超えて RE が棄却される —— その一部始終をリアルタイムで体感できる。
ミニパネル(個体数 $N$ × 時点 $T=5$、 真の傾き $\beta=1$)をブラウザ内で毎回その場で回帰し、 FE(within 推定)と RE(GLS 変換)を計算している。 数式は本ページの定義どおりだが、 描画を滑らかにするため乱数は固定シードで生成し、 分散成分は素朴な推定量を使う 近似デモ。 傾向を掴むためのもので、 論文用の厳密値ではない。
FE と RE は帰無仮説($\mathrm{Cov}(\alpha_i,X_{it})=0$)が正しければどちらも同じ真値に近づく。 唯一の違いは効率性(RE の方が分散が小さい)だけ。 ところが仮定が破れると、 RE だけが偏り、 FE との差が開く。 ハウスマンは「2 つの推定値がズレていないか」を、 差の大きさをその不確実性で割って測る —— 差が誤差の範囲なら $H$ は小さく(p 大=RE でよい)、 差が誤差を超えれば $H$ は大きい(p 小=FE を採る)。 スライダーで ρ を上げると橙線(RE)が緑線(FE)から離れ、 それに連動して赤い縦線(H)が右へ滑っていく様子がまさにこの原理。
🍰 まずはやさしく
2つの計算結果の差を比べる式です。
どちらの手法がより正確か判定します。
スマホの利用時間と成績の関係などを考えます。
数式を使って詳しく定義を確認しましょう。
$\hat\beta_{FE}$ を固定効果推定値、 $\hat\beta_{RE}$ を変量効果推定値とすると、 Hausman 統計量は次式で定義される。
$$ H = (\hat\beta_{FE} - \hat\beta_{RE})^\top \, \left[ \mathrm{Var}(\hat\beta_{FE}) - \mathrm{Var}(\hat\beta_{RE}) \right]^{-1} \, (\hat\beta_{FE} - \hat\beta_{RE}) $$
帰無仮説 $H_0: \mathrm{Cov}(\alpha_i, X_{it}) = 0$(→ RE が不偏)のもとで、 $H \sim \chi^2_k$ ($k$ は時変説明変数の次元)。
判定ルール:
古典的 Hausman の弱点は「$V_{FE} - V_{RE}$ が必ずしも正定値でない」こと(小標本や誤特定で頻繁に起こる)。 これを回避するのが Mundlak (1978) や Wooldridge (2010) による「ロバスト Hausman」。
Mundlak 検定: RE モデルに「各個体の説明変数の時系列平均 $\bar{X}_i$」を追加して、 その係数 $\gamma$ が 0 か検定する。 すなわち
$$ y_{it} = \beta X_{it} + \gamma \bar X_i + \alpha_i + \varepsilon_{it} $$
$H_0: \gamma = 0$ ⇔ $\mathrm{Cov}(\alpha_i, X_{it}) = 0$ という同値性が成り立つ。 これなら通常の Wald 検定で済み、 行列の正定値性に悩まされない。
🎯 このコードでやること: Mundlak 流の代替検定を statsmodels で実装。 $\bar X_i$ を追加した RE モデルで F 検定。
📥 入力: 上記 SSDSE パネル df
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.formula.api as smf 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['aging'] = df['A1303'] / df['A1101'] * 100 df['birth'] = df['A4101'] / df['A1101'] * 1000 df['spend'] = df['L3221'] / 1000 df = df[['pref', 'year', 'birth', 'aging', 'spend']].dropna() # 個体平均を追加 df['aging_bar'] = df.groupby('pref')['aging'].transform('mean') df['spend_bar'] = df.groupby('pref')['spend'].transform('mean') # Mundlak augmented RE m = smf.mixedlm('birth ~ aging + spend + aging_bar + spend_bar', df, groups=df['pref']).fit() print(m.summary().tables[1]) # Wald: H0: aging_bar = spend_bar = 0 from scipy.stats import chi2 import numpy as np b = m.params[['aging_bar', 'spend_bar']].values V = m.cov_params().loc[['aging_bar', 'spend_bar'], ['aging_bar', 'spend_bar']].values W = float(b @ np.linalg.inv(V) @ b) p = 1 - chi2.cdf(W, df=2) print(f'Mundlak Wald W = {W:.2f}, df=2, p = {p:.4f}') |
📤 実行例:
💬 aging_bar の係数が有意(p < 0.001)→ 高齢化率は個体未観測効果と相関している。 Mundlak Wald (W = 38.06) は古典 Hausman と同じく FE を支持し、 V_diff の正定値性に依存しないので信頼できる。
「都道府県 × 年度」のパネル構造を擬似的に構築し、 高齢化率と消費支出が出生率に与える影響を、 FE モデルと RE モデルの両方で推定して比較します(SSDSE-B-2026 の 2012–2023 年 × 47 都道府県パネル)。
1 2 3 4 5 6 7 8 | import pandas as pd 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['aging'] = df['A1303'] / df['A1101'] * 100 # 高齢化率 df['birth'] = df['A4101'] / df['A1101'] * 1000 # 出生率(千人当たり) df['spend'] = df['L3221'] / 1000 # 消費支出(千円) panel = df.set_index(['pref', 'year'])[['birth', 'aging', 'spend']].dropna() print(panel.head()) |
1 2 3 4 5 6 7 | from linearmodels.panel import PanelOLS, RandomEffects fe = PanelOLS.from_formula('birth ~ aging + spend + EntityEffects', data=panel).fit() re = RandomEffects.from_formula('birth ~ 1 + aging + spend', data=panel).fit() print(fe) print(re) |
1 2 3 4 5 6 7 8 9 10 11 12 13 | from linearmodels.panel import PanelOLS, RandomEffects # ← このコードは linearmodels が必要 import numpy as np from scipy import stats cols = ['aging', 'spend'] b_fe = fe.params[cols].values b_re = re.params[cols].values V_fe = fe.cov.loc[cols, cols].values V_re = re.cov.loc[cols, cols].values diff = b_fe - b_re H = diff @ np.linalg.inv(V_fe - V_re) @ diff p = 1 - stats.chi2.cdf(H, df=len(diff)) print(f'Hausman H = {H:.2f}, p = {p:.4f}') |
| 指標 | FE 推定値 | RE 推定値 | 差 |
|---|---|---|---|
| aging | −0.3538 | −0.3424 | −0.0113 |
| spend | −0.00251 | −0.00342 | +0.00091 |
| Hausman H | 162.88 | p = 0.0000 | |
H が大きく p < 0.05 なので「個体効果と説明変数は無相関」という帰無仮説は棄却。 RE モデルは不一致推定量となるため、 FE モデルを採用するのが妥当です。
SSDSE-B-2026 は 年度 × 都道府県 の縦断データ(パネル)として読み込める。 ここでは「出生率 (A4101/A1101×1000) を被説明変数とし、 高齢化率 (A1303/A1101×100) と消費支出 (L3221) を説明変数」というモデルで FE/RE 比較を行う。 47 県 × 12 年 = 564 観測。
📥 入力データ (SSDSE-B-2026 抜粋):
🎯 このコードでやること: SSDSE-B-2026 から県 × 年度のパネルを構築し、 linearmodels.PanelOLS で FE、 RandomEffects で RE を推定、 Hausman 統計量を計算する。
📥 入力: 上記 SSDSE-B-2026 抜粋(年度・都道府県・A1101・A1303・A4101・L3221 列)
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 | import pandas as pd import numpy as np from linearmodels.panel import PanelOLS, RandomEffects df = pd.read_csv('data/raw/SSDSE-B-2026.csv', encoding='cp932', skiprows=[1]) df = df.rename(columns={'SSDSE-B-2026': 'year', 'Prefecture': 'pref'}) # パネル設定 (entity = 都道府県、 time = 年度) df['aging'] = df['A1303'] / df['A1101'] * 100 # 高齢化率 df['birth'] = df['A4101'] / df['A1101'] * 1000 # 出生率(千人当たり) df['spend'] = df['L3221'] / 1000 # 消費支出(千円) panel = df.set_index(['pref', 'year'])[['birth', 'aging', 'spend']].dropna() print('observations:', len(panel)) print('entities (都道府県):', panel.index.get_level_values(0).nunique()) print('time (年度):', panel.index.get_level_values(1).nunique()) # Fixed Effects (EntityEffects) fe = PanelOLS.from_formula('birth ~ aging + spend + EntityEffects', data=panel).fit() print('FE coef aging:', fe.params['aging'], 'spend:', fe.params['spend']) # Random Effects re = RandomEffects.from_formula('birth ~ 1 + aging + spend', data=panel).fit() print('RE coef aging:', re.params['aging'], 'spend:', re.params['spend']) # Hausman 統計量を手計算 b_diff = fe.params[['aging', 'spend']] - re.params[['aging', 'spend']] v_diff = fe.cov.loc[['aging', 'spend'], ['aging', 'spend']] - re.cov.loc[['aging', 'spend'], ['aging', 'spend']] H = float(b_diff.values @ np.linalg.inv(v_diff.values) @ b_diff.values) from scipy.stats import chi2 p = 1 - chi2.cdf(H, df=2) print(f'Hausman H = {H:.2f}, df=2, p = {p:.4f}') |
📤 実行例:
💬 H = 162.88 は $\chi^2_{2, 0.95}=5.99$ を大きく超え、 p ≈ 0 で帰無仮説を強く棄却。 → FE を採用すべき。 高齢化率・消費支出とも FE と RE で係数が有意に食い違っており、 個体未観測効果との相関による偏りが直接見えている。
論文で Hausman の結論を補強するために、 並行して報告すべき補助統計量を 5 種挙げる。
| 統計量 | 意味 | SSDSE 例の値 | 合格基準 |
|---|---|---|---|
| F (Pooled vs FE) | 個体効果有意性 | F = 39.3, p < 0.001 | p < 0.05 |
| Breusch-Pagan LM | RE 必要性 | LM = 1238.0, p < 0.001 | p < 0.05 |
| Hausman H | FE vs RE | H = 162.9, p < 0.001 | p < 0.05 → FE |
| Mundlak Wald | ロバスト版 Hausman | W = 38.1, p < 0.001 | p < 0.05 → FE |
| Wooldridge AR(1) 検定 | 系列相関 | F = 570.0, p < 0.001 | p < 0.05 → クラスタ SE |
$$ LM = \frac{NT}{2(T-1)} \left[ \frac{\sum_i (\sum_t \hat e_{it})^2}{\sum_i \sum_t \hat e_{it}^2} - 1 \right]^2 $$
F 検定と BP-LM の両方を Hausman の前にやる、 というのが Baltagi (2021) の標準フロー。
合成データで Fixed Effect と Random Effect モデルの係数差から H 統計量を計算する。
| 変数 | β_FE | β_RE | 差 |
|---|---|---|---|
| X1 | 2.5 | 2.0 | 0.5 |
| X2 | 1.2 | 1.0 | 0.2 |
分散差 (FE-RE) の対角: [0.01, 0.005]
1 2 3 4 5 6 7 8 | import numpy as np from scipy import stats diff = np.array([0.5, 0.2]) var_diff = np.diag([0.01, 0.005]) H = diff @ np.linalg.inv(var_diff) @ diff p = 1 - stats.chi2.cdf(H, df=2) print(f"H = {H:.2f}") print(f"p = {p:.4f}") |
💬 手計算 (Step 2) H=33 と Python 出力が完全一致。
compare(最短コード)1 2 | from linearmodels.panel import compare print(compare({'FE': fe, 'RE': re})) |
1 2 3 4 5 6 7 8 9 10 11 | import statsmodels.api as sm # 個体ダミーで FE を表現 dummies = pd.get_dummies(panel.index.get_level_values('pref'), drop_first=True) X_fe = pd.concat([panel[['aging', 'spend']].reset_index(drop=True), dummies.reset_index(drop=True)], axis=1).astype(float) y = panel['birth'].reset_index(drop=True) fe2 = sm.OLS(y, sm.add_constant(X_fe)).fit() # 通常 OLS(pooled)との係数差 X_pool = sm.add_constant(panel[['aging', 'spend']].reset_index(drop=True).astype(float)) pool = sm.OLS(y, X_pool).fit() print(fe2.params[['aging', 'spend']] - pool.params[['aging', 'spend']]) |
1 2 3 | from scipy.stats import chi2 for H in [3.0, 5.99, 10.0, 12.34, 20.0]: print(f'H={H:5.2f} p={1-chi2.cdf(H, df=2):.4f}') |
plm パッケージ互換(rpy2 経由)1 2 3 4 5 6 7 8 9 10 | import rpy2.robjects as ro from rpy2.robjects import pandas2ri pandas2ri.activate() ro.r('library(plm)') ro.globalenv['df'] = panel.reset_index() ro.r(''' fe <- plm(birth ~ aging + spend, data=df, model="within", index=c("pref","year")) re <- plm(birth ~ aging + spend, data=df, model="random", index=c("pref","year")) print(phtest(fe, re)) ''') |
🎯 このコードでやること: linearmodels が無い環境でも、 within 変換 (de-mean) と GLS で FE/RE を実装し Hausman を計算できる。 アルゴリズムの中身が見える。
📥 入力: 上と同じパネル df(都道府県・年度・income・unemp・aging)
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 34 | import pandas as pd, numpy as np import statsmodels.api as sm from scipy.stats import chi2 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['aging'] = df['A1303'] / df['A1101'] * 100 df['birth'] = df['A4101'] / df['A1101'] * 1000 df['spend'] = df['L3221'] / 1000 d = df[['pref', 'year', 'birth', 'aging', 'spend']].dropna() # === FE: within (de-mean by entity) === def demean(g): return g - g.mean() X_fe = d.groupby('pref')[['aging', 'spend']].transform(demean) y_fe = d.groupby('pref')['birth'].transform(demean) fe_ols = sm.OLS(y_fe, X_fe).fit() beta_fe = fe_ols.params.values V_fe = fe_ols.cov_params().values # === RE: mixedlm(分散成分を最尤推定) === import statsmodels.formula.api as smf re_model = smf.mixedlm('birth ~ aging + spend', d, groups=d['pref']).fit() beta_re = re_model.params[['aging', 'spend']].values V_re = re_model.cov_params().loc[['aging', 'spend'], ['aging', 'spend']].values # === Hausman === diff = beta_fe - beta_re V_diff = V_fe - V_re H = float(diff @ np.linalg.pinv(V_diff) @ diff) print(f'FE beta: aging={beta_fe[0]:+7.3f} spend={beta_fe[1]:+7.3f}') print(f'RE beta: aging={beta_re[0]:+7.3f} spend={beta_re[1]:+7.3f}') print(f'Hausman H = {H:.2f}, df=2') print('注意:', 'V_diff 非正定値 (H<0) → Mundlak/linearmodels で判定' if H < 0 else 'FE 採用') |
📤 実行例:
💬 mixedlm の RE 分散は linearmodels の GLS 版と異なり、 V_FE − V_RE が非正定値になって H が負値になった(落とし穴⑦の実例)。 この場合は pinv でも救えないので、 正定値性に依存しない Mundlak 版(W = 38.06, p < 0.001)や linearmodels 版(H = 162.88)で判定する。 いずれも FE を支持。
1. 「p < 0.05 で必ず FE」と機械的に判定してしまう。Hausman 検定はサンプルサイズが大きくなると、 ごく僅かな係数差でも p 値が小さくなります。 結果として実務的にはほぼ同等のモデルなのに FE 採用を強制されるケースがあります。 効果量(β̂FE − β̂RE の絶対値)と AIC / BIC も併用してください。
2. 不均一分散・系列相関を補正していない。古典的な Hausman 検定は球面性(i.i.d.)を仮定しています。 パネルでは個体内系列相関や不均一分散が常態なので、 cluster-robust 標準誤差で再計算しないと、 H 統計量自体が信用できません。 linearmodels の cov_type='clustered' を必ず使ってください。
3. 時間ダミーや交互作用を忘れる。FE は個体効果を吸収しますが、 時間効果(共通ショック)を含めないと、 説明変数が時間トレンドを取り込んだ偽の係数になります。 EntityEffects + TimeEffects の 2way FE を基本形にし、 必要に応じて交互作用も検討しましょう。
4. 内生変数を回帰式に放置している。Hausman は「FE と RE のどちらを使うか」を決める検定であって、 内生性そのものを解決しません。 説明変数自身が誤差項と相関しているなら、 IV や DID など別の識別戦略が必要で、 H が有意でなくても RE が不偏になる保証はありません。
5. 観測単位が「人」ではなく「集計値」になっている。都道府県単位の集計データ(SSDSE-B)は「個体=47県」しかなく、 自由度が極端に小さい状態で Hausman を行うと統計量が不安定です。 市区町村別 or 業種別の細分化、 あるいは時間方向 panel への拡張で N を増やしましょう。
6. 説明変数に時間不変の変数を含めている。FE モデルは時間不変変数(例:地形・気候)を吸収してしまうため、 RE と比較するとそれら係数の差が定義できません。 該当列は事前に外すか、 Hausman-Taylor 推定量で扱う必要があります。
7. VFE − VRE が非正定値になる。有限標本では分散差行列が負定値になり、 H が負値を出すことがあります。 これは検定の前提が壊れているサインで、 ブートストラップ版 Hausman(Wooldridge 版)への切り替え、 もしくは Mundlak アプローチ(FE と RE の中間)を検討すべきです。
ここまでの各章(直感/定義/Mundlak/落とし穴/IV への応用)を横断して、 Hausman 検定の要点を「一枚の地図」として再構成する。 新しい実測値として、 SSDSE-B-2026 にクラスタロバスト標準誤差を効かせた頑健版 Hausman を追加で計算し、 古典版との落差を数字で示す。
Hausman の本質は、 2 つの推定量の一致性 (consistency) を突き合わせることにある。 帰無仮説 $H_0:\mathrm{Cov}(\alpha_i,X_{it})=0$ が正しい世界では、 固定効果 $\hat\beta_{FE}$ も変量効果 $\hat\beta_{RE}$ もどちらも同じ真値 $\beta$ に収束する(=両方とも一致推定量)。 違いは効率だけで、 RE の方が分散が小さい。 ところが仮定が破れると、 FE だけが一致性を保ち、 RE は偏る。 だから「両者の係数差 $\hat\beta_{FE}-\hat\beta_{RE}$ がゼロから統計的に離れているか」を見れば、 RE の外生性仮定を間接的に検定できる。
つまり Hausman は「一致推定量 (FE) を物差しに、 効率推定量 (RE) がその物差しからズレていないか」を測る比較 (contrast) 検定。 上の 🎮 触って理解するウィジェットで ρ を上げると、 橙線 (RE) だけが緑線 (FE) から離れ、 それに連動して $H$ が臨界値 3.84 を超える —— この「片方だけがズレる」様子が直感の核。
同じ「出生率 ~ 高齢化率 + 消費支出」モデルを、 FE・RE とも cov_type='clustered', cluster_entity=True で推定し直して Hausman を再計算した実測値。
| 標準誤差の種類 | H 統計量 (df=2) | p 値 | 判定 |
|---|---|---|---|
| 古典(i.i.d. 仮定) | 162.88 | 0.0000 | FE(圧倒的有意) |
| 県クラスタロバスト | 6.96 | 0.0308 | FE(辛うじて 5% 有意) |
💬 系列相関・不均一分散を補正しただけで $H$ が 20 分の 1 以下に縮む。 結論(FE 採用)は保たれるが、 「古典版の巨大な $H$ は SE の過小評価に由来する部分が大きい」という落とし穴 4 の生きた実例。 論文では頑健版の値を報告するのが安全。
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 |
| 日本語 | 英語 |
|---|---|
| 統計的に有意 | statistically significant |
| 効果量 | effect size |
| 95%信頼区間 | 95% confidence interval (CI) |
| 標本サイズ | sample size |
| 検出力 | statistical power |
| 第1種の誤り | Type I error / false positive |
| 第2種の誤り | Type II error / false negative |
| 多重比較問題 | multiple comparisons problem |
| 過学習 | overfitting |
| 汎化性能 | generalization |
| 交差検証 | cross-validation (CV) |
Hausman検定 がデータサイエンスの体系の中でどこに位置するかを、 3つの異なる視点で可視化します。 同じ情報でも見方を変えると気付きが変わります。
🌐 統計・データサイエンス › 因果推論 › パネル分析 › Hausman検定
中心の概念から放射状に、 前提・兄弟・発展形・応用先などの関係性を矢印で結びます。 横の繋がりを見るのに最適。 ノードをドラッグ、 ホイールでズーム、 クリックで遷移。
大きな円が小さな円を包含する Circle Packing 図。 「Hausman検定」は緑色でハイライト。
長方形を入れ子に分割した Treemap 図。 各分野の規模感を面積で比較。 「Hausman検定」は緑色でハイライト。
| マップ | 分かること | こんな時に見る |
|---|---|---|
| 🔗 関係マップ | 手法間の横の関係(前提→発展→応用) | 「次に何を学べばよい?」 学習順序の判断 |
| ⭕ 包含マップ | 分類体系の入れ子構造(上位⊃下位) | 「この手法はどんなジャンルに属する?」 |
| 🌳 ツリーマップ | 分野の規模比較(面積=ボリューム) | 「データサイエンス全体の俯瞰像」 |
💡 3 つの図は同じ位置関係を別の角度から描いています。 関係マップは Hausman検定 の隣に何が並ぶかを、 包含マップとツリーマップは 統計・データサイエンス → パネル分析 → Hausman検定 という入れ子の位置を示します。 「パネル分析には他に何があったか」を思い出したいときは包含マップを、 「次に何を読むか」を決めたいときは関係マップを開いてください。
パネルデータが手元にあるとき、 Hausman の前後でどう動けばよいかを整理する。
| ステップ | アクション | 合格基準 |
|---|---|---|
| 1. パネル構造の確認 | N, T, 欠損率を集計 | N ≥ 30, T ≥ 5, 欠損率 ≤ 10% |
| 2. Pooled OLS で第一印象 | 最初に係数符号と大きさ把握 | 理論と矛盾しないか確認 |
| 3. F 検定 (Pooled vs FE) | $\alpha_i$ 全て同じか | p < 0.05 → 個体効果あり |
| 4. BP/LM 検定 (Pooled vs RE) | $\sigma_\alpha^2 = 0$ か | p < 0.05 → RE が pooled より良い |
| 5. Hausman 検定 | FE vs RE | p < 0.05 → FE 採用 |
| 6. クラスタロバスト SE | 系列相関対応 | SE が大きく変わらない |
| 7. ロバストネス分析 | サブサンプル・別変数 | 結論不変 |
この 7 ステップを論文の Methods 節に書けば、 査読でほぼ問題視されない。
「ハウスマン検定」は単独で完結する手法ではなく、 隣接領域と連携することで真価を発揮する。
上流の固定効果・変量効果モデルで両推定量を計算し、 並列の Breusch-Pagan・F 検定と一緒にモデル選択の証拠を集め、 下流の頑健標準誤差・クラスター標準誤差で推論を補強する。 ハウスマン検定は固定効果 vs 変量効果の選択基準だが、 帰無仮説棄却の解釈は標本サイズに敏感で、 経済学的妥当性と併せて判断する。
「hausman」を含む手法選択は、 データの性質・分析目的・運用制約の 3 軸で決まる。 以下に典型シナリオと対応する手法の組合せを示す。
| シナリオ | 重視する観点 | 候補手法 |
|---|---|---|
| データが大規模 (n が多い、 高次元) | 計算コスト / メモリ / 並列化が必要 | OLS vs IV (操作変数法) 等 |
| 外れ値が多い / ノイズあり | 頑健性 / 外れ値除去 / 中央値ベース | Mundlak / クラスタロバスト Hausman 等 |
論文記事から各用語のリンクをクリックすると、 該当箇所が開きます: