Statsmodels - OLS Clustered Standard Errors(不接受来自 DF 的系列?)

Statsmodels - OLS Clustered Standard Errors (not accepting Series from DF?)

我是 运行 可以从 BEA 区域聚类中获益的分析。我之前没有在 Statsmodels 中使用过集群标准错误选项,所以我不清楚我是在搞乱语法,还是这个选项被破坏了。任何帮助将不胜感激。

这里是代码的相关部分(注意 topline_specs dict returns 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']

回溯源于一次 numpy 调用。它 returns 以下内容:

ValueError: The weights and list don't have the same length.

我能找到的关于使用聚类标准错误的所有内容看起来像 cov_kwds 参数可以从包含模型数据的 DataFrame 中获取一个 Series。我错过了什么?

当使用公式创建模型时,缺失值处理默认为 'drop',并且从提供给模型的所有数据数组中删除缺少观察值的行 (__init__)。非公式界面目前默认忽略缺失值

但是,目前没有检查和自动删除稍后给出的数组中的缺失值,在本例中是 cov_kwds 中所需的数据。如果这有原始的观察集,但一些已经在因变量和解释变量中被删除,那么就会出现长度不匹配,并且会引发报告的异常。

我重新打开了 https://github.com/statsmodels/statsmodels/issues/1220,因为在我们通过 pandas 索引获得足够信息的特殊情况下,可以处理缺失值。

这里有一个解决方法,等待解决Josef提到的错误:

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(不确定这是否有任何区别)。