在Python statsmodels中缺少观察和聚集标准错误?

时间:2017-04-23 18:04:09

标签: python linear-regression missing-data statsmodels standard-error

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

想象一下,我有一个Pandas数据帧all_data

可行的Clunky方法(使数据帧不丢失数据):

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

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()`

这适用于默认的homoeskedastic标准错误, 但我不知道如何使用集群标准错误工作?如果我跑:

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']移除,所以它会抛出错误。

1 个答案:

答案 0 :(得分:1)

(为时已晚,但其他用户无法使用) 简而言之,如果您只想在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']})

非常丑陋,效率低下且容易出错!因此,可能您原来的大块方法会更好。