如何解决使用 HAC-Panel 聚类标准错误时,Statsmodel 三明治“所有组都为空,采取滞后”错误
我有这样的数据:
帐号 | DV | 月 | 年 | 年月 | 前/后 | 组 |
---|---|---|---|---|---|---|
1 | 121 | oct | 2019 | 2019 年 10 月 | 预 | 控制 |
1 | 124 | 11 月 | 2019 | 2019 年 11 月 | post | 控制 |
2 | 120 | oct | 2019 | 2019 年 10 月 | 预 | 处理 |
2 | 118 | nov | 2019 | 2019 年 11 月 | post | 处理 |
我运行了差异中的差异回归:
results2 = smf.ols("DV ~ C(group,Treatment('control')) * C(pre_period,Treatment(True)) + month + C(year)",df99).fit(cov_type='HAC-Panel',cov_kwds={'groups':df99['account'],'time':df99['yearmonth'],'maxlags':35})
print(results2.summary())
我收到以下错误消息。 我用一个或多或少相同(不同的实验)的不同数据集做同样的事情,但没有遇到问题。我的数据清理过程基本相同。此外,就在几天前,这工作正常。但它现在突然抛出了这个错误(我确实撤销了我所做的任何更改)。
我完全无法理解这个错误。即使在“sandwich_covariance.py”中搜索此错误消息也没有发现任何内容。
此人遇到了类似的问题,但没有提出解决方案:Python statsmodels robust cov_type='hac-panel' issue
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-43-0dcbaef1325b> in <module>
----> 1 results2 = smf.ols("dv ~ C(group,2 df99).fit(cov_type='HAC-Panel','maxlags':35})
3 print(results2.summary())
~/opt/anaconda3/envs/pyr/lib/python3.8/site-packages/statsmodels/regression/linear_model.py in fit(self,method,cov_type,cov_kwds,use_t,**kwargs)
340
341 if isinstance(self,OLS):
--> 342 lfit = OLSResults(
343 self,beta,344 normalized_cov_params=self.normalized_cov_params,~/opt/anaconda3/envs/pyr/lib/python3.8/site-packages/statsmodels/regression/linear_model.py in __init__(self,model,params,normalized_cov_params,scale,**kwargs)
1584 use_t = use_t_2
1585 # Todo: warn or not?
-> 1586 self.get_robustcov_results(cov_type=cov_type,use_self=True,1587 use_t=use_t,**cov_kwds)
1588 for key in kwargs:
~/opt/anaconda3/envs/pyr/lib/python3.8/site-packages/statsmodels/regression/linear_model.py in get_robustcov_results(self,**kwargs)
2530 groupidx = lzip([0] + tt,tt + [nobs_])
2531 self.n_groups = n_groups = len(groupidx)
-> 2532 res.cov_params_default = sw.cov_nw_panel(self,maxlags,groupidx,2533 weights_func=weights_func,2534 use_correction=use_correction)
~/opt/anaconda3/envs/pyr/lib/python3.8/site-packages/statsmodels/stats/sandwich_covariance.py in cov_nw_panel(results,nlags,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:
~/opt/anaconda3/envs/pyr/lib/python3.8/site-packages/statsmodels/stats/sandwich_covariance.py in S_nw_panel(xw,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)
~/opt/anaconda3/envs/pyr/lib/python3.8/site-packages/statsmodels/stats/sandwich_covariance.py in lagged_groups(x,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
解决方法
正如我们的 statsmodel 救星 Josef 指出的那样。问题只是数据没有按照我在示例中显示的方式进行排序。
数据应按您正在聚类的组(在我的情况下为 account
)排序,然后按时间排序。这是根据文档:
面板数据中的‘hac-panel’异方差性和自相关稳健标准误差。在这种情况下需要对数据进行排序,需要对每个面板单元或集群的时间序列进行堆叠。个人或组的时间序列的成员资格可以通过组指标或增加的时间段来指定。
如果由于某种原因您无法以这种方式对数据进行排序,正如 Josef 指出的那样,您可以使用 HAC-groupsum
代替,即使数据未排序也能正常工作。结果当然略有不同。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。