您需要一点统计知识才能看到这一点。两个向量之间的 R 平方为 the square of their correlation。所以你可以将你的功能定义为:
rsq <- function (x, y) cor(x, y) ^ 2
Sandipan's answer 将返回完全相同的结果(参见以下证明),但就目前而言,它看起来更具可读性(由于明显的 $r.squared)。
我们来统计一下
基本上,我们拟合y 与x 的线性回归,并计算回归平方和与总平方和的比率。
引理 1:回归 y ~ x 等价于 y - mean(y) ~ x - mean(x)
引理 2:beta = cov(x, y) / var(x)
引理 3:R.square = cor(x, y) ^ 2
警告
两个任意向量x 和y(长度相同)之间的R 平方只是它们线性关系的良好度量。三思而后行!!在x + a 和y + b 之间的R 平方对于任何常数移位a 和b 都是相同的。因此,对于“预测的好坏”,它是一个薄弱甚至无用的衡量标准。请改用 MSE 或 RMSE:
我同意42-'s comment:
R 平方由与回归函数相关的汇总函数报告。但只有当这样的估计在统计上是合理的。
R 平方可以是(但不是最好的)“拟合优度”度量。但是没有理由说它可以衡量样本外预测的好坏。如果将数据拆分为训练和测试部分,并在训练部分拟合回归模型,则可以在训练部分获得有效的 R 平方值,但不能在测试部分合法地计算 R 平方。 Some people did this,但我不同意。
这是一个非常极端的例子:
preds <- 1:4/4
actual <- 1:4
这两个向量之间的 R 平方是 1。当然,一个只是另一个的线性重新缩放,因此它们具有完美的线性关系。但是,你真的认为preds 是对actual 的一个很好的预测吗??
感谢您的 cmets 1、2 和 your answer of details。
您可能误解了程序。给定两个向量x 和y,我们首先拟合回归线y ~ x,然后计算回归平方和和总平方和。看起来您跳过了这个回归步骤并直接进行平方和计算。这是错误的,因为the partition of sum of squares 不成立,并且您无法以一致的方式计算 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,如上面 警告 部分所述)。
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 平方。