Ответ 1
Вам нужно немного статистических знаний, чтобы увидеть это. R в квадрате между двумя векторами - это просто квадрат их корреляции. Таким образом, вы можете определить свою функцию как:
rsq <- function (x, y) cor(x, y) ^ 2
Ответ Sandipan вернет вам точно такой же результат (см. Следующее доказательство), но в его нынешнем виде он выглядит более читабельным (из-за очевидного $r.squared
).
Давай сделаем статистику
По сути, мы подбираем линейную регрессию y
по x
и вычисляем отношение суммы квадратов регрессии к общей сумме квадратов.
лемма 1: регрессия y ~ x
эквивалентна y - mean(y) ~ x - mean(x)
лемма 2: бета = 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
?
В ответ на слова
Спасибо за ваши комментарии 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 в квадрате везде.