如何在 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 平方?的主要内容,如果未能解决你的问题,请参考以下文章