You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无截距多元线性回归固定Beta后,如何正确计算R平方?

问题

我想基于已有数据固定多元线性回归的Beta值,但用Tibshirani、Hastie等人著作里的投影法计算时,得到的R平方超出了0%-100%的范围。请问在无截距多元线性回归中,固定Beta值后计算R平方的最佳方法是什么?

以下是我的操作步骤:

  1. 加载数据
import numpy as np
import pandas as pd
import statsmodels.api as sm

data = sm.datasets.get_rdataset('iris').data
  1. 定义变量
x = data.iloc[:, 1:4].values
y = data.iloc[:, 0].values
  1. 用最小二乘法求解最优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])
  1. 自定义固定Beta值
alt_betas = [3.7, -10, 45.78]
  1. 三种方式计算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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 05:16:05