python - Pandas 或 Statsmodels 中的固定效果

标签 python pandas regression statsmodels

是否有现有函数可以从 Pandas 或 Statsmodels 估计固定效应(单向或双向)。

Statsmodels 中曾经有一个功能,但它似乎已停止使用。在 Pandas 中,有一个名为 plm 的东西,但我无法导入它或使用 pd.plm() 运行它。

最佳答案

如评论中所述,从 0.20.0 版开始,PanelOLS 已从 Pandas 中删除。所以你真的有三个选择:

  1. 如果您使用 Python 3,您可以使用 linearmodels,如最近的答案中所指定:https://stackoverflow.com/a/44836199/3435183

  2. 只需在您的 statsmodels 规范中指定各种虚拟对象,例如使用 pd.get_dummies .如果固定效应的数量很大,则可能不可行。

  3. 或者进行一些基于 groupby 的贬低,然后使用 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})
    

例如,假设您有一组股票数据:所有股票的股票 yield 和其他股票数据,在数月内的每个月,并且您想要回归具有日历月固定效应的滞后 yield 的 yield (其中日历month 变量称为 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

注意,dataframe 必须有一个多索引集; panelOLS 根据索引确定timeentity 效果:

>>> 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

关于python - Pandas 或 Statsmodels 中的固定效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24195432/

相关文章:

python - 在python中解析XML文件

python - 使用 re 进行分子分解

python - 计算数据帧每一行中元素的出现次数

recursion - 如何使用pykalman filter_update 进行在线回归

r - 使用 cob 包 : NA/NaN/Inf in foreign function call 通过特定点拟合约束曲线时出错

python - numpy 数组列表的形状

python - Python 中的自定义聚合函数

python - LightGBM 是否根据名称或 cat_code 值处理 Pandas 分类?

R:找不到作为参数传递的函数

python - 类型错误 : post() missing 1 required positional argument