Функция для вычисления R2 (R-квадрат) в R

У меня есть dataframe с наблюдаемыми и смоделированными данными, и я хотел бы вычислить значение R2. Я ожидал, что там будет функция, которую я мог бы назвать, но не могу ее найти. Я знаю, что могу написать свой собственный и применить его, но я пропущу что-то очевидное? Я хочу что-то вроде

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

R2 <- rsq(df)
# 0.85

Ответ 1

Вам нужно немного статистических знаний, чтобы увидеть это. R в квадрате между двумя векторами - это просто квадрат их корреляции. Таким образом, вы можете определить свою функцию как:

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

Ответ Sandipan вернет вам точно такой же результат (см. Следующее доказательство), но в его нынешнем виде он выглядит более читабельным (из-за очевидного $r.squared).


Давай сделаем статистику

По сути, мы подбираем линейную регрессию y по x и вычисляем отношение суммы квадратов регрессии к общей сумме квадратов.

лемма 1: регрессия y ~ x эквивалентна y - mean(y) ~ x - mean(x)

lemma 1

лемма 2: бета = cov (x, y)/var (x)

lemma 2

лемма 3: R.square = cor (x, y) ^ 2

lemma 3


Предупреждение

R в квадрате между двумя произвольными векторами x и y (одинаковой длины) - это просто мера добротности их линейных отношений. Подумай дважды!! R в квадрате между x + a и y + b одинаковы для любого постоянного сдвига a и b. Так что это слабая или даже бесполезная мера в отношении "правильности прогноза". Вместо этого используйте MSE или RMSE:

Я согласен с комментарием 42-:

Квадрат R сообщается сводными функциями, связанными с функциями регрессии. Но только тогда, когда такая оценка статистически обоснована.

R в квадрате может быть (но не лучшим) показателем "хорошего соответствия". Но нет никаких оснований полагать, что он может измерить достоверность прогноза вне выборки. Если вы разделите свои данные на обучающую и тестовую части и подгоните регрессионную модель к тренировочной, вы можете получить действительное значение R в квадрате для обучающей части, но вы не сможете законно вычислить R в квадрате для тестовой части. Некоторые люди сделали это, но я не согласен с этим.

Вот очень крайний пример:

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

Квадрат R между этими двумя векторами равен 1. Да, конечно, один - это просто линейное изменение масштаба другого, поэтому они имеют идеальное линейное соотношение. Но вы действительно думаете, что preds это хороший прогноз на actual?


В ответ на слова

Спасибо за ваши комментарии 1, 2 и ваш подробный ответ.

Вы, вероятно, неправильно поняли процедуру. Для двух векторов 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

Но есть и другое:

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

Последнее замечание

Я никогда не ожидал, что этот ответ может быть таким длинным, когда я опубликовал свой первоначальный ответ 2 года назад. Однако, учитывая высокую оценку этой темы, я чувствую себя обязанным добавить больше статистических деталей и обсуждений. Я не хочу вводить людей в заблуждение, что просто потому, что они могут так легко вычислить R в квадрате, они могут использовать R в квадрате везде.

Ответ 2

Почему бы не это:

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

Ответ 3

Это не что-то очевидное, но пакет 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-квадрата, как указано в другом ответе. Почему они не просто использовали обычный 1-SSE/SST вне меня.

Способ реализации нормального коэффициента определения уравнения:

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.

Ответ 4

Вы также можете использовать сводку для линейных моделей:

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

Ответ 5

Вот простейшее решение, основанное на [ 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