【发布时间】:2021-01-19 09:12:25
【问题描述】:
在尝试实现一个用于计算决定系数 R² 的 Python 函数时,我注意到我得到的结果完全不同,具体取决于我使用的计算顺序。
wikipedia page on R² 给出了关于如何计算 R² 的看似非常清楚的解释。我对 wiki 页面上所说的内容的 numpy 解释如下:
def calcR2_wikipedia(y, yhat):
# Mean value of the observed data y.
y_mean = np.mean(y)
# Total sum of squares.
SS_tot = np.sum((y - y_mean)**2)
# Residual sum of squares.
SS_res = np.sum((y - yhat)**2)
# Coefficient of determination.
R2 = 1.0 - (SS_res / SS_tot)
return R2
当我使用目标向量 y 和模型估计向量 yhat 尝试此方法时,此函数产生 -0.00301 的 R² 值。
但是,this stackoverflow post discussing how to calculate R² 接受的答案给出了以下定义:
def calcR2_stackOverflow(y, yhat):
SST = np.sum((y - np.mean(y))**2)
SSReg = np.sum((yhat - np.mean(y))**2)
R2 = SSReg/SST
return R2
使用与以前相同的 y 和 yhat 向量的方法,我现在得到的 R² 为 0.319。
此外,在同一个 stackoverflow 帖子中,很多人似乎都赞成使用 scipy 模块计算 R²,如下所示:
import scipy
slope, intercept, r_value, p_value, std_err = scipy.stats.linregress(yhat, y)
R2 = r_value**2
在我的情况下产生 0.261。
所以我的问题是:为什么从看似广为接受的来源产生的 R² 值彼此完全不同?计算两个向量之间的 R² 的正确方法是什么?
【问题讨论】:
标签: python numpy statistics coefficient-of-determination