用于计算R中R2(R平方)的函数

用于计算R中R2(R平方)的函数,r,function,statistics,R,Function,Statistics,我有一个包含观察和建模数据的数据框架,我想计算R2值。我希望有一个函数可以调用,但找不到。我知道我可以自己写并应用它,但我是否遗漏了一些显而易见的东西?我想要像这样的东西 obs <- 1:5 mod <- c(0.8,2.4,2,3,4.8) df <- data.frame(obs, mod) R2 <- rsq(df) # 0.85 obs您需要一些统计知识来了解这一点。两个向量之间的R平方就是。因此,您可以将您的功能定义为: rsq <- functio

我有一个包含观察和建模数据的数据框架,我想计算R2值。我希望有一个函数可以调用,但找不到。我知道我可以自己写并应用它,但我是否遗漏了一些显而易见的东西?我想要像这样的东西

obs <- 1:5
mod <- c(0.8,2.4,2,3,4.8)
df <- data.frame(obs, mod)

R2 <- rsq(df)
# 0.85

obs您需要一些统计知识来了解这一点。两个向量之间的R平方就是。因此,您可以将您的功能定义为:

rsq <- function (x, y) cor(x, y) ^ 2
这两个向量之间的R平方是1。是的,当然,一个只是另一个的线性重缩放,所以它们有一个完美的线性关系。但是,你真的认为
preds
是对
实际值的一个很好的预测吗


答复 谢谢你的评论,还有

你可能误解了程序。给定两个向量
x
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
preds为什么不这样做:

rsq <- function(x, y) summary(lm(y~x))$r.squared
rsq(obs, mod)
#[1] 0.8560185

rsq这不是很明显,但是
caret
包有一个函数
postResample()
,它将根据。“绩效评估”包括:

  • RMSE
  • 方格
  • 平均绝对误差(MAE)
必须像这样从向量中访问

library(caret)
vect1 <- c(1, 2, 3)
vect2 <- c(3, 2, 2)
res <- caret::postResample(vect1, vect2)
rsq <- res[2]

当然,手工编写代码也不错,但是为什么在一种主要用于统计的语言中没有一个函数呢?我在想我一定是在什么地方错过了R^2的实现,或者没有人关心它来实现它。大多数实现似乎适用于广义线性模型。

您也可以使用线性模型的摘要:

summary(lm(obs ~ mod, data=df))$r.squared 

下面是基于[

#1.“实际”和“预测”数据

df不确定为什么这不能直接在R中实现,但这个答案基本上与Andrii的答案相同,也就是说,如果有人像我一样使用函数,为了方便起见,我只是把它变成了一个函数

r2_general <-function(preds,actual){ 
  return(1- sum((preds - actual) ^ 2)/sum((actual - mean(actual))^2))
}

r2\u概述和不可避免的问题——“调整后的R^2怎么样?”这里有一个问题,您可能需要指定如何使用“建模数据”是创建的。r.squared由与回归函数相关联的汇总函数报告。但只有当这样一个估计值在统计上是合理的时。我有几个不同的模型,但它不仅仅是回归模型(如lm)的输出,因此汇总函数不起作用。基本上,我需要能够比较两个向量rs(李哲远的建议非常适用于此)有一些假设是必须满足的:我想将其用于KNN,但我不确定这些假设是否成立。必须检查这是否与常规计算的R^2相同。从相关性^2方法和常规1-SSE/SST得到的答案不一样。在我使用的示例中,我得到了
0.756388
来自corr^2和
0.7531449
来自正常r^2方程。虽然差异很小,但它可能会为超参数选择等建模。也许这很重要,而不是在多元线性回归中建模,r平方是响应向量和拟合值之间的平方相关性。尝试
建模这个答案似乎很重要ong.你说:“两个向量之间的R平方就是它们相关性的平方”。除非我弄错了,否则这只适用于具有估计截距的最小二乘线性回归。一般来说,Rsquared的公式是
1-残差平方和/总平方和
。(是的,这可能会产生负面结果,这只是表明估计值比使用平均值作为预测值更差。)这应该更高。此外:r2_概述这是可行的,但对于大型矩阵来说速度较慢:
lm()
(和
summary.lm()
)进行大量不必要的计算。有关更多信息,请参阅。
library(caret)
vect1 <- c(1, 2, 3)
vect2 <- c(3, 2, 2)
res <- caret::postResample(vect1, vect2)
rsq <- res[2]
preds <- c(1, 2, 3)
actual <- c(2, 2, 4)
rss <- sum((preds - actual) ^ 2)
tss <- sum((actual - mean(actual)) ^ 2)
rsq <- 1 - rss/tss
summary(lm(obs ~ mod, data=df))$r.squared 
# 1. 'Actual' and 'Predicted' data
df <- data.frame(
  y_actual = c(1:5),
  y_predicted  = c(0.8, 2.4, 2, 3, 4.8))

# 2. R2 Score components

# 2.1. Average of actual data
avr_y_actual <- mean(df$y_actual)

# 2.2. Total sum of squares
ss_total <- sum((df$y_actual - avr_y_actual)^2)

# 2.3. Regression sum of squares
ss_regression <- sum((df$y_predicted - avr_y_actual)^2)

# 2.4. Residual sum of squares
ss_residuals <- sum((df$y_actual - df$y_predicted)^2)

# 3. R2 Score
r2 <- 1 - ss_residuals / ss_total
r2_general <-function(preds,actual){ 
  return(1- sum((preds - actual) ^ 2)/sum((actual - mean(actual))^2))
}