如何在 Statsmodels 中获得稳健回归 (RLM) 的 R 平方?

Posted

技术标签:

【中文标题】如何在 Statsmodels 中获得稳健回归 (RLM) 的 R 平方?【英文标题】:How to get R-squared for robust regression (RLM) in Statsmodels? 【发布时间】:2015-10-17 18:18:27 【问题描述】:

在衡量拟合优度时,R-Squared 似乎是“简单”线性模型的一种普遍理解(和接受)的衡量标准。 但是在statsmodels(以及其他统计软件)的情况下,RLM 不包括 R 平方和回归结果。 有没有办法“手动”计算它,也许类似于Stata 中的计算方式?

或者是否有其他可以使用/根据sm.RLS产生的结果计算的度量?

这是 Statsmodels 正在生产的产品:

import numpy as np
import statsmodels.api as sm

# Sample Data with outliers
nsample = 50
x = np.linspace(0, 20, nsample)
x = sm.add_constant(x)
sig = 0.3
beta = [5, 0.5]
y_true = np.dot(x, beta)
y = y_true + sig * 1. * np.random.normal(size=nsample)
y[[39,41,43,45,48]] -= 5   # add some outliers (10% of nsample)

# Regression with Robust Linear Model
res = sm.RLM(y, x).fit()
print(res.summary())

哪些输出:

                    Robust linear Model Regression Results                    
==============================================================================
Dep. Variable:                      y   No. Observations:                   50
Model:                            RLM   Df Residuals:                       48
Method:                          IRLS   Df Model:                            1
Norm:                          HuberT                                         
Scale Est.:                       mad                                         
Cov Type:                          H1                                         
Date:                 Mo, 27 Jul 2015                                         
Time:                        10:00:00                                         
No. Iterations:                    17                                         
==============================================================================
                 coef    std err          z      P>|z|      [95.0% Conf. Int.]
------------------------------------------------------------------------------
const          5.0254      0.091     55.017      0.000         4.846     5.204
x1             0.4845      0.008     61.555      0.000         0.469     0.500
==============================================================================

【问题讨论】:

由于 RLM 是使用迭代加权最小二乘法估计的,您可以尝试复制 WLS 实例 wls_results = WLS(mod.endog, mod.exog, weights=mod.weights).fit(),其中 mod 是拟合后的 RLM 模型。对此没有任何保证。 WLS 结果的 rsquared 具有加权残差的 rsquared,这将是降低离群值权重的度量。但是,如果权重不同,我认为您不能通过 rsquared 比较模型。 正确答案在这里github.com/statsmodels/statsmodels/pull/1341,其中包括基于SAS定义的rsquared。 谢谢,mod = sm.RLS(y, x); r2_wls = sm.WLS(mod.endog, mod.exog, weights=mod.fit().weights).fit().rsquared 确实有助于获得 R2=0.948。与OLS=0.731 的 R2 相比。看起来“好得令人难以置信”:-) 感谢链接 - 在 github 搜索类似问题时没有看到它。补丁中的函数产生 R2=0.721。略低于OLS 的 R2... 但BIC 从 181 下降到 177(这是一个重大转变吗?)。是否有其他措施可以证明 RLS 在数字上清楚地显示“更合适”? 我刚刚也发现了这个stat.ethz.ch/pipermail/r-help/2008-November/179773.html。首先,PR 1341 还修复了健壮的一些错误,这些错误在当前 RLM 中未使用,但扩展需要。 1341 中的 rsquared 是基于似然性(或 M 估计目标函数)而不是残差平方和的伪 rsquared,OLS 的 AIC 是基于正态分布的。我有一段时间没看过这个了,但是显示“更适合”有点模棱两可,因为 RLM 会降低所有“不适合”的观察值,并将它们视为异常值。 【参考方案1】:

由于 OLS 返回 R2,我建议使用简单的线性回归将实际值与拟合值进行回归。无论拟合值来自何处,这种方法都会为您提供相应 R2 的指示。

【讨论】:

【参考方案2】:

R2 不能很好地衡量 RLM 模型的拟合优度。问题是异常值对 R2 值有巨大影响,以至于它完全由异常值决定。事后使用加权回归是一种有吸引力的替代方法,但最好查看估计系数的 p 值、标准误差和置信区间。

将 OLS 摘要与 RLM 进行比较(由于随机化不同,结果与您的略有不同):

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.726
Model:                            OLS   Adj. R-squared:                  0.721
Method:                 Least Squares   F-statistic:                     127.4
Date:                Wed, 03 Nov 2021   Prob (F-statistic):           4.15e-15
Time:                        09:33:40   Log-Likelihood:                -87.455
No. Observations:                  50   AIC:                             178.9
Df Residuals:                      48   BIC:                             182.7
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          5.7071      0.396     14.425      0.000       4.912       6.503
x1             0.3848      0.034     11.288      0.000       0.316       0.453
==============================================================================
Omnibus:                       23.499   Durbin-Watson:                   2.752
Prob(Omnibus):                  0.000   Jarque-Bera (JB):               33.906
Skew:                          -1.649   Prob(JB):                     4.34e-08
Kurtosis:                       5.324   Cond. No.                         23.0
==============================================================================

Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
                    Robust linear Model Regression Results                    
==============================================================================
Dep. Variable:                      y   No. Observations:                   50
Model:                            RLM   Df Residuals:                       48
Method:                          IRLS   Df Model:                            1
Norm:                          HuberT                                         
Scale Est.:                       mad                                         
Cov Type:                          H1                                         
Date:                Wed, 03 Nov 2021                                         
Time:                        09:34:24                                         
No. Iterations:                    17                                         
==============================================================================
                 coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const          5.1857      0.111     46.590      0.000       4.968       5.404
x1             0.4790      0.010     49.947      0.000       0.460       0.498
==============================================================================

If the model instance has been used for another fit with different fit parameters, then the fit options might not be the correct ones anymore .

您可以看到,从 OLS 到 RLM,截距项和斜率项的标准误和置信区间大小都会减小。这表明估计值更接近实际值。

【讨论】:

【参考方案3】:

为什么不使用model.predict 来获取r2?例如:

r2=1. - np.sum(np.abs(model.predict(X) - y) **2) / np.sum(np.abs(y - np.mean(y)) ** 2)

【讨论】:

这将被异常值支配。 @Josef - 通常,我会使用 WLS 机制并在外样本数据上比较 R2 值(或研究特定指标)。有没有更好的机制?

以上是关于如何在 Statsmodels 中获得稳健回归 (RLM) 的 R 平方?的主要内容,如果未能解决你的问题,请参考以下文章

Stata和R中Logit回归的不同稳健标准误差

如何从 statsmodels.api 中提取回归系数?

为 Statsmodels 线性回归格式化数据

Python数模笔记-StatsModels 统计回归可视化

python statsmodels - 回归中的二次项

使用 statsmodels 忽略多个 OLS 回归中的缺失值