Начните с основной идеи вариации. Ваша начальная модель - это сумма квадратов отклонений от среднего. Значение R ^ 2 - это доля этого отклонения, которая учитывается с использованием альтернативной модели. Например, R-квадрат говорит вам, от какой вариации Y вы можете избавиться, суммируя квадрат расстояний от линии регрессии, а не от среднего значения.
Я думаю, что это станет совершенно ясно, если мы подумаем о простой задаче регрессии. Рассмотрим типичную диаграмму рассеяния, где у вас есть предиктор X по горизонтальной оси и ответ Y по вертикальной оси.
Среднее значение представляет собой горизонтальную линию на графике, где Y является постоянной величиной. Общее отклонение Y представляет собой сумму квадратов разностей между средним значением Y и каждой отдельной точкой данных. Это расстояние между средней линией и каждой отдельной точкой в квадрате и суммировании.
Вы также можете рассчитать другую меру изменчивости после того, как у вас будет линия регрессии из модели. Это разница между каждой точкой Y и линией регрессии. Вместо каждого (Y - среднего) квадрата мы получаем (Y - точка на линии регрессии) квадрат.
Если линия регрессии отличается от горизонтальной, мы получим меньшее общее расстояние, когда будем использовать эту подогнанную линию регрессии, а не среднее значение - то есть, будет меньше необъяснимых изменений. Соотношение между дополнительным объясненным изменением и исходным изменением - это ваше R ^ 2. Это пропорция исходного отклонения в вашем ответе, которая объясняется подгонкой этой линии регрессии.
Вот некоторый R-код для графика со средним, линией регрессии и отрезками от линии регрессии до каждой точки, чтобы помочь визуализировать:
library(ggplot2)
data(faithful)
plotdata <- aggregate( eruptions ~ waiting , data = faithful, FUN = mean)
linefit1 <- lm(eruptions ~ waiting, data = plotdata)
plotdata$expected <- predict(linefit1)
plotdata$sign <- residuals(linefit1) > 0
p <- ggplot(plotdata, aes(y=eruptions, x=waiting, xend=waiting, yend=expected) )
p + geom_point(shape = 1, size = 3) +
geom_smooth(method=lm, se=FALSE) +
geom_segment(aes(y=eruptions, x=waiting, xend=waiting, yend=expected, colour = sign),
data = plotdata) +
theme(legend.position="none") +
geom_hline(yintercept = mean(plotdata$eruptions), size = 1)