Python statsmodels 中缺少观察值和聚类标准误差?

Missing observations and clustered standard errors in Python statsmodels?

运行 仅对非缺失数据进行回归并使用聚类标准错误的最干净、最 pythonic 的方法是什么?

假设我有一个 Pandas 数据框 all_data

有效的笨拙方法(制作数据框而不丢失数据):

我可以制作一个没有缺失数据的新数据框,制作模型并拟合模型:

import statsmodels.formula.api as smf

available_data = all_data.loc[:,['y', 'x', 'groupid']].dropna(how='any')
model  = smf.ols('y ~ x', data = available_data)
result = model.fit(cov_type = 'cluster', cov_kwds={'groups': available_data['groupid']})

这感觉有点笨拙(尤其是当我用不同的右手边变量到处做的时候。)而且我必须确保我的统计公式与数据框变量相匹配。

但是有没有办法使用缺少的参数使其工作?

我可以通过设置缺少的参数来制作模型并拟合模型。

m = smf.ols('y ~ x', data = all_data, missing = 'drop')
result_nocluster = m.fit()`

这对于默认的同方差标准误差非常有效, 但我不知道如何使它与集群标准错误一起工作?如果我 运行:

result = m.fit(cov_type = 'cluster', cov_kwds = {'groups': all_data['groupid']})

我收到错误 ValueError: The weights and list don't have the same length. 可能缺少观察结果的行 没有 all_data['groupid'] 中删除,所以它抛出错误。

(有点晚了但是为了其他用户的使用) 简而言之,如果您只想在 smf.ols 函数中使用缺少的参数,就没有办法让它工作,而且我认为,鉴于包的当前状态,不应该有一个。原因与您提到的完全一样:"the rows with missing observations aren't getting removed" 他们不应该这样做。因为 missing 参数创建了输入数据的(惰性)副本,没有缺失值并将其用作输入(输入数据:$X$,惰性副本:$\hat{X}$)。这个过程真的不应该从原始数据 ($X$) 中删除缺失值!同时,groups 数组应该引用模型使用的相同数据,即 $\hat{X}$,但是在您的代码中,group 变量来自原始数据 ($X$),这是不同的比模型数据($\hat{X}$)。

有人可能会争辩说 groups 应该只接受关键字。我想这是需要在软件包的 GitHub 页面上进行更深入讨论的内容。

目前,解决您的问题的一个快速方法是在第二行添加一个 dropna,这违背了目的。所以它看起来像这样:

result = m.fit(cov_type = 'cluster',
               cov_kwds = {'groups': alldata[['y', 'x', 'groupid']].dropna()['groupid']})

非常丑陋、低效且容易出错!所以,可能你原来的矮胖方法会更好。