我想根据我拥有的一些数据修复多元线性回归中的贝塔值,这会导致基于 Tibshirani、Hastie 等人中提到的投影方法的 R 方值小于 0% 且大于 100%。所有书。
固定 beta 值以运行无截距的多元线性回归后,计算 R 方的最佳方法是什么 -
加载数据
import numpy as np
import pandas as pd
import statsmodels.api as sm
data = sm.datasets.get_rdataset('iris').data
定义
x
和 y
变量 -
x = data.iloc[:, 1:4].values
y = data.iloc[:, 0].values
按照 Tibshirani 书求解 beta -
betas = np.linalg.solve(x.T @ x, x.T @ y)
array([ 1.12106169, 0.92352887, -0.89567583])
sm.OLS(y, x).fit().params
array([ 1.12106169, 0.92352887, -0.89567583])
或者,根据对环境的一些了解来固定测试版 -
alt_betas = [3.7, -10, 45.78]
现在,以 3 种方式计算 R 平方 -
使用无拦截的 Statsmodel
使用 R Sq 的投影法
使用投影方法但使用 RSq 的固定 Beta
sm.OLS(y, x).fit().rsquared * 100
99.61972754365206
(y @ x @ betas / (y @ y) ) * 100
99.61972754365208
(y @ x @ alt_betas / (y @ y) ) * 100
511.1237918393523
现在我明白,鉴于我使用不同的 beta,它应该有所不同,但这违反了 RSq 应在 0 和 1 之间的规则。
如果我有一些替代测试版,有没有办法修复它并使用
statsmodels OLS
来计算 R 平方?
想一想,因为我需要使用替代 Beta 作为我的用例,我认为从我的角度来看,这是环境的真实代表。
提前致谢!
从概念上讲,R 方(“R2”)是零模型的残差平方和与特定感兴趣模型的残差平方和之间的相对差。
理想模型产生的预测值与实际数据值完全相等,残差平方和为零,因此 R2 = 1。不太理想的模型获得小于 1 的 R2 值。
不良数据模型可能会获得比零模型更差的残差。例如,模型可以通过反转每个数据值的符号来生成“预测”值。如果模型残差平方和大于零模型的模型残差平方和,则 R2 将为负。
通常,零模型是所建模数据的平均值(零模型的预测值都是相同的,并且等于数据的平均值)。
或者,零模型可以为零(零模型的预测值全部相同,等于 0)。
R2 的线性代数表达式可以从矩阵形式的 OLS 和如何以矩阵形式表示 R 平方?.
中的信息导出。言归正传,我们可以编写一个 Python 函数来使用线性代数计算 R2(百分比)。该函数使用上述两个空模型之一。
def r2pct(x, y, betas, central=True):
y_baseline = y - y.mean() if central else y
ss_null = y_baseline @ y_baseline
ss_model = y@y - 2*(betas.T @ x.T @ y) + (betas.T @ x.T @ x @ betas)
return (1 - ss_model/ss_null) * 100
这与您原始帖子中的值相符。这些 Beta 值占数据相对于零的方差的 99.6%。
r2pct(x, y, betas, central=False)
# 99.61972754365202
这些 beta 值占数据方差的 80.6%(即与平均值的方差)。
r2pct(x, y, betas)
# 80.55673214701147
负 R2 值表明这些替代 beta 生成的模型与数据的拟合效果非常差,比仅仅预测每个数据值为 0 更糟糕。
r2pct(x, y, alt_betas, central=False)
# -2270.59299658298
这些 Beta 产生的模型与数据的拟合效果非常差,比仅仅预测每个数据值等于数据平均值还要糟糕。
r2pct(x, y, alt_betas)
# -121108.02817441802