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

时间:2016-12-01 02:05:04

标签: 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

5 个答案:

答案 0 :(得分:10)

为什么不这样:

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

答案 1 :(得分:5)

这不是显而易见的事,但caret包有一个函数postResample(),它将根据documentation计算“绩效估算的向量”。 “绩效估算”是

  • RMSE
  • Rsquared
  • 平均绝对误差(MAE)

并且必须从像这样的矢量访问

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

然而,正如另一个答案所述,这是使用r平方的相关平方近似。我不确定为什么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似乎都适用于广义线性模型。

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

这是基于[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 :(得分:0)

不确定为什么不能直接在R中实现,但是这个答案与Andrii's和Wordsthethewise基本上相同,如果有人像我一样经常使用它,为了方便起见,我只是将其变成一个函数。

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