You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:09:22