无截距多元线性回归固定Beta后,如何正确计算R平方?
我想基于已有数据固定多元线性回归的Beta值,但用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 = data.iloc[:, 1:4].values y = data.iloc[:, 0].values
- 用最小二乘法求解最优Beta(和statsmodels结果一致)
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])
- 自定义固定Beta值
alt_betas = [3.7, -10, 45.78]
- 三种方式计算R平方(百分比):
- 无截距statsmodels结果:99.61972754365206
sm.OLS(y, x).fit().rsquared * 100- 投影法(用最优Beta):99.61972754365208
(y @ x @ betas / (y @ y) ) * 100- 投影法(用自定义Beta):511.1237918393523
(y @ x @ alt_betas / (y @ y) ) * 100
我知道不同Beta结果不同,但这个结果违反了R平方应在0-1之间的规则。如果用自定义的Beta值,能不能通过statsmodels OLS计算R平方?我认为这个自定义Beta是环境的真实体现,希望得到解答。
1. 为什么自定义Beta用投影法计算会超出范围
你用的投影法公式 (y @ x @ betas) / (y @ y) 本质是预测值平方和(SSR)与总平方和(SST)的比值,这个公式仅在Beta是最小二乘最优解时成立且结果在0-1之间。
原因是:当Beta是最小二乘解时,预测值 y_hat = x@betas 是y在x列空间上的正交投影,根据投影定理,y 可以分解为投影项 y_hat 和正交残差项 y - y_hat,因此有 y@y = y_hat@y_hat + (y-y_hat)@(y-y_hat),此时 y_hat@y_hat ≤ y@y,所以比值在0-1之间。
但自定义的Beta不是最优解,预测值不是正交投影,此时 y_hat@y_hat 可能大于 y@y,导致比值超过1,甚至可能为负(如果预测值与y负相关)。
2. 无截距模型固定Beta后计算R平方的正确方法
对于无截距多元线性回归,无论Beta是否为最优解,R平方的核心定义是残差变异占总变异的比例的补集,公式为:
R² = 1 - (残差平方和 / 总平方和)
其中:
- 残差平方和(SSE):
∑(y - x@beta)² - 总平方和(SST):
∑y²(无截距模型的总变异以0为基准,而非均值)
这个公式计算出的R²范围是 (-∞, 1]:
- 当模型完全拟合时,R²=1;
- 当模型预测效果比直接取0还差时,R²为负(这是合理的,因为无截距模型的基准是预测值恒为0)。
3. 计算自定义Beta的R平方(含statsmodels间接实现)
方法1:手动计算
# 计算预测值 y_hat = x @ alt_betas # 计算残差平方和 sse = np.sum((y - y_hat) ** 2) # 计算总平方和 sst = np.sum(y ** 2) # 计算R平方 r_squared = 1 - (sse / sst) print(r_squared * 100)
方法2:利用statsmodels构造残差计算
statsmodels的OLS无法直接指定固定Beta,但可以先计算残差,再用其内置的统计量逻辑计算:
# 构造模型(不需要拟合,因为我们用自定义Beta) model = sm.OLS(y, x) # 手动计算残差 residuals = y - x @ alt_betas # 计算R平方 sst = np.sum(y ** 2) sse = np.sum(residuals ** 2) r_squared = 1 - (sse / sst) print(r_squared * 100)
补充说明
如果你坚持认为自定义Beta是真实的“环境参数”,那么用上述正确公式计算的R平方能准确反映该模型对数据变异的解释能力——即使结果为负,也说明这个模型的预测效果不如直接用0作为预测值,这是符合统计逻辑的。
内容的提问来源于stack exchange,提问作者godimedia

