Python实现含固定效应的线性回归(适配Stata代码)
如何在Python中实现带双向固定效应的线性回归
嘿,我来帮你搞定这个线性回归加固定效应的问题!你现在用的是statsmodels的ols函数,但它默认不会处理固定效应,不过有两种常用的方法可以实现你的需求,我分别给你讲清楚:
方法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




