实证方法教程 / hausman

Hausman 检验

FE 还是 RE,不只是看 p 值

这节课解决什么适合企业、地区、个人等重复观测数据,重点控制个体不随时间变化的遗漏因素。
先准备哪些变量因变量 / 核心解释变量 / 个体 ID / 时间变量
会看到哪张表hausman_test.csv
论文里怎么克制解释必须说明是否控制个体/时间固定效应,以及标准误按什么层级聚类。

Hausman 检验是什么?

Hausman 检验回答的是随机效应的关键假设是否可信:个体不变特征是否与解释变量不相关。Hausman 检验不是谁显著用谁,而是检验 RE 这把尺子能不能用。

先用一句话理解

把 FE 想成只看同一个对象自己的前后变化,把 RE 想成同时利用对象内部变化和对象之间差异。如果对象之间那些不变差异和解释变量有关,RE 就会把不该混的东西混进去。

什么时候用

判断项教科书式判断
适合用在面板数据中需要在固定效应和随机效应之间说明模型选择。
先不要用在FE 和 RE 使用的变量、样本或模型口径不一致时。
最关键的前提比较对象必须是同一套系数,且经典 Hausman 的协方差条件要成立。
读表顺序先确认 FE/RE 样本一致,再看 Hausman p 值和协方差诊断。
论文表述边界主表若使用 cluster SE,应补充 Mundlak/CRE 或稳健替代口径。

把它和相近方法分清楚

容易混淆的对象怎么区分初学者记法
固定效应 FE允许个体效应和解释变量相关。更保守,依赖组内变化。
随机效应 RE要求个体效应和解释变量不相关。效率更高,但假设更强。
Hausman比较 FE 和 RE 系数是否系统不同。检验 RE 一致性,不是比星号。

核心直觉和模型公式

FE 和 RE 系数差异

经典 Hausman 统计量可以写成:

