从Sklearn中的HuberRegressor得到p值和r值



我有一些异常值的数据集。从简单的线性回归,使用

stat_lin = stats.linregress(X, Y)

我可以得到系数,截距,r_value, p_value, std_err

但我想应用稳健回归方法,因为我不想包括异常值。

所以我应用了来自Sklearn的Huber回归器,

huber = linear_model.HuberRegressor(alpha=0.0, epsilon=1.35)
huber.fit(mn_all_df['X'].to_numpy().reshape(-1, 1), mn_all_df['Y'].to_numpy().reshape(-1, 1))

从中,我可以得到,系数,截距,比例,异常值。

我对结果很满意,因为系数值更高,回归线与大多数数据点拟合。

然而,我需要一个值,如r值和p值来说明,huber回归器的结果是显著的。

如何从稳健回归(我的情况下,使用huber回归器)中获得r值和p值

您还可以在统计模型中使用鲁棒线性模型。例如:

import statsmodels.api as sm
from sklearn import datasets
x = iris.data[:,0]
y = iris.data[:,2]
rlm_model = sm.RLM(y, sm.add_constant(x),
M=sm.robust.norms.HuberT())
rlm_results = rlm_model.fit()

从scipy得到的p值。Lingress是斜率不为零的p值,你可以这样做:

rlm_results.summary()

==============================================================================
coef    std err          z      P>|z|      [0.025      0.975]
------------------------------------------------------------------------------
const         -7.1311      0.539    -13.241      0.000      -8.187      -6.076
x1             1.8648      0.091     20.434      0.000       1.686       2.044
==============================================================================

现在lingress的r_value是一个相关系数,它保持不变。使用稳健的线性模型,您以不同的方式衡量您的观察结果,从而使其对异常值不那么敏感,因此,r平方计算在这里没有意义。你可能会得到一个更低的r平方,因为你避开了离群数据点的那条线。

查看@Josef(维护statmodels的人)对这个问题和这个答案的评论。如果你想要一个有意义的r平方

,你可以尝试这个计算如何在统计模型中获得稳健回归(RLM)的r平方?

对于HuberRegressor,您使用sklearn,它在其linear_model模块中不提供r_value和p_value的方法。还有其他的答案可以从回归的结果中计算这些值。

在这个答案中,有人展示了如何计算线性回归的p_value。我想这也可以用在你们的模型上。

编辑:我查看了r值,它用于通过平方来计算r平方值。以下代码摘自scipy的文档:

print(f"R-squared: {res.rvalue**2:.6f}")
R-squared: 0.717533

如果你有自己的回归,你可以使用sklearn的这种方法来计算r平方值:sklearn.metrics.r2score(y_true, y_pred)

相关内容

  • 没有找到相关文章

最新更新