Функция для вычисления 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)
Лемма 2: beta = cov(x, y) / var (x)
Лемма 3: R. square = cor (x, y) ^ 2
предупреждение
R в квадрате между двумя произвольными векторами x
и y
(той же длины) является просто мерой доброты их линейного отношения. Подумай дважды!! R в квадрате между x + a
и y + b
идентичны для любого постоянного сдвига a
и b
. Таким образом, это слабая или даже бесполезная мера "благости предсказания". Используйте MSE или RMSE вместо этого:
- как получить RMSE из результата lm?
- R-вычислить тест MSE с учетом обученной модели из учебного набора и набора тестов
я согласен с 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 везде.
это не что-то очевидное, но 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 где-то.