gpt4 book ai didi

r - 在R中计算R2(R平方)的函数

转载 作者:行者123 更新时间:2023-12-03 14:29:22 35 4
gpt4 key购买 nike

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

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

R2 <- rsq(df)
# 0.85

最佳答案

您需要一些统计知识才能看到这一点。两个 vector 之间的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)
lemma 1
引理2:Beta = cov(x,y)/ var(x)
lemma 2
引理3:R.square = cor(x,y)^ 2
lemma 3

警告
R在两个任意长度的 xy(相同长度)之间的平方只是它们线性关系的良好度量。三思!对于任何常量移位 x + ay + bab之间的R平方都相同。因此,这对于“预测的良好性”而言是一种微弱甚至无用的措施。改用MSE或RMSE:
  • How to obtain RMSE out of lm result?
  • R - Calculate Test MSE given a trained model from a training set and a test set

  • 我同意 42-'s comment:

    The R squared is reported by summary functions associated with regression functions. But only when such an estimate is statistically justified.


    R平方可以是“拟合优度”的一种度量(但不是最佳的)。但是,没有理由证明它可以衡量样本外预测的优势。如果将数据分为训练部分和测试部分,并在训练部分上拟合回归模型,则可以在训练部分上获得有效的R平方值,但不能合法地在测试部分上计算R平方。 Some people did this,但我不同意。
    这是一个非常极端的例子:
    preds <- 1:4/4
    actual <- 1:4
    这两个 vector 之间的R平方是1。是的,当然,一个只是另一个的线性缩放,因此它们具有理想的线性关系。但是,您真的认为 preds是对 actual的良好预测吗?

    回复 wordsforthewise
    感谢您的评论 12your answer of details
    您可能误解了该过程。给定两个 vector 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平方。

    关于r - 在R中计算R2(R平方)的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40901445/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com