Deixe-me colocar um pouco de cor na idéia de que o OLS com regressores categóricos ( codificados por modelos) é equivalente aos fatores da ANOVA. Nos dois casos, existem níveis (ou grupos no caso da ANOVA).
Na regressão OLS, é mais comum também ter variáveis contínuas nos regressores. Eles modificam logicamente o relacionamento no modelo de ajuste entre as variáveis categóricas e a variável dependente (CD). Mas não ao ponto de tornar o paralelo irreconhecível.
Com base no mtcars
conjunto de dados, podemos primeiro visualizar o modelo lm(mpg ~ wt + as.factor(cyl), data = mtcars)
como a inclinação determinada pela variável contínua wt
(peso) e as diferentes intercepções projetando o efeito da variável categórica cylinder
(quatro, seis ou oito cilindros). É esta última parte que forma um paralelo com uma ANOVA unidirecional.
Vamos vê-lo graficamente na subparcela à direita (as três subparcelas à esquerda estão incluídas para comparação lado a lado com o modelo ANOVA discutido imediatamente depois):
Cada mecanismo de cilindro é codificado por cores, e a distância entre as linhas ajustadas com diferentes interceptações e a nuvem de dados é equivalente à variação dentro do grupo em uma ANOVA. Observe que as interceptações no modelo OLS com uma variável contínua ( weight
) não são matematicamente iguais ao valor das diferentes médias dentro do grupo na ANOVA, devido ao efeito weight
e às diferentes matrizes do modelo (veja abaixo): a média mpg
para carros de 4 cilindros, por exemplo, é mean(mtcars$mpg[mtcars$cyl==4]) #[1] 26.66364
, ao passo que o OLS intercepção "linha de base" (reflectindo por convenção cyl==4
(menor para o maior numerais ordenação em R)) é marcadamente diferente: summary(fit)$coef[1] #[1] 33.99079
. A inclinação das linhas é o coeficiente para a variável contínua weight
.
Se você tentar suprimir o efeito de weight
endireitar mentalmente essas linhas e retorná-las à linha horizontal, você terminará com o gráfico ANOVA do modelo aov(mtcars$mpg ~ as.factor(mtcars$cyl))
nas três sub plotagens à esquerda. O weight
regressor agora está fora, mas a relação dos pontos para as diferentes interceptações é praticamente preservada - estamos simplesmente girando no sentido anti-horário e espalhando as plotagens anteriormente sobrepostas para cada nível diferente (novamente, apenas como um dispositivo visual para "ver" a conexão; não como uma igualdade matemática, pois estamos comparando dois modelos diferentes!).
cylinder
20x
E é através da soma desses segmentos verticais que podemos calcular manualmente os resíduos:
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)
O resultado: SumSq = 301.2626
e TSS - SumSq = 824.7846
. Comparado a:
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
Exatamente o mesmo resultado que testar com uma ANOVA o modelo linear com apenas o categórico cylinder
como regressor:
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
O que vemos, então, é que os resíduos - a parte da variação total não explicada pelo modelo - e a variação são os mesmos, independentemente de você chamar um OLS do tipo lm(DV ~ factors)
ou uma ANOVA ( aov(DV ~ factors)
): quando removemos o valor modelo de variáveis contínuas, acabamos com um sistema idêntico. Da mesma forma, quando avaliamos os modelos globalmente ou como uma ANOVA abrangente (não nível por nível), obtemos naturalmente o mesmo valor-p F-statistic: 39.7 on 2 and 29 DF, p-value: 4.979e-09
.
Isso não significa que o teste de níveis individuais produzirá valores p idênticos. No caso do OLS, podemos invocarsummary(fit)
e obter:
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 ***
p avaliações de valor , precisamos executar um teste de diferença significativa honesta de Tukey, que tentará reduzir a possibilidade de um erro do tipo I como resultado da realização de múltiplas comparações pareadas (daí, " p adjusted
"), resultando em uma saída completamente diferente:
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
Por fim, nada é mais tranquilizador do que dar uma olhada no motor sob o capô, que não é outro senão as matrizes do modelo e as projeções no espaço da coluna. Estes são realmente bastante simples no caso de uma 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
Por outro lado, a matriz do modelo para uma regressão OLS é:
⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢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.⋅~ indica que, como no caso da interceptação de "linha de base" no modelo OLS, não sendo idêntica à média do grupo dos carros de 4 cilindros, mas refletindo isso, as diferenças entre os níveis no modelo OLS não são matematicamente as diferenças de grupos em médias:
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