Pozwól, że dodam trochę koloru do idei, że OLS z kategorycznymi ( sztucznie kodowanymi ) regresorami jest równoważny czynnikom z ANOVA. W obu przypadkach istnieją poziomy (lub grupy w przypadku ANOVA).
W regresji OLS najczęściej regresory mają również ciągłe zmienne. Logicznie modyfikują one związek w modelu dopasowania między zmiennymi kategorialnymi a zmienną zależną (DC). Ale nie do tego stopnia, że równolegle nie można go rozpoznać.
Na podstawie mtcars
zestawu danych możemy najpierw wizualizować model lm(mpg ~ wt + as.factor(cyl), data = mtcars)
jako nachylenie określone przez zmienną ciągłą wt
(wagę), a różne punkty przecięcia rzutują efekt zmiennej jakościowej cylinder
(cztery, sześć lub osiem cylindrów). Jest to ostatnia część, która tworzy równoległość z jednokierunkową ANOVA.
Zobaczmy to graficznie na wykresie po prawej stronie (trzy wykresy po lewej stronie są uwzględnione w celu porównania bocznego z modelem ANOVA omówionym natychmiast potem):
Każdy silnik cylindrowy jest oznaczony kolorami, a odległość między dopasowanymi liniami z różnymi punktami przechwytywania a chmurą danych jest równoważna wariacji wewnątrzgrupowej w analizie ANOVA. Zauważ, że przecięcia w modelu OLS ze zmienną ciągłą ( weight
) nie są matematycznie takie same, jak wartość różnych średnich wewnątrzgrupowych w ANOVA, ze względu na wpływ weight
i różne macierze modelu (patrz poniżej): średnia mpg
dla samochodów 4-cylinder, jest na przykład mean(mtcars$mpg[mtcars$cyl==4]) #[1] 26.66364
, podczas gdy OLS „bazowy” osią (odzwierciedlające umownie cyl==4
(od najniższego do najwyższego cyframi porządkuje R)) jest znacząco odmienne: summary(fit)$coef[1] #[1] 33.99079
. Nachylenie linii jest współczynnikiem zmiennej ciągłej weight
.
Jeśli spróbujesz stłumić efekt weight
mentalnego prostowania tych linii i przywrócenia ich do linii poziomej, skończysz na wykresie ANOVA modelu aov(mtcars$mpg ~ as.factor(mtcars$cyl))
na trzech wykresach podrzędnych po lewej stronie. weight
REGRESSOR jest obecnie na zewnątrz, ale związek z punktami do różnych przechwytuje jest grubsza zachowane - jesteśmy po prostu obraca się w kierunku przeciwnym do ruchu wskazówek zegara i rozkładanie wcześniej nakładających się wykresy dla każdego innego poziomu (ponownie, tylko jako urządzenie wizualnej „zobaczyć” związek; nie jako matematyczna równość, ponieważ porównujemy dwa różne modele!).
cylinder
20x
I poprzez sumę tych pionowych segmentów możemy ręcznie obliczyć resztki:
mu_mpg <- mean(mtcars$mpg) # Mean mpg in dataset
TSS <- sum((mtcars$mpg - mu_mpg)^2) # Total sum of squares
SumSq=sum((mtcars[mtcars$cyl==4,"mpg"]-mean(mtcars[mtcars$cyl=="4","mpg"]))^2)+
sum((mtcars[mtcars$cyl==6,"mpg"] - mean(mtcars[mtcars$cyl=="6","mpg"]))^2)+
sum((mtcars[mtcars$cyl==8,"mpg"] - mean(mtcars[mtcars$cyl=="8","mpg"]))^2)
Wynik: SumSq = 301.2626
i TSS - SumSq = 824.7846
. Porównać do:
Call:
aov(formula = mtcars$mpg ~ as.factor(mtcars$cyl))
Terms:
as.factor(mtcars$cyl) Residuals
Sum of Squares 824.7846 301.2626
Deg. of Freedom 2 29
Dokładnie taki sam wynik jak testowanie za pomocą ANOVA modelu liniowego z jedynie kategorialnym cylinder
regresorem:
fit <- lm(mpg ~ as.factor(cyl), data = mtcars)
summary(fit)
anova(fit)
Analysis of Variance Table
Response: mpg
Df Sum Sq Mean Sq F value Pr(>F)
as.factor(cyl) 2 824.78 412.39 39.697 4.979e-09 ***
Residuals 29 301.26 10.39
Widzimy zatem, że reszty - część całkowitej wariancji nie wyjaśniona przez model - a także wariancja są takie same, niezależnie od tego, czy wywołasz OLS typu lm(DV ~ factors)
, czy ANOVA ( aov(DV ~ factors)
): kiedy usuwamy model zmiennych ciągłych kończy się na tym samym systemie. Podobnie, gdy oceniamy modele globalnie lub jako zbiorczą ANOVA (nie poziom po poziomie), naturalnie otrzymujemy tę samą wartość p F-statistic: 39.7 on 2 and 29 DF, p-value: 4.979e-09
.
Nie oznacza to, że testowanie poszczególnych poziomów da identyczne wartości p. W przypadku OLS możemy wywołać summary(fit)
i uzyskać:
lm(formula = mpg ~ as.factor(cyl), data = mtcars)
Estimate Std. Error t value Pr(>|t|)
(Intercept) 26.6636 0.9718 27.437 < 2e-16 ***
as.factor(cyl)6 -6.9208 1.5583 -4.441 0.000119 ***
as.factor(cyl)8 -11.5636 1.2986 -8.905 8.57e-10 ***
pp adjusted
Tukey multiple comparisons of means
95% family-wise confidence level
Fit: aov(formula = mtcars$mpg ~ as.factor(mtcars$cyl))
$`as.factor(mtcars$cyl)`
diff lwr upr p adj
6-4 -6.920779 -10.769350 -3.0722086 0.0003424
8-4 -11.563636 -14.770779 -8.3564942 0.0000000
8-6 -4.642857 -8.327583 -0.9581313 0.0112287
Ostatecznie nic nie jest bardziej uspokajające niż zerknięcie na silnik pod maską, który jest niczym innym jak matrycami modelu i rzutami w przestrzeni kolumny. Są to w rzeczywistości dość proste w przypadku ANOVA:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢y1y2y3⋮⋮⋮.yn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢11⋮00⋮.0000⋮11⋮.0000⋮00⋮.11⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢μ1μ2μ3⎤⎦⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ε1ε2ε3⋮⋮⋮.εn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥(1)
cyl 4
cyl 6
cyl 8
yij=μi+ϵijμijiyij
Z drugiej strony matryca modelu dla regresji OLS to:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢y1y2y3y4⋮yn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1111⋮1x12x22x32x42⋮xn2x13x23x33x43⋮xn3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢β0β1β2⎤⎦⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ε1ε2ε3ε4⋮εn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
yi=β0+β1xi1+β2xi2+ϵiβ0β1β2weight
displacement
lm(mpg ~ wt + as.factor(cyl), data = mtcars)
weight
β0weight
β11cyl 4
cyl 4
11(1),cyl 6
cyl 8
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢y1y2y3y4y5⋮yn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢11111⋮1x1x2x3x4x5⋮xn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥[β0β1]+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢11100⋮000011⋮1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥[μ~2μ~3]+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ε1ε2ε3ε4ε5⋮εn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
1μ~2.⋅~
fit <- lm(mpg ~ wt + as.factor(cyl), data = mtcars)
summary(fit)$coef[3] #[1] -4.255582 (difference between intercepts cyl==4 and cyl==6 in OLS)
fit <- lm(mpg ~ as.factor(cyl), data = mtcars)
summary(fit)$coef[2] #[1] -6.920779 (difference between group mean cyl==4 and cyl==6)
1μ~3yi=β0+β1xi+μ~i+ϵi