【问题标题】:Missing observations and clustered standard errors in Python statsmodels?Python statsmodels 中缺少观察结果和聚集的标准错误?
【发布时间】:2017-04-23 18:04:09
【问题描述】:

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

假设我有一个 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'] 中删除,所以它抛出了一个错误。

【问题讨论】:

  • 目前在三明治协方差计算中没有调整以解决观测值下降的问题。因此,使用 dropna 显式删除观察的第一种方法是唯一可用的方法。 (我认为只要groups系列与原始数据具有相同的索引,支持这一点并不难。)
  • 旁白:如果要比较具有不同解释变量的模型,那么最好在所有模型中删除相同的观察值,这样比较统计数据就不会受到数据集变化的影响。

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


【解决方案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']})

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

【讨论】:

    猜你喜欢
    • 2020-03-13
    • 2021-08-19
    • 2021-02-27
    • 2013-07-12
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2015-12-26
    相关资源
    最近更新 更多