如何使用StatsModels在Python回归分析中执行内生性Hausman检验
基于Python StatsModels生态实现内生性Hausman检验的操作指南
Hausman检验的核心逻辑是对比两类估计量的系数差异:无内生性假设下一致且有效的OLS估计量,和无论是否存在内生性都一致但低效的2SLS/IV估计量。如果两类估计结果存在系统性显著差异,就证明变量存在内生性。
落地操作步骤
- 第一步:安装依赖库
直接执行pip命令安装所需依赖:pip install statsmodels linearmodels scipy pandas numpy - 第二步:导入所需模块
import pandas as pd import numpy as np from scipy import stats from linearmodels import IV2SLS from statsmodels.api import OLS, add_constant - 第三步:梳理变量并准备数据集
提前明确四类变量,替换为自己的实际业务数据即可:
示例数据构造代码:变量类型 说明 Y 被解释变量 X 怀疑存在内生性的核心解释变量 C 外生控制变量 Z 核心解释变量的工具变量(需满足相关性、外生性前提) np.random.seed(42) n = 1000 Z = np.random.normal(0,1,n) # 工具变量 C = np.random.normal(0,1,n) # 外生控制变量 e = np.random.normal(0,1,n) # 模型误差项 X = 0.8*Z + 0.3*e + np.random.normal(0,1,n) # 构造和误差项相关的内生X Y = 0.5*X + 0.2*C + e # 被解释变量 df = pd.DataFrame({'Y':Y, 'X':X, 'C':C, 'Z':Z}) df = add_constant(df, has_constant='add') # 加入回归所需常数项 - 第四步:分别拟合两类回归模型
# 拟合OLS模型:假设X不存在内生性 ols_model = OLS(df['Y'], df[['const', 'X', 'C']]).fit(cov_type='HC1') # 拟合2SLS模型:用Z作为X的工具变量,处理内生性 iv_model = IV2SLS( dependent=df['Y'], exog=df[['const', 'C']], endog=df['X'], instruments=df['Z'] ).fit(cov_type='robust') - 第五步:执行Hausman检验
可以选择直接调用封装好的方法,也可以手动计算理解原理:封装方法直接输出结果
from linearmodels.iv.results import compare res = compare({'OLS': ols_model, '2SLS': iv_model}, 'hausman') print("Hausman检验结果:\n", res.hausman)手动计算统计量和p值
# 提取核心变量的系数和协方差矩阵 beta_ols = ols_model.params[['X']] beta_iv = iv_model.params[['X']] cov_ols = ols_model.cov_params().loc[['X'], ['X']] cov_iv = iv_model.cov_params().loc[['X'], ['X']] # 计算检验统计量,服从自由度为内生变量个数的卡方分布 diff = beta_iv - beta_ols hausman_stat = diff.T @ np.linalg.inv(cov_iv - cov_ols) @ diff p_value = 1 - stats.chi2.cdf(hausman_stat, df=len(diff)) print(f"Hausman统计量:{hausman_stat:.4f},p值:{p_value:.4f}") - 第六步:结果判定
- p值 < 0.05(常用显著性水平):拒绝「不存在内生性」的原假设,证明核心变量存在内生性,需使用2SLS/IV等方法估计
- p值 ≥ 0.05:无法拒绝原假设,无证据证明存在显著内生性,可直接使用OLS估计结果
关键注意要点
- 工具变量有效性是检验成立的前提:如果工具变量是弱工具(和内生变量相关性极低)或者不满足外生性(和误差项相关),Hausman检验结果完全不可信,检验前必须先完成工具变量的F检验、过度识别检验(多工具变量场景)
- 检验结果只能证明是否存在内生性,不能反过来证明工具变量有效,工具变量的合理性需要结合业务逻辑支撑
- 异方差场景下需要使用稳健协方差矩阵计算统计量,传统Hausman检验结果不成立,上面代码中指定
cov_type='HC1'和cov_type='robust'就是为了适配异方差场景 - 检验效力和样本量强相关,小样本下很容易出现无法拒绝原假设的第二类错误,需要结合理论逻辑判断是否存在内生性,不能完全依赖检验结果
- 如果只关注核心解释变量的内生性,可以只提取核心变量的系数做检验,不需要纳入控制变量,自由度更低、检验效力更高
内容的提问来源于stack exchange,提问作者raghav nautiyal
相关产品推荐
相关产品推荐

