Statsmodels - OLS Clustered Standard Errors(不接受来自 DF 的系列?)
Statsmodels - OLS Clustered Standard Errors (not accepting Series from DF?)
我是 运行 可以从 BEA 区域聚类中获益的分析。我之前没有在 Statsmodels 中使用过集群标准错误选项,所以我不清楚我是在搞乱语法,还是这个选项被破坏了。任何帮助将不胜感激。
这里是代码的相关部分(注意 topline_specs
dict returns Patsy 风格的公式):
#Capture topline specs
topline_specs={'GO':spec_dict['PC_GO']['Total']['TYPE']['BOTH'],
'RV':spec_dict['PC_RV']['Total']['TYPE']['BOTH'],
'ISSUER':spec_dict['PROP']['ISSUER']['TYPE']['BOTH'],
'PURPOSE':spec_dict['PROP']['PURPOSE']['TYPE']['BOTH']}
#Estimate each model
topline_mods={'GO':smf.ols(formula=topline_specs['GO'],data=data_d).fit(cov_type='cluster',
cov_kwds={'groups':data_d['BEA_INT']})}
topline_mods['GO']
回溯源于一次 numpy 调用。它 returns 以下内容:
ValueError: The weights and list don't have the same length.
我能找到的关于使用聚类标准错误的所有内容看起来像 cov_kwds
参数可以从包含模型数据的 DataFrame 中获取一个 Series。我错过了什么?
当使用公式创建模型时,缺失值处理默认为 'drop',并且从提供给模型的所有数据数组中删除缺少观察值的行 (__init__
)。非公式界面目前默认忽略缺失值
但是,目前没有检查和自动删除稍后给出的数组中的缺失值,在本例中是 cov_kwds
中所需的数据。如果这有原始的观察集,但一些已经在因变量和解释变量中被删除,那么就会出现长度不匹配,并且会引发报告的异常。
我重新打开了 https://github.com/statsmodels/statsmodels/issues/1220,因为在我们通过 pandas 索引获得足够信息的特殊情况下,可以处理缺失值。
这里有一个解决方法,等待解决Josef提到的错误:
def cluster_fit(formula, data, group_var):
fit = OLS.from_formula(formula, data=data).fit()
to_keep = pd.RangeIndex(len(data)).difference(pd.Index(fit.model.data.missing_row_idx))
robust = fit.get_robustcov_results(cov_type='cluster',
groups=data.iloc[to_keep][group_var])
return robust
用作res = cluster_fit('y ~ x + z', data=mydata, group_var='uid')
。
请注意,出于某种原因,结果将是 RegressionResults
而不是 RegressionResultsWrapper
(不确定这是否有任何区别)。
我是 运行 可以从 BEA 区域聚类中获益的分析。我之前没有在 Statsmodels 中使用过集群标准错误选项,所以我不清楚我是在搞乱语法,还是这个选项被破坏了。任何帮助将不胜感激。
这里是代码的相关部分(注意 topline_specs
dict returns Patsy 风格的公式):
#Capture topline specs
topline_specs={'GO':spec_dict['PC_GO']['Total']['TYPE']['BOTH'],
'RV':spec_dict['PC_RV']['Total']['TYPE']['BOTH'],
'ISSUER':spec_dict['PROP']['ISSUER']['TYPE']['BOTH'],
'PURPOSE':spec_dict['PROP']['PURPOSE']['TYPE']['BOTH']}
#Estimate each model
topline_mods={'GO':smf.ols(formula=topline_specs['GO'],data=data_d).fit(cov_type='cluster',
cov_kwds={'groups':data_d['BEA_INT']})}
topline_mods['GO']
回溯源于一次 numpy 调用。它 returns 以下内容:
ValueError: The weights and list don't have the same length.
我能找到的关于使用聚类标准错误的所有内容看起来像 cov_kwds
参数可以从包含模型数据的 DataFrame 中获取一个 Series。我错过了什么?
当使用公式创建模型时,缺失值处理默认为 'drop',并且从提供给模型的所有数据数组中删除缺少观察值的行 (__init__
)。非公式界面目前默认忽略缺失值
但是,目前没有检查和自动删除稍后给出的数组中的缺失值,在本例中是 cov_kwds
中所需的数据。如果这有原始的观察集,但一些已经在因变量和解释变量中被删除,那么就会出现长度不匹配,并且会引发报告的异常。
我重新打开了 https://github.com/statsmodels/statsmodels/issues/1220,因为在我们通过 pandas 索引获得足够信息的特殊情况下,可以处理缺失值。
这里有一个解决方法,等待解决Josef提到的错误:
def cluster_fit(formula, data, group_var):
fit = OLS.from_formula(formula, data=data).fit()
to_keep = pd.RangeIndex(len(data)).difference(pd.Index(fit.model.data.missing_row_idx))
robust = fit.get_robustcov_results(cov_type='cluster',
groups=data.iloc[to_keep][group_var])
return robust
用作res = cluster_fit('y ~ x + z', data=mydata, group_var='uid')
。
请注意,出于某种原因,结果将是 RegressionResults
而不是 RegressionResultsWrapper
(不确定这是否有任何区别)。