Zacznij od podstawowej idei wariacji. Twój model początkowy jest sumą kwadratowych odchyleń od średniej. Wartość R ^ 2 jest proporcją tej zmiany, która jest uwzględniana przy użyciu alternatywnego modelu. Na przykład R-kwadrat mówi ci, ile zmian w Y możesz się pozbyć, sumując kwadratowe odległości od linii regresji zamiast średniej.
Myślę, że jest to całkowicie jasne, jeśli pomyślimy o przedstawionym prostym problemie regresji. Rozważ typowy wykres rozproszenia, w którym masz predyktor X wzdłuż osi poziomej i odpowiedź Y wzdłuż osi pionowej.
Średnia to pozioma linia na wykresie, w której Y jest stałe. Całkowita zmiana Y jest sumą kwadratowych różnic między średnią Y a każdym indywidualnym punktem danych. Jest to odległość między linią średnią a każdym pojedynczym punktem do kwadratu i sumą.
Możesz także obliczyć inną miarę zmienności po uzyskaniu linii regresji z modelu. Jest to różnica między każdym punktem Y a linią regresji. Zamiast każdego (Y - średnia) do kwadratu otrzymujemy (Y - punkt na linii regresji) do kwadratu.
Jeśli linia regresji jest inna niż pozioma, uzyskamy mniejszą całkowitą odległość, gdy użyjemy tej dopasowanej linii regresji zamiast średniej - oznacza to, że jest mniej niewyjaśniona odmiana. Stosunek między wyjaśnioną dodatkową odmianą a pierwotną odmianą to twój R ^ 2. Jest to proporcja oryginalnej zmiany w odpowiedzi, która jest wyjaśniona przez dopasowanie tej linii regresji.
Oto kod R dla wykresu ze średnią, linią regresji i segmentami od linii regresji do każdego punktu, aby pomóc w wizualizacji:
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)