修复了Pandas或Statsmodels中的效果

时间:2014-06-12 23:23:38

标签: python pandas regression statsmodels

是否存在估算Pandas或Statsmodel的固定效果(单向或双向)的现有函数。

以前在Statsmodels中有一个函数,但似乎已经停止了。在Pandas中,有一些名为plm的内容,但我无法导入或使用pd.plm()运行它。

2 个答案:

答案 0 :(得分:13)

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

  1. 如果您使用的是Python 3,则可以使用最新答案中指定的linearmodelshttps://stackoverflow.com/a/44836199/3435183

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

  3. 或者做一些基于群体的贬低,然后使用statsmodels(如果您正在估算大量固定效果,这将有效)。这是你可以为单向固定效果做的准分版:

    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})
    
  4. 如果使用较旧版本的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根据索引确定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

答案 1 :(得分:11)

有一个名为linearmodelshttps://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)