您需要一点统计知识才能看到这一点。两个向量之间的 R 平方就是它们的相关性的平方。所以你可以将你的函数定义为:
rsq <- function (x, y) cor(x, y) ^ 2
桑迪潘的回答将返回完全相同的结果(请参阅以下证明),但就目前情况而言,它看起来更具可读性(由于明显的$r.squared
).
我们来统计一下
基本上我们拟合线性回归y
over x
,并计算回归平方和与总平方和的比率。
引理 1:回归y ~ x
相当于y - mean(y) ~ x - mean(x)
引理 2:beta = cov(x, y) / var(x)
引理 3:R.square = cor(x, y) ^ 2
Warning
两个任意向量之间的 R 平方x
and y
(相同长度)只是它们线性关系的优度度量。三思而行!! R 的平方x + a
and y + b
对于任何恒定变化都是相同的a
and b
。因此,它对于“预测的准确性”来说是一个薄弱甚至无用的衡量标准。使用 MSE 或 RMSE 代替:
- 如何从 lm 结果中获取 RMSE?
- R - 给定训练集和测试集的训练模型,计算测试 MSE
我同意42-的评论:
R 平方由与回归函数相关的汇总函数报告。但前提是这样的估计在统计上是合理的。
R 平方可以是“拟合优度”的(但不是最好的)度量。但没有理由证明它可以衡量样本外预测的好坏。如果将数据分为训练部分和测试部分,并在训练部分拟合回归模型,则可以在训练部分获得有效的 R 平方值,但无法在测试部分合法计算 R 平方。有些人这样做了,但我不同意。
这是一个非常极端的例子:
preds <- 1:4/4
actual <- 1:4
这两个向量之间的 R 平方为 1。是的,当然,一个只是另一个向量的线性缩放,因此它们具有完美的线性关系。但是,你真的认为preds
是一个很好的预测actual
??
回复明智的话
感谢您的意见1, 2 and 你的详细回答.
您可能误解了该过程。给定两个向量x
and y
,我们首先拟合一条回归线y ~ x
然后计算回归平方和和总平方和。看起来您跳过了这个回归步骤并直接进行平方和计算。这是错误的,因为平方和的划分不成立,并且您无法以一致的方式计算 R 平方。
正如您所演示的,这只是计算 R 平方的一种方法:
preds <- c(1, 2, 3)
actual <- c(2, 2, 4)
rss <- sum((preds - actual) ^ 2) ## residual sum of squares
tss <- sum((actual - mean(actual)) ^ 2) ## total sum of squares
rsq <- 1 - rss/tss
#[1] 0.25
但还有另一个:
regss <- sum((preds - mean(preds)) ^ 2) ## regression sum of squares
regss / tss
#[1] 0.75
此外,您的公式可以给出负值(正确的值应该是 1,如上面在Warning部分)。
preds <- 1:4 / 4
actual <- 1:4
rss <- sum((preds - actual) ^ 2) ## residual sum of squares
tss <- sum((actual - mean(actual)) ^ 2) ## total sum of squares
rsq <- 1 - rss/tss
#[1] -2.375
最后评论
当我两年前发布最初的答案时,我从未想到这个答案最终会这么长。然而,考虑到该帖子的高观点,我觉得有必要添加更多统计细节和讨论。我不想误导人们,因为他们可以如此轻松地计算 R 平方,所以他们可以在任何地方使用 R 平方。