Pandas或Statsmodels中的固定效应
有没有现成的函数可以用来估计固定效应(单向或双向)呢?可以在Pandas或者Statsmodels里找到吗?
之前在Statsmodels里有一个这样的函数,但现在好像已经不再用了。而在Pandas里,有个叫做 plm
的东西,但我无法导入它,也不能用 pd.plm()
来运行。
3 个回答
我写了一个新的软件包,叫做 PyFixest,它实现了几种高维固定效应回归的功能,灵感来自于 R 语言的 fixest 软件包的语法创新。PyFixest
支持普通最小二乘法(OLS)、工具变量法(IV)和泊松回归,能够处理你想要的任意数量的固定效应,并提供多种推断方法(包括独立同分布、HC1-3、CRV1 和 CRV3 推断,以及野生聚类自助法)。
下面是一个简单的代码示例:
from pyfixest.estimation import feols
from pyfixest.utils import get_data
data = get_data()
# fit a model via OLS
fit = feols("Y ~ X1 | f1 + f2", data=data)
fit.summary()
# Estimation: OLS
# Dep. var.: Y, Fixed effects: f1+f2
# Inference: CRV1
# Observations: 997
#
# | Coefficient | Estimate | Std. Error | t value | Pr(>|t|) | 2.5 % # | 97.5 % |
# |:--------------|-----------:|-------------:|----------:|-----------:|--------:|---------:|
# | X1 | 0.292 | 0.040 | 7.256 | 0.000 | 0.210 | 0.374 |
# ---
# RMSE: 1.199 R2: 0.554 R2 Within: 0.037
有一个叫做 linearmodels
的软件包(https://pypi.org/project/linearmodels/),它提供了比较完整的固定效应和随机效应的实现,还包括了聚类标准误差的功能。这个软件包不使用高维的普通最小二乘法(OLS)来消除效应,因此可以处理大数据集。
# Outer is entity, inner is time
entity = list(map(chr,range(65,91)))
time = list(pd.date_range('1-1-2014',freq='A', periods=4))
index = pd.MultiIndex.from_product([entity, time])
df = pd.DataFrame(np.random.randn(26*4, 2),index=index, columns=['y','x'])
from linearmodels.panel import PanelOLS
mod = PanelOLS(df.y, df.x, entity_effects=True)
res = mod.fit(cov_type='clustered', cluster_entity=True)
print(res)
这会产生以下输出:
PanelOLS Estimation Summary
================================================================================
Dep. Variable: y R-squared: 0.0029
Estimator: PanelOLS R-squared (Between): -0.0109
No. Observations: 104 R-squared (Within): 0.0029
Date: Thu, Jun 29 2017 R-squared (Overall): -0.0007
Time: 23:52:28 Log-likelihood -125.69
Cov. Estimator: Clustered
F-statistic: 0.2256
Entities: 26 P-value 0.6362
Avg Obs: 4.0000 Distribution: F(1,77)
Min Obs: 4.0000
Max Obs: 4.0000 F-statistic (robust): 0.1784
P-value 0.6739
Time periods: 4 Distribution: F(1,77)
Avg Obs: 26.000
Min Obs: 26.000
Max Obs: 26.000
Parameter Estimates
==============================================================================
Parameter Std. Err. T-stat P-value Lower CI Upper CI
------------------------------------------------------------------------------
x 0.0573 0.1356 0.4224 0.6739 -0.2127 0.3273
==============================================================================
F-test for Poolability: 1.0903
P-value: 0.3739
Distribution: F(25,77)
Included effects: Entity
它还有一个公式接口,使用起来和 statsmodels 类似。
mod = PanelOLS.from_formula('y ~ x + EntityEffects', df)
正如评论中提到的,从 Pandas 版本 0.20.0 开始,PanelOLS 已经被移除了。所以你现在有三个选择:
如果你使用的是 Python 3,可以使用
linearmodels
,具体可以参考这个比较新的回答:https://stackoverflow.com/a/44836199/3435183在你的
statsmodels
设置中指定各种虚拟变量,比如使用pd.get_dummies
。如果固定效应的数量很大,这种方法可能不太可行。或者进行一些基于分组的去均值处理,然后使用
statsmodels
(如果你要估计很多固定效应,这种方法是可行的)。以下是你可以为单向固定效应做的一个简单版本:import statsmodels.api as sm import statsmodels.formula.api as smf import patsy def areg(formula,data=None,absorb=None,cluster=None): y,X = patsy.dmatrices(formula,data,return_type='dataframe') ybar = y.mean() y = y - y.groupby(data[absorb]).transform('mean') + ybar Xbar = X.mean() X = X - X.groupby(data[absorb]).transform('mean') + Xbar reg = sm.OLS(y,X) # Account for df loss from FE transform reg.df_resid -= (data[absorb].nunique() - 1) return reg.fit(cov_type='cluster',cov_kwds={'groups':data[cluster].values})
举个例子,假设你有一组股票数据:每个月所有股票的收益和其他数据,想要用滞后收益来回归收益,并且考虑日历月份的固定效应(这个日历月份的变量叫 caldt
),同时你还想按日历月份对标准误进行聚类。你可以用以下方法来估计这样的固定效应模型:
reg0 = areg('ret~retlag',data=df,absorb='caldt',cluster='caldt')
如果你使用的是旧版本的 Pandas
,可以这样做:
这是一个使用 pandas 的 PanelOLS
(在 plm 模块中)的时间固定效应的例子。注意,PanelOLS
的导入:
>>> from pandas.stats.plm import PanelOLS
>>> df
y x
date id
2012-01-01 1 0.1 0.2
2 0.3 0.5
3 0.4 0.8
4 0.0 0.2
2012-02-01 1 0.2 0.7
2 0.4 0.5
3 0.2 0.3
4 0.1 0.1
2012-03-01 1 0.6 0.9
2 0.7 0.5
3 0.9 0.6
4 0.4 0.5
注意,数据框必须设置多重索引;panelOLS
根据索引来确定 time
和 entity
的效应:
>>> reg = PanelOLS(y=df['y'],x=df[['x']],time_effects=True)
>>> reg
-------------------------Summary of Regression Analysis-------------------------
Formula: Y ~ <x>
Number of Observations: 12
Number of Degrees of Freedom: 4
R-squared: 0.2729
Adj R-squared: 0.0002
Rmse: 0.1588
F-stat (1, 8): 1.0007, p-value: 0.3464
Degrees of Freedom: model 3, resid 8
-----------------------Summary of Estimated Coefficients------------------------
Variable Coef Std Err t-stat p-value CI 2.5% CI 97.5%
--------------------------------------------------------------------------------
x 0.3694 0.2132 1.73 0.1214 -0.0485 0.7872
---------------------------------End of Summary---------------------------------
文档字符串:
PanelOLS(self, y, x, weights = None, intercept = True, nw_lags = None,
entity_effects = False, time_effects = False, x_effects = None,
cluster = None, dropped_dummies = None, verbose = False,
nw_overlap = False)
Implements panel OLS.
See ols function docs
这是另一个函数(像 fama_macbeth
),我相信计划是将这个功能移到 statsmodels
中。