首页 > 解决方案 > 为线性回归计算 R^2:SSreg/SStot 与 1-(SSSres/SStot) 导致不同的结果

问题描述

我正在尝试计算回归的 R^2。查看这篇文章,它可以通过 SSreg/SStot 或 1-(SSSres/SStot) 来计算。我的印象是我最终会得到相同的值,但是,我似乎有前一个公式给我 5%,而后一个公式我最终得到 -1% 的情况。这是否可能,如果可能,在什么情况下?

实现如下:

r2 = np.sum(df['fi']-df['yi'].mean()) ** 2) / np.sum(df['yi']-df['yi'].mean()) ** 2)
r2 = 1 - (np.sum((df['yi']-df['fi']) ** 2) / np.sum(df['yi']-df['yi'].mean()) ** 2))

有什么问题吗?如果不是,什么可以解释差异甚至负值?

编辑:

修正括号问题,问题依旧。以下计算不会导致相同的结果

r2 =     np.sum( (df['fi']-df['yi'].mean())**2 ) / \
         np.sum( (df['yi']-df['yi'].mean())**2 )
r2 = 1 - np.sum( (df['yi']-df['fi'])**2 ) / \
         np.sum( (df['yi']-df['yi'].mean())**2 )

标签: pythonnumpylinear-regression

解决方案


我认为你有括号问题。您正在对应该对平方求和的总和进行平方。平方应该在sum函数内部,而不是外部:

r2 =     np.sum( (df['fi']-df['yi'].mean())**2 ) / \
         np.sum( (df['yi']-df['yi'].mean())**2 )
r2 = 1 - np.sum( (df['yi']-df['fi'])**2 ) / \
         np.sum( (df['yi']-df['yi'].mean())**2 )

推荐阅读