statsmodels IV2SLS计算异方差稳健协方差时缺少pinv_wexog属性报错
报错原因
调用的statsmodels.sandbox.regression.gmm.IV2SLS属于早期实验性沙箱模块,和statsmodels后续版本的通用稳健协方差计算逻辑不兼容。get_robustcov_results方法依赖的pinv_wexog属性,仅由主流程正式维护的线性回归结果类在拟合阶段自动生成,沙箱版IV2SLS的拟合结果不包含该属性,因此触发属性不存在的异常。
解决方法
- 替换为正式维护的IV2SLS实现,是成本最低的最优方案:放弃沙箱模块的导入,改用
statsmodels.regression.linear_model下的IV2SLS类,该实现的结果对象完全兼容稳健协方差计算接口,修改后的核心代码为:# 替换原有沙箱模块的导入语句 from statsmodels.regression.linear_model import IV2SLS endog = cig_1995['lpackpc'] exog = cig_1995[['constant', 'lravgprs']] instrument = cig_1995[['constant', 'rtaxso']] results = IV2SLS(endog=endog, exog=exog, instrument=instrument).fit() # 调用HC1稳健协方差不会触发属性缺失报错 results_robust = results.get_robustcov_results(cov_type='HC1') - 若因历史代码约束必须使用沙箱版IV2SLS,需绕过通用的
get_robustcov_results接口,按照2SLS的异方差稳健协方差规则手动计算矩阵:计算过程围绕工具变量投影矩阵、残差权重矩阵的连乘逻辑展开,手动实现该流程即可避开对pinv_wexog属性的依赖。 - 临时补丁方案(不推荐长期使用):在拿到沙箱版IV2SLS的拟合结果后,手动为结果对象赋值
pinv_wexog属性为加权外生变量的伪逆矩阵,再调用稳健协方差方法。由于沙箱类和主流程类的内部计算逻辑存在差异,该方法可能出现协方差计算值与官方正式实现不一致的问题,仅适合临时调试场景。
内容的提问来源于stack exchange,提问作者Jinze
相关产品推荐
相关产品推荐

