仅对不丢失的数据运行回归并使用聚类标准错误的最干净,最Python方式是什么?
想象我有一个熊猫数据框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']})
[这感觉有点笨拙(尤其是当我在各处使用不同的右侧变量进行操作时。)而且我必须确保我的stats公式与dataframe变量匹配。
我可以通过设置缺少的参数来建立模型并拟合模型。
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.
,大概是缺少观察值的行are n't从all_data['groupid']
中删除,因此引发了错误。
(为时已晚,但可供其他用户使用)简而言之,如果您只想在smf.ols
函数中使用缺少的参数,则没有办法使其起作用,并且考虑到程序包的当前状态,我认为不应该使用它。原因正像您提到的那样:“缺少观察值的行不会被删除”,并且它们不应该被删除。因为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']})
非常难看,效率低下且容易出错!因此,可能您原来的大块方法会更好。