You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python实现含固定效应的线性回归(适配Stata代码)

如何在Python中实现带双向固定效应的线性回归

嘿,我来帮你搞定这个线性回归加固定效应的问题!你现在用的是statsmodelsols函数,但它默认不会处理固定效应,不过有两种常用的方法可以实现你的需求,我分别给你讲清楚:

方法1:直接在statsmodels的OLS中加入虚拟变量

如果你的两个固定效应变量(研究领域、大学)的类别数量不多,可以直接把它们当作分类变量,用C()函数生成虚拟变量纳入模型。首先注意变量名里的空格和特殊字符,最好先重命名一下避免公式报错:

# 先重命名变量(去掉空格和特殊字符,避免公式解析错误)
da = da.rename(columns={
    'Domaine d’étude E.F.': 'domaine_etude',
    'Université E.F.': 'universite'
})

# 加入固定效应的OLS模型
import statsmodels.formula.api as smf
results = smf.ols('''
    discriminant ~ diff_eval_formfr + presse + trav_sup + recrut_seul + proced_auditions + 
                   taux_insertion_30mois + taux_stable_30 + taux_plei_30 + sal_med +
                   C(domaine_etude) + C(universite)
''', data=da).fit()

# 输出模型结果
print(results.summary())

小提醒C()会自动把分类变量转为虚拟变量,并且省略一个基准类别来避免多重共线性。但如果你的大学数量有几百甚至上千个,这种方法会生成大量虚拟变量,计算速度慢还可能占用过多内存,这时候更推荐下面的方法。

方法2:用linearmodels库专门处理固定效应

linearmodels是专门为面板数据和固定效应模型设计的库,处理多固定效应的效率极高,还支持聚类标准误(这在固定效应模型中非常重要,能修正异方差和组内相关的问题)。

首先安装库:

pip install linearmodels

然后用feols函数实现双向固定效应,语法非常简洁:

from linearmodels import feols

# 先重命名变量(可选,但能让公式更整洁)
da = da.rename(columns={
    'Domaine d’étude E.F.': 'domaine_etude',
    'Université E.F.': 'universite'
})

# 构建模型,| 后面的就是固定效应变量
model = feols('''
    discriminant ~ diff_eval_formfr + presse + trav_sup + recrut_seul + proced_auditions + 
                   taux_insertion_30mois + taux_stable_30 + taux_plei_30 + sal_med |
                   domaine_etude + universite
''', data=da)

# 加入聚类标准误(比如按大学聚类,修正组内相关)
results = model.fit(cov_type='clustered', cluster_entity='universite')

# 输出模型结果
print(results.summary())

为什么推荐这个方法?:它用去均值法处理固定效应,不需要生成大量虚拟变量,计算速度快,结果更可靠,而且天然支持双向固定效应的设置,非常适合大样本场景。

额外小贴士

  • 固定效应变量最好是字符串或分类类型(categorical),如果你的变量是数值型,记得先转换:da['domaine_etude'] = da['domaine_etude'].astype('category')
  • 如果你的数据是面板数据(同一个个体在不同时间的观测),还可以用PanelOLS函数同时设置个体和时间固定效应,但你的问题看起来是截面数据,feols完全够用。

内容的提问来源于stack exchange,提问作者DuneC

火山引擎 最新活动