【问题标题】:Function to calculate R2 (R-squared) in R在 R 中计算 R2(R 平方)的函数
【发布时间】:2017-04-15 13:09:37
【问题描述】:

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

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

R2 <- rsq(df)
# 0.85

【问题讨论】:

  • 不可避免的——“调整后的 R^2 怎么样?”问题在这里解决 - stats.stackexchange.com/questions/48703/…
  • 您可能需要指定如何创建此“建模数据”。 r.squared 由与回归函数相关的汇总函数报告。但只有当这样的估计在统计上是合理的。
  • 我有几个不同的模型,但不是简单的像lm这样的回归模型的输出,所以汇总函数不起作用。基本上我需要能够在两个向量之间进行比较(Zheyuan Li 的建议非常适合这个)

标签: r function statistics


【解决方案1】:

不知道为什么这不是直接在 R 中实现的,但这个答案与 Andrii 和 Wordsforthewise 的答案基本相同,如果有人像我一样使用它,我只是为了方便起见变成了一个函数。

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

【讨论】:

    【解决方案2】:

    这不是很明显,但是caret 包有一个函数postResample(),它将根据documentation 计算“性能估计向量”。 “性能估计”是

    • RMSE
    • R平方
    • 平均绝对误差 (MAE)

    并且必须像这样从向量中访问

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

    但是,正如另一个答案中提到的,这是使用 r-squared 的相关平方近似值。我不确定 Max Kuhn 为什么不只使用传统的 1-SSE/SST。

    caret 也有一个 R2() 方法,虽然在文档中很难找到。

    普通coefficient of determination equation的实现方式是:

    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
    

    当然,手工编码还不错,但为什么没有一个主要用于统计的语言中的函数呢?我在想我一定是在某处错过了 R^2 的实现,或者没有人足够关心它来实现它。大多数实现,like this one,似乎是针对广义线性模型的。

    【讨论】:

    • 这应该更高。另外: r2_general
    【解决方案3】:

    这里是基于[https://en.wikipedia.org/wiki/Coefficient_of_determination]的最简单的解决方案

    # 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
    

    【讨论】:

      【解决方案4】:

      您需要一点统计知识才能看到这一点。两个向量之间的 R 平方为 the square of their correlation。所以你可以将你的功能定义为:

      rsq <- function (x, y) cor(x, y) ^ 2
      

      Sandipan's answer 将返回完全相同的结果(参见以下证明),但就目前而言,它看起来更具可读性(由于明显的 $r.squared)。


      我们来统计一下

      基本上,我们拟合yx 的线性回归,并计算回归平方和与总平方和的比率。

      引理 1:回归 y ~ x 等价于 y - mean(y) ~ x - mean(x)

      引理 2:beta = cov(x, y) / var(x)

      引理 3:R.square = cor(x, y) ^ 2


      警告

      两个任意向量xy(长度相同)之间的R 平方只是它们线性关系的良好度量。三思而后行!!在x + ay + b 之间的R 平方对于任何常数移位ab 都是相同的。因此,对于“预测的好坏”,它是一个薄弱甚至无用的衡量标准。请改用 MSE 或 RMSE:

      我同意42-'s comment

      R 平方由与回归函数相关的汇总函数报告。但只有当这样的估计在统计上是合理的。

      R 平方可以是(但不是最好的)“拟合优度”度量。但是没有理由说它可以衡量样本外预测的好坏。如果将数据拆分为训练和测试部分,并在训练部分拟合回归模型,则可以在训练部分获得有效的 R 平方值,但不能在测试部分合法地计算 R 平方。 Some people did this,但我不同意。

      这是一个非常极端的例子:

      preds <- 1:4/4
      actual <- 1:4
      

      这两个向量之间的 R 平方是 1。当然,一个只是另一个的线性重新缩放,因此它们具有完美的线性关系。但是,你真的认为preds 是对actual 的一个很好的预测吗??


      回复wordsforthewise

      感谢您的 cmets 12your answer of details

      您可能误解了程序。给定两个向量xy,我们首先拟合回归线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 平方。

      【讨论】:

      • 必须满足一些假设才能实现这一点:win-vector.com/blog/2011/11/correlation-and-r-squared 我想将它用于 KNN,但我不确定这些假设是否成立。必须检查这是否实际上与传统计算的 R^2 相同
      • 相关^2方法的答案和传统的1-SSE/SST不一样。在我使用的示例中,我从 corr^2 得到 0.756388,从正常的 r^2 方程得到 0.7531449。差别不大,但也许它会为超参数选择等建模。
      • 也许它会重要,而不是模型
      • 在多元线性回归中,R-squared 是响应向量和拟合值之间的平方相关。试试model &lt;- lm(trees); cor(trees[[1]], model$fitted.values) ^ 2。将此与summary(model)$r.squared 进行比较
      • 这个答案似乎是错误的。您声明:“两个向量之间的 R 平方只是它们相关性的平方”。除非我弄错了,否则这仅在具有估计截距的最小二乘线性回归的情况下才是正确的。一般来说,Rsquared 的公式是1 - Residual Sum of Squares / Total Sum of Squares。 (是的,这可能会产生负面结果,这只是表明估计值比使用平均值作为预测值更差。)
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        为什么不这样:

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

        【讨论】:

        猜你喜欢
        • 2016-04-14
        • 1970-01-01
        • 1970-01-01
        • 2021-05-05
        • 2021-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-09
        相关资源
        最近更新 更多