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']})
非常丑陋、低效且容易出错!所以,可能你原来的矮胖方法会更好。
运行 仅对非缺失数据进行回归并使用聚类标准错误的最干净、最 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']})
非常丑陋、低效且容易出错!所以,可能你原来的矮胖方法会更好。