Stata asreg与Python linearmodels.FamaMacbeth回归结果差异求助
Stata asreg Fama-Macbeth vs Python linearmodels 结果差异原因及修正方案
核心差异原因
- Newey-West参数设置不匹配:
Stata的asreg fmb newey(3)使用指定的3阶滞后,且默认不做预白化;而linearmodels的FamaMacBeth默认自动选择滞后阶数,且可能默认开启预白化,直接导致标准误计算差异。 - 缺失值处理逻辑不同:
Stata的asreg在每组时间维度回归时,仅删除该组内的缺失值(组内listwise删除);linearmodels默认全局删除所有含缺失值的观测,导致分组回归的样本池不一致。 - 时间分组维度偏差:
Stata通过xtset指定了明确的面板时间维度(如年度),若Python导入数据后时间变量类型错误(如字符串而非整数/日期),或分组时用了错误的时间粒度,会让每组回归的样本与Stata不符。 - 截距项设置差异:
若Stata回归包含截距但Python代码意外省略(如公式加了-1),会直接导致系数结果出现显著偏差。
匹配Stata结果的Python代码调整步骤
1. 对齐时间分组维度
确保Python中的时间变量与Stataxtset的时间维度完全一致,比如Stata用year作为时间变量,Python中需将其转为整数类型:
import pandas as pd from linearmodels import FamaMacBeth # 导入数据并标准化时间变量 data = pd.read_stata('loan_data.dta') data['year'] = data['year'].astype(int) # 与Stata的时间变量类型保持一致
2. 显式配置Newey-West参数
关闭预白化,指定3阶滞后,完全匹配Stata的newey(3)行为:
# 定义回归公式(确保与Stata完全一致,默认包含截距) formula = 'loan_return ~ risk_factor1 + risk_factor2 + risk_factor3' # 初始化模型,设置组内缺失值删除规则 model = FamaMacBeth.from_formula(formula, data=data, dropna='time') # 拟合模型,指定Newey-West核函数、3阶滞后、关闭预白化 results = model.fit( cov_type='kernel', kernel='newey-west', lags=3, prewhiten=False ) print(results)
3. 验证第一步分组回归系数
手动按时间分组做OLS回归,对比Stata的组内回归系数,确认样本和变量无差异:
# 手动分组回归,提取每组系数 group_coefs = data.groupby('year').apply( lambda x: pd.DataFrame(pd.OLS.from_formula(formula, x).fit().params).T ) # 打印前几组系数,与Stata的`bysort year: reg ...`结果对比 print(group_coefs.head())
4. 校验变量一致性
确认Python中所有变量的均值、标准差与Stata中summarize的结果一致,排除数据导入时的类型转换或缩放错误。
关键验证逻辑
- 若第一步分组回归的系数与Stata一致,说明问题出在第二步的Newey-West标准误计算,重点检查
lags和prewhiten参数。 - 若第一步系数就不一致,优先排查时间分组、缺失值处理和变量定义。
内容的提问来源于stack exchange,提问作者Kailash Seshadri
相关产品推荐
相关产品推荐

