我有一些异常值的数据集。从简单的线性回归,使用
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)
。