statsmodels OLS双向聚类标准误报错原因咨询
双向聚类标准误报错原因及解决方法
数据集说明
数据按发行人-季度维度聚合,每行代表新增公司债发行金额,结构如下:
| IssuerCUSIP | NATION | Industry | Amount | IssuedPostEvent | YEAR | QUARTER |
|---|---|---|---|---|---|---|
| 000001 | Mexico | A | 100 | 0 | 2010 | 2010Q1 |
| 000002 | China | B | 200 | 1 | 2015 | 2015Q2 |
| 000002 | China | B | 150 | 0 | 2014 | 2014Q3 |
| 000003 | China | C | 130 | 1 | 2018 | 2018Q4 |
| 000004 | Chile | C | 100 | 0 | 2012 | 2012Q1 |
| 000005 | Chile | D | 100 | 1 | 2013 | 2013Q2 |
采用双重差分(DID)模型检验国家层面事件对美元计价债券发行量的影响,回归公式:
AMT ~ POSTEVENT + C(NATION) + C(INDUSTRY)*C(YEAR) + C(QUARTER)
错误代码及报错信息
尝试使用双向聚类标准误的代码:
MOD = smf.ols("AMT ~ POST*INCLUDE + C(NATION) + C(INDUSTRY)*C(YEAR) + C(QUARTER)", data=issueinUSD) RES = MOD.fit(cov_type='cluster', cov_kwds={'groups': np.asarray(pd.concat([issueinUSD['NATION'], issueinUSD['QUARTER']]))})
运行后报错:
~/opt/anaconda3/lib/python3.9/site-packages/statsmodels/regression/linear_model.py in fit(self, method, cov_type, cov_kwds, use_t, **kwargs) 341 342 if isinstance(self, OLS): --> 343 lfit = OLSResults( 344 self, beta, 345 normalized_cov_params=self.normalized_cov_params, ~/opt/anaconda3/lib/python3.9/site-packages/statsmodels/regression/linear_model.py in __init__(self, model, params, normalized_cov_params, scale, cov_type, cov_kwds, use_t, **kwargs) 1605 use_t = use_t_2 1606 # TODO: warn or not? --> 1607 self.get_robustcov_results(cov_type=cov_type, use_self=True, 1608 use_t=use_t, **cov_kwds) 1609 for key in kwargs: ~/opt/anaconda3/lib/python3.9/site-packages/statsmodels/regression/linear_model.py in get_robustcov_results(self, cov_type, use_t, **kwargs) 2550 # duplicate work 2551 self.n_groups = n_groups = len(np.unique(groups)) ... 107 else: <__array_function__ internals> in bincount(*args, **kwargs) ValueError: The weights and list don't have the same length.
报错原因
核心问题是聚类分组的长度与样本数不匹配:
pd.concat([issueinUSD['NATION'], issueinUSD['QUARTER']])将两个列纵向拼接,得到的数组长度是样本数的2倍(比如6行样本拼接后得到12个元素)。- statsmodels的聚类标准误要求
groups参数的长度必须与样本观测数完全一致,每个观测对应自身的分组标识(双向聚类时对应两个维度的标识),长度不匹配会触发bincount的维度错误。
解决方法
要实现国家和季度的双向聚类,需将groups参数设置为包含两个分组变量的列表,每个变量长度与样本数一致:
MOD = smf.ols("AMT ~ POST*INCLUDE + C(NATION) + C(INDUSTRY)*C(YEAR) + C(QUARTER)", data=issueinUSD) # 传入两个分组变量的列表,实现双向聚类 RES = MOD.fit(cov_type='cluster', cov_kwds={'groups': [issueinUSD['NATION'], issueinUSD['QUARTER']]})
注意:该方法要求statsmodels版本≥0.13.0,若版本过低,需先升级statsmodels,或使用linearmodels库的PanelOLS实现双向聚类。
内容的提问来源于stack exchange,提问作者tianxd
相关产品推荐
相关产品推荐