\[H=(\hat{\beta}_{FE}-\hat{\beta}_{RE})'[Var(\hat{\beta}_{FE})-Var(\hat{\beta}_{RE})]^{-1}(\hat{\beta}_{FE}-\hat{\beta}_{RE})\]

如果 FE 和 RE 系数差异系统存在,通常说明 RE 的外生性假设不可靠。

公式里的符号怎么读

符号含义在本页怎么理解
β_FE固定效应估计系数允许个体效应与解释变量相关。
β_RE随机效应估计系数要求个体效应与解释变量不相关。
Var(β_FE)-Var(β_RE)协方差差矩阵经典检验要求它适合构造统计量。
HHausman 统计量衡量 FE 与 RE 系数差异是否系统存在。
p 值拒绝 RE 假设的证据p 小通常支持采用 FE。

专业使用口径

专业 Hausman 写法要说明检验对象和替代证据,不要只报一个 p 值。

口径专业写法
样本一致FE 和 RE 必须使用同一批观测和同一套变量。
主表标准误cluster 主表下 classic Hausman 只能作为传统口径参考。
Mundlak/CRE可用组内均值项联合检验作为稳健替代。
结论措辞写 RE 假设是否被拒绝,而不是写哪个模型更显著。

一步一步做:从问题到结果的五步

步骤这一页具体做什么做到什么程度才算读懂
1. 估计 FE用组内变化估计主关系。时不变变量会被吸收。
2. 估计 RE在同一样本和变量下估计随机效应。样本不一致则不能比较。
3. 做 Hausman比较两组系数差异。检验对象是 RE 一致性。
4. 检查协方差问题看矩阵是否正定、是否与 cluster 主表冲突。异常时不能硬解释 classic 结果。
5. 补替代检验必要时报告 Mundlak/CRE。让模型选择证据和主表标准误一致。

结果怎么读:先读口径,再读数字

本页案例读表时,先记住这个口径:本案例 Hausman 统计量 Chi2(13) = 13.3383,p = 0.4220。

读表顺序本页怎么读不要这样读
先看 FE/RE 口径样本、变量和固定效应是否可比。不可比时 Hausman 无意义。
再看 p 值p 小说明 RE 假设不被支持。不是 FE 星号更多。
然后看矩阵诊断协方差差矩阵异常时要谨慎。不要把报错当不显著。
最后看替代证据Mundlak/CRE 是否支持同一选择。单一 classic 检验不够稳。

初学者最容易错在哪里

误读为什么错
谁显著用谁错。Hausman 不比较星号数量。
FE/RE 样本不同还检验错。比较对象已经变了。
cluster 主表只报 classic Hausman不够。需要说明稳健标准误下的替代证据。
p 大就证明 RE 正确错。只能说没有拒绝 RE 假设。

先看这个案例的结论

  • 本案例 Hausman 统计量 Chi2(13) = 13.3383,p = 0.4220。
  • 结论行写的是:不拒绝原假设,使用随机效应模型 (RE)。这表示本次结果没有拒绝随机效应设定,而不是证明 RE 在理论上一定正确。
  • 如果主表使用 cluster 标准误,仍然要在正文里说明 classic Hausman 与稳健/CRE 检验的关系。

变量要求和案例口径

字段口径
数据CSMAR 风格 A 股企业创新面板
原始样本196 家上市公司,2015-2020 年,约 1200 个公司-年观测;各方法有效样本以本页输出表 N 为准
因变量patent_count;回归页通常使用 ln(1 + patent_count)
核心解释变量dfi_index,数字普惠金融指数;部分案例输出展示的是标准化后的 dfi_index
控制变量roa、lev、size、growth、cashflow、tobinq、top1、dual、board、indep、soe、age
输出文件hausman_test.csv
角色要求因变量、核心解释变量、个体 ID、时间变量
依赖包无额外 Stata 社区包要求

实际代码

下面是本页案例里的最小 Stata 代码。它的作用是帮助你看清变量怎么进入模型、结果文件怎么生成,而不是要求你在网页里手动运行。

log using "/root/workspace/empirical-wizard/workspace/4396bde4/analysis.log", replace text
global JOB_DIR "/root/workspace/empirical-wizard/workspace/4396bde4"
set more off
adopath + "/root/ado/plus"
global DATA_PATH "/root/workspace/empirical-wizard/workspace/test_e2e/csmar_innovation.csv"
import delimited "/root/workspace/empirical-wizard/workspace/test_e2e/csmar_innovation.csv", clear case(preserve)
capture confirm global JOB_DIR
if _rc global JOB_DIR "."
quietly duplicates drop
capture confirm numeric variable stkcd
if _rc {
    tempvar __hid
    encode stkcd, gen(`__hid')
    local idnum "`__hid'"
}
else {
    local idnum "stkcd"
}
tempname fh
capture file close `fh'
file open `fh' using "$JOB_DIR/hausman_test.csv", write replace
file write `fh' "统计量,值" _n
xtset `idnum' year
capture noisily xtreg patent_count dfi_index roa lev size growth cashflow tobinq top1 dual board indep soe age, fe
if _rc {
    file write `fh' "状态,skipped" _n
    file write `fh' "原因,固定效应模型不可估;可能是完整样本不足、核心解释变量无组内变化或变量共线" _n
    file close `fh'
    di as error "Hausman skipped: FE not estimable"
    exit 0
}
capture scalar __hausman_se = abs(_se[dfi_index])
if _rc {
    file write `fh' "状态,skipped" _n
    file write `fh' "原因,固定效应中核心解释变量被吸收或标准误不可取,Hausman 不具备解释性" _n
    file close `fh'
    di as error "Hausman skipped: core coefficient not available in FE"
    exit 0
}
if scalar(__hausman_se) <= 1e-12 {
    file write `fh' "状态,skipped" _n
    file write `fh' "原因,固定效应中核心解释变量被吸收或标准误为0,Hausman 不具备解释性" _n
    file close `fh'
    di as error "Hausman skipped: core coefficient not estimable in FE"
    exit 0
}
estimates store __fe
capture noisily xtreg patent_count dfi_index roa lev size growth cashflow tobinq top1 dual board indep soe age, re
if _rc {
    file write `fh' "状态,skipped" _n
    file write `fh' "原因,随机效应模型不可估;可能是完整样本不足或解释变量无有效变化" _n
    file close `fh'
    di as error "Hausman skipped: RE not estimable"
    exit 0
}
estimates store __re
capture noisily hausman __fe __re, sigmamore
if _rc {
    file write `fh' "状态,skipped" _n
    file write `fh' "原因,Hausman 统计量不可计算;FE/RE 方差差矩阵不满足要求" _n
    file close `fh'
    di as error "Hausman skipped: statistic unavailable"
    exit 0
}
scalar __chi2 = r(chi2)
scalar __df = r(df)
scalar __p = r(p)
local chi2_s : display %9.4f __chi2
local df_s : display %9.0f __df
local p_s : display %9.4f __p
* Guard against missing/negative chi2 — sigmamore should keep
* it non-negative, but FE-RE variance diffs occasionally produce
* missing values (e.g. when the FE absorbs the core regressor).
* Without the guard, missing __p would silently fall through the
* `cond(__p < 0.05, ...)` branch as "不拒绝原假设" — falsely
* recommending Random Effects.
local conclude ""
if missing(__chi2) | missing(__p) | __chi2 < 0 {
    local conclude = "无法计算(chi² 缺失或负值,FE/RE 方差差矩阵退化);建议直接采用 FE 设定"
}
else if __p < 0.05 {
    local conclude = "拒绝原假设,使用固定效应模型 (FE)"
}
else {
    local conclude = "不拒绝原假设,使用随机效应模型 (RE)"
}
file write `fh' "Chi2,`chi2_s'" _n
file write `fh' "df,`df_s'" _n
file write `fh' "p-value,`p_s'" _n
file write `fh' "结论,`conclude'" _n
file close `fh'
di "Hausman: chi2=`chi2_s' df=`df_s' p=`p_s'"
di "结论: `conclude'"
log close

实际输出表

这张表是本方法页配套案例的输出结果,用来把前面的公式、变量口径和代码对应到实际数字。

统计量
Chi2 13.3383
df 13
p-value 0.4220
结论不拒绝原假设,使用随机效应模型 (RE)

案例图

这是一张由同一份案例数据生成的页面内诊断图。

Hausman 检验 的共用案例输出图。
Hausman 检验 的共用案例输出图。

论文里怎么写

本文在共用企业面板样本上报告Hausman 检验,核心输出见 hausman_test.csv。结果解释时同时关注样本口径、变量构造、系数方向、标准误和适用前提,避免只凭单个 p 值完成方法选择。

检查清单

  • FE 和 RE 必须使用同一组变量和同一批样本,否则 Hausman 比较没有意义。
  • p 值小通常倾向 FE;p 值大只能说未拒绝 RE 假设,不能证明 RE 正确。
  • 如果主表使用聚类标准误,要说明 classic Hausman 与主表推断口径的差别。

返回教程库 · 查看共用案例