Permettez-moi de mettre un peu de couleur dans l’idée que les MLS avec des régresseurs catégoriels ( codés factices ) sont équivalents aux facteurs de la ANOVA. Dans les deux cas, il existe des niveaux (ou des groupes dans le cas de l'ANOVA).
Dans la régression MCO, il est très courant d'avoir également des variables continues dans les régresseurs. Celles-ci modifient logiquement la relation dans le modèle d'ajustement entre les variables catégorielles et la variable dépendante (DC). Mais pas au point de rendre le parallèle méconnaissable.
Sur la mtcars
base de l'ensemble de données, nous pouvons tout d'abord visualiser le modèle lm(mpg ~ wt + as.factor(cyl), data = mtcars)
comme la pente déterminée par la variable continue wt
(poids), puis par les différentes conversations interceptées projetant l'effet de la variable catégorielle cylinder
(quatre, six ou huit cylindres). C’est cette dernière partie qui constitue un parallèle avec une ANOVA à un facteur.
Voyons cela graphiquement sur la sous-parcelle à droite (les trois sous-parcelles à gauche sont incluses à des fins de comparaison côte à côte avec le modèle ANOVA décrit immédiatement après):
Chaque moteur cylindrique est codé par couleur et la distance entre les lignes ajustées avec des interceptions différentes et le nuage de données est équivalente à la variation intra-groupe dans une ANOVA. Notez que les interceptions dans le modèle OLS avec une variable continue ( weight
) ne sont pas mathématiquement identiques à la valeur des différentes moyennes intra-groupe dans ANOVA, en raison de l'effet de weight
et des différentes matrices de modèle (voir ci-dessous): la moyenne mpg
de voitures 4 cylindres, par exemple, est mean(mtcars$mpg[mtcars$cyl==4]) #[1] 26.66364
, alors que l'OLS « base » interception (reflétant par convention cyl==4
( le plus bas pour les plus en R chiffres ordonnant)) est nettement différent: summary(fit)$coef[1] #[1] 33.99079
. La pente des lignes est le coefficient de la variable continue weight
.
Si vous essayez de supprimer l'effet weight
en redressant mentalement ces lignes et en les ramenant à la ligne horizontale, vous obtiendrez le tracé ANOVA du modèle aov(mtcars$mpg ~ as.factor(mtcars$cyl))
sur les trois sous-tracés à gauche. Le weight
régresseur est maintenant sorti, mais la relation entre les points et les différentes conversations interceptées est globalement préservée - nous faisons simplement une rotation dans le sens inverse des aiguilles d'une montre et étalons les tracés qui se chevauchaient auparavant pour chaque niveau différent (encore une fois, comme un moyen visuel de "voir" la connexion, pas comme une égalité mathématique, car nous comparons deux modèles différents!).
cylinder
20x
Et c’est grâce à la somme de ces segments verticaux que nous pouvons calculer manuellement les résidus:
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)
Le résultat: SumSq = 301.2626
et TSS - SumSq = 824.7846
. Comparer aux:
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
Exactement le même résultat que de tester avec une ANOVA le modèle linéaire avec uniquement le catégorique cylinder
comme régresseur:
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
Nous voyons donc que les résidus - la partie de la variance totale non expliquée par le modèle - ainsi que la variance sont les mêmes, que vous appeliez une MCO de type lm(DV ~ factors)
ou une ANOVA ( aov(DV ~ factors)
): lorsque nous supprimons la modèle de variables continues nous nous retrouvons avec un système identique. De même, lorsque nous évaluons les modèles globalement ou sous la forme d'une ANOVA omnibus (pas de niveau par niveau), nous obtenons naturellement la même valeur p F-statistic: 39.7 on 2 and 29 DF, p-value: 4.979e-09
.
Cela ne veut pas dire que le test de niveaux individuels produira des valeurs de p identiques. Dans le cas de MCO, nous pouvons invoquer summary(fit)
et obtenir:
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
En fin de compte, rien n’est plus rassurant que de jeter un coup d’œil sur le moteur sous le capot, qui n’est autre que les matrices du modèle et les projections dans l’espace des colonnes. Celles-ci sont en réalité assez simples dans le cas d'une 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
Par ailleurs, la matrice de modèle pour une régression OLS est la suivante:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢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