我正在运行一项分析,可以从BEA地区的群集中受益。我以前没有在Statsmodels中使用过聚类标准错误选项,所以我不清楚我是否搞乱了语法,或者选项被破坏了。任何帮助将不胜感激。
以下是代码的相关部分(请注意topline_specs
dict返回Patsy样式的公式):
#Capture topline specs
topline_specs={'GO':spec_dict['PC_GO']['Total']['TYPE']['BOTH'],
'RV':spec_dict['PC_RV']['Total']['TYPE']['BOTH'],
'ISSUER':spec_dict['PROP']['ISSUER']['TYPE']['BOTH'],
'PURPOSE':spec_dict['PROP']['PURPOSE']['TYPE']['BOTH']}
#Estimate each model
topline_mods={'GO':smf.ols(formula=topline_specs['GO'],data=data_d).fit(cov_type='cluster',
cov_kwds={'groups':data_d['BEA_INT']})}
topline_mods['GO']
追溯源于一个不正常的电话。它返回以下内容:
ValueError: The weights and list don't have the same length.
我在使用聚类标准错误时所能找到的一切看起来像cov_kwds
参数可以从容纳模型数据的DataFrame中获取一个Series。我错过了什么?
答案 0 :(得分:2)
使用公式创建模型时,缺失值处理默认为“drop”,缺少观察值的行将从提供给模型的所有数据数组中删除(__init__
)。在非公式接口中,默认值当前是忽略缺失值。
但是,目前没有检查并自动删除稍后给出的数组中的缺失值,在这种情况下是cov_kwds
中所需的数据。如果这有一组原始的观察结果,但有些已经在依赖变量和解释变量中被删除,则会出现长度不匹配,并且会引发报告的异常。
我重新打开https://github.com/statsmodels/statsmodels/issues/1220因为在我们通过pandas索引获得足够信息的特殊情况下可以处理缺失值。
答案 1 :(得分:0)
这里有一个解决方法,等待Josef提到的bug得到解决:
def cluster_fit(formula, data, group_var):
fit = OLS.from_formula(formula, data=data).fit()
to_keep = pd.RangeIndex(len(data)).difference(pd.Index(fit.model.data.missing_row_idx))
robust = fit.get_robustcov_results(cov_type='cluster',
groups=data.iloc[to_keep][group_var])
return robust
用作res = cluster_fit('y ~ x + z', data=mydata, group_var='uid')
。
请注意,由于某种原因,结果将是 RegressionResults
而不是 RegressionResultsWrapper
(不确定这是否有任何区别)。