Permítanme ponerle un poco de color a la idea de que OLS con regresores categóricos ( codificados de forma simulada ) es equivalente a los factores en ANOVA. En ambos casos hay niveles (o grupos en el caso de ANOVA).
En la regresión OLS, lo más habitual es tener también variables continuas en los regresores. Estos modifican lógicamente la relación en el modelo de ajuste entre las variables categóricas y la variable dependiente (DC). Pero no hasta el punto de hacer que el paralelo sea irreconocible.
Según el mtcars
conjunto de datos, primero podemos visualizar el modelo lm(mpg ~ wt + as.factor(cyl), data = mtcars)
como la pendiente determinada por la variable continua wt
(peso) y las diferentes intersecciones que proyectan el efecto de la variable categórica cylinder
(cuatro, seis u ocho cilindros). Es esta última parte la que forma un paralelo con un ANOVA unidireccional.
Vamos a verlo gráficamente en la subtrama a la derecha (las tres subtramas a la izquierda se incluyen para la comparación de lado a lado con el modelo ANOVA discutido inmediatamente después):
Cada motor de cilindro tiene un código de color, y la distancia entre las líneas ajustadas con diferentes intersecciones y la nube de datos es el equivalente a la variación dentro del grupo en un ANOVA. Observe que las intersecciones en el modelo OLS con una variable continua ( weight
) no son matemáticamente iguales que el valor de las diferentes medias dentro del grupo en ANOVA, debido al efecto de weight
las diferentes matrices del modelo (ver más abajo): la media mpg
para coches de 4 cilindros, por ejemplo, está mean(mtcars$mpg[mtcars$cyl==4]) #[1] 26.66364
, mientras que la intersección OLS "línea base" (que refleja por convención cyl==4
(menor a mayor números de pedido en R)) es marcadamente diferente: summary(fit)$coef[1] #[1] 33.99079
. La pendiente de las líneas es el coeficiente de la variable continua weight
.
Si intentas suprimir el efecto de weight
enderezar mentalmente estas líneas y devolverlas a la línea horizontal, terminarás con el diagrama ANOVA del modelo aov(mtcars$mpg ~ as.factor(mtcars$cyl))
en las tres subtramas a la izquierda. El weight
regresor ahora está fuera, pero la relación de los puntos a las diferentes intersecciones se conserva aproximadamente: simplemente estamos girando en sentido antihorario y extendiendo las parcelas previamente superpuestas para cada nivel diferente (de nuevo, solo como un dispositivo visual para "ver" la conexión; no como una igualdad matemática, ¡ya que estamos comparando dos modelos diferentes!).
Cada nivel en el factor cylinder
es separado, y las líneas verticales representan los residuos o el error dentro del grupo: la distancia desde cada punto en la nube y la media de cada nivel (línea horizontal codificada por colores). El gradiente de color nos da una indicación de cuán significativos son los niveles en la validación del modelo: cuanto más agrupados estén los puntos de datos alrededor de su grupo significa, más probable es que el modelo ANOVA sea estadísticamente significativo. La línea negra horizontal alrededor de en todas las parcelas es la media de todos los factores. Los números en el eje son simplemente el número / identificador de marcador de posición para cada punto dentro de cada nivel, y no tienen otro propósito que separar los puntos a lo largo de la línea horizontal para permitir una visualización de trazado diferente a los diagramas de caja.20x
Y es a través de la suma de estos segmentos verticales que podemos calcular manualmente los residuos:
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)
El resultado: SumSq = 301.2626
y TSS - SumSq = 824.7846
. Comparar con:
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
Exactamente el mismo resultado que probar con un ANOVA el modelo lineal con solo el categórico cylinder
como regresor:
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
Lo que vemos, entonces, es que los residuos, la parte de la varianza total no explicada por el modelo, así como la varianza son las mismas, ya sea que llame un OLS del tipo lm(DV ~ factors)
o un ANOVA ( aov(DV ~ factors)
): cuando quitamos el modelo de variables continuas terminamos con un sistema idéntico. De manera similar, cuando evaluamos los modelos globalmente o como un ANOVA omnibus (no nivel por nivel), naturalmente obtenemos el mismo valor p F-statistic: 39.7 on 2 and 29 DF, p-value: 4.979e-09
.
Esto no implica que la prueba de niveles individuales produzca valores p idénticos. En el caso de OLS, podemos invocar summary(fit)
y obtener:
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 ***
Esto no es posible en ANOVA, que es más una prueba ómnibus. Para obtener estos tipos de evaluaciones de valor , necesitamos ejecutar una prueba de diferencia significativa honesta de Tukey, que intentará reducir la posibilidad de un error de tipo I como resultado de realizar múltiples comparaciones por pares (por lo tanto, " "), lo que resulta en un salida completamente diferente: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 última instancia, nada es más tranquilizador que echar un vistazo al motor debajo del capó, que no es otro que las matrices del modelo y las proyecciones en el espacio de la columna. En realidad, estos son bastante simples en el caso de un ANOVA:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢y1y2y3⋮⋮⋮.yn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢11⋮00⋮.0000⋮11⋮.0000⋮00⋮.11⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢μ1μ2μ3⎤⎦⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ε1ε2ε3⋮⋮⋮.εn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥(1)
Esta sería la matriz de modelo ANOVA de una vía con tres niveles (por ejemplo cyl 4
, cyl 6
, cyl 8
), que se resumen como , donde es la media en cada nivel o grupo: cuando Si se agrega el error o residual para la observación del grupo o nivel , obtenemos la observación real DV .yij=μi+ϵijμijiyij
Por otro lado, la matriz modelo para una regresión OLS es:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢y1y2y3y4⋮yn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢1111⋮1x12x22x32x42⋮xn2x13x23x33x43⋮xn3⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢β0β1β2⎤⎦⎥+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ε1ε2ε3ε4⋮εn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
Esta es de la forma con una sola intersección y dos pendientes ( y ) cada una para una variable continua diferente, digamos y .yi=β0+β1xi1+β2xi2+ϵiβ0β1β2weight
displacement
El truco ahora es ver cómo podemos crear diferentes intersecciones, como en el ejemplo inicial, lm(mpg ~ wt + as.factor(cyl), data = mtcars)
así que eliminemos la segunda pendiente y ceñámonos a la variable continua única original weight
(en otras palabras, una sola columna además de la columna de unidades en la matriz modelo; la intersección y la pendiente para , ). La columna de 's corresponderá por defecto a la intersección. Una vez más, su valor no es idéntico a la media de ANOVA dentro del grupo , una observación que no debería sorprender comparando la columna de en la matriz del modelo OLS (a continuación) con la primera columna deβ0weight
β11cyl 4
cyl 4
11's en la matriz modelo ANOVA que solo selecciona ejemplos con 4 cilindros. La intersección se desplazará a través de una codificación ficticia para explicar el efecto de y de la siguiente manera:(1),cyl 6
cyl 8
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢y1y2y3y4y5⋮yn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢11111⋮1x1x2x3x4x5⋮xn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥[β0β1]+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢11100⋮000011⋮1⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥[μ~2μ~3]+⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢ε1ε2ε3ε4ε5⋮εn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥
Ahora, cuando la tercera columna es , sistemáticamente la intersección porEl indica que, como en el caso de la "línea de base", la intercepción en el modelo OLS no es idéntica a la media grupal de los automóviles de 4 cilindros, pero lo refleja, las diferencias entre los niveles en el modelo OLS no son matemáticamente Las diferencias entre grupos en las medias: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)
Del mismo modo, cuando la cuarta columna es , se agregará un valor fijo a la intersección. La ecuación matricial, por lo tanto, será . Por lo tanto, ir con este modelo al modelo ANOVA es solo una cuestión de deshacerse de las variables continuas y comprender que la intercepción predeterminada en OLS refleja el primer nivel en ANOVA.1μ~3yi=β0+β1xi+μ~i+ϵi