首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python statsmodel健壮的cov_type='hac-panel‘问题

Python statsmodel健壮的cov_type='hac-panel‘问题
EN

Stack Overflow用户
提问于 2020-04-28 02:07:10
回答 1查看 514关注 0票数 2

我希望这是我提出问题的正确地方。

我想知道在运行sm.OLS的时候如何使用“hac面板”cov_type,我已经纠结了一整天,但还是搞不明白。下面是我的代码示例(包含数据):

代码语言:javascript
运行
复制
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
from pandas.tseries.offsets import *

# Just grabbing some random data here
dat = sm.datasets.macrodata.load_pandas().data
dat['time'] = dat['year'].apply(lambda x: pd.to_datetime(x, format='%Y'))
dat['time'] = dat.apply(lambda x:(x['time'] + BQuarterBegin(x['quarter'])), axis=1)
dat = dat.set_index('time')
dat = dat.sort_index()
dat['dGDP'] = (dat['realgdp'] - dat['realgdp'].shift(1))/dat['realgdp'].shift(1) * 100.0
dat['dM1'] = (dat['m1'] - dat['m1'].shift(1))/dat['m1'].shift(1) * 100.0
dat['dUEMP'] = dat['unemp'] - dat['unemp'].shift(1)
dat['dCPI'] = dat['infl'] - dat['infl'].shift(1)
dat = dat[['dGDP', 'dM1', 'dUEMP', 'dCPI']]

# Fitting the model
y_var = dat.unstack()
x_var = pd.DataFrame(dat.shift(1).unstack(), columns=['01m']).combine_first(pd.DataFrame(dat.shift(3).unstack(), columns=['03m'])).combine_first(pd.DataFrame(dat.shift(12).unstack(), columns=['12m']))

model = sm.OLS(y_var, sm.add_constant(x_var), missing='drop')

这是有效的-据我所知,这是它强制执行HAC覆盖的文档。但是,我不确定我是否正确地调用了它

代码语言:javascript
运行
复制
res = model.fit(cov_type='hac-panel', cov_kwds={'time': dat.index, 'maxlags': 11})
res.summary()

这就是我的问题所在。假设我也想按时间进行聚类,我认为应该是这样的:

代码语言:javascript
运行
复制
model.fit(cov_type='hac-panel', cov_kwds={'time': dat.index, 'groups': dat.index, 'maxlags': 11})

所有的帮助都非常感谢。非常提前感谢您。即使给我举个例子也是很棒的--找不到任何东西。

我得到了这个错误:

代码语言:javascript
运行
复制
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-2-74b3e662267b> in <module>
----> 1 model.fit(cov_type='hac-panel', cov_kwds={'time': dat.index, 'groups': dat.index, 'maxlags': 11})

~\anaconda3\lib\site-packages\statsmodels\regression\linear_model.py in fit(self, method, cov_type, cov_kwds, use_t, **kwargs)
    343                 self, beta,
    344                 normalized_cov_params=self.normalized_cov_params,
--> 345                 cov_type=cov_type, cov_kwds=cov_kwds, use_t=use_t)
    346         else:
    347             lfit = RegressionResults(

~\anaconda3\lib\site-packages\statsmodels\regression\linear_model.py in __init__(self, model, params, normalized_cov_params, scale, cov_type, cov_kwds, use_t, **kwargs)
   1555                 # TODO: warn or not?
   1556             self.get_robustcov_results(cov_type=cov_type, use_self=True,
-> 1557                                        use_t=use_t, **cov_kwds)
   1558         for key in kwargs:
   1559             setattr(self, key, kwargs[key])

~\anaconda3\lib\site-packages\statsmodels\regression\linear_model.py in get_robustcov_results(self, cov_type, use_t, **kwargs)
   2490             res.cov_params_default = sw.cov_nw_panel(self, maxlags, groupidx,
   2491                                                      weights_func=weights_func,
-> 2492                                                      use_correction=use_correction)
   2493             res.cov_kwds['description'] = descriptions['HAC-Panel']
   2494 

~\anaconda3\lib\site-packages\statsmodels\stats\sandwich_covariance.py in cov_nw_panel(results, nlags, groupidx, weights_func, use_correction)
    785     xu, hessian_inv = _get_sandwich_arrays(results)
    786 
--> 787     S_hac = S_nw_panel(xu, weights, groupidx)
    788     cov_hac = _HCCM2(hessian_inv, S_hac)
    789     if use_correction:

~\anaconda3\lib\site-packages\statsmodels\stats\sandwich_covariance.py in S_nw_panel(xw, weights, groupidx)
    723     S = weights[0] * np.dot(xw.T, xw)  #weights just for completeness
    724     for lag in range(1, nlags+1):
--> 725         xw0, xwlag = lagged_groups(xw, lag, groupidx)
    726         s = np.dot(xw0.T, xwlag)
    727         S += weights[lag] * (s + s.T)

~\anaconda3\lib\site-packages\statsmodels\stats\sandwich_covariance.py in lagged_groups(x, lag, groupidx)
    706 
    707     if out0 == []:
--> 708         raise ValueError('all groups are empty taking lags')
    709     #return out0, out_lagged
    710     return np.vstack(out0), np.vstack(out_lagged)

ValueError: all groups are empty taking lags
EN

回答 1

Stack Overflow用户

发布于 2020-08-26 21:12:42

我正在找一个例子,你的帮助很大。

你的代码唯一的问题似乎是在

代码语言:javascript
运行
复制
cov_kwds={'time': dat.index, 'groups': dat.index, 'maxlags': 11} 

基本上,它将来自dat.index的每个唯一单元作为一个单独的组进行计算,在您的情况下,每个季度。同时,它使用该年作为时间指示器,因此您的小组存在于同一季度的所有观察中,时间长度为一个季度。由于您的时间变量只是每个组的一个周期,因此没有涉及到滞后,因此出现了错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61465483

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档