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

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

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

R2 <- rsq(df)
# 0.85

4 ответов


вам нужно немного статистических знаний, чтобы увидеть это. 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: beta = 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??


в ответ wordsforthewise

Спасибо за ваши комментарии 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 везде.


почему бы и нет:

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

это не что-то очевидное, но caret пакет имеет функцию postResample() это вычислит "вектор оценок производительности" в соответствии с документация. "Оценки эффективности" являются

  • 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 где-то.


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

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