Análise de Variância (ANOVA)
É uma técnica estatística utilizada para comparar as médias de dois ou mais grupos, ou seja, se as médias de diferentes grupos são realmente diferentes ou se as diferenças observadas podem ser atribuídas ao acaso. É amplamente utilizada em diversas áreas, como ciências sociais, biologia, economia, entre outras, para testar hipóteses sobre a variação entre grupos de dados. Existem diferentes tipos de ANOVA, como ANOVA de um fator (um caminho), ANOVA de dois fatores (dois caminhos) e ANOVA de medidas repetidas. Neste material, revisaremos a ANOVA de um fator e a ANOVA aplica em modelos lineares.
Considere as seguintes notações: \[\begin{eqnarray} Y_{ij} &:& \mbox{ variável resposta para a $j$-ésima unidade do $i$-ésimo grupo}\\ \mu &:& \mbox{ média global (média para toda a população)}\\ \mu_i &:& \mbox{ média do $i$-ésimo grupo}\\ n_i &:& \mbox{ total de unidades no $i$-ésimo grupo} \end{eqnarray}\]
Para testarmos se as variâncias são iguais, podemos usar o teste de Bartlett ou o teste de Levene.
O teste de Bartlett é sensível em relação a hipótese de normalidade dos dados. Se rejeitarmos a hipótese de normalidade, é melhor utilizarmos o teste proposto por Levene. Porém, se a hipótese de normalidade não for violada, o teste proposto por Bartlett tem um comportamento melhor que o teste proposto por Levene. O teste F para variâncias somente pode ser usado quando há 2 populações, enquanto os outros 2 podem ser usados para \(K\) populações.
Neste material, a normalidade é um pressuposto comum a todos os testes de média. Sendo assim, usaremos o teste de Bartlett, o teste de Levene e o teste F (quando possível) para compararmos os resultados.
Suponha que temos 2 variáveis com distribuição normal e queremos investigar se as médias destas distribuições são iguais. Ou seja, \[\begin{eqnarray} Y_{1j} &\sim& N(\mu_1, \sigma_1^2)\\ Y_{2j} &\sim& N(\mu_2, \sigma_2^2). \end{eqnarray}\] e \[\begin{eqnarray} H_0: && \mu_1 = \mu_2 = \mu\\ H_1: && \mu_1 \neq \mu_2. \end{eqnarray}\]
Pressupostos:
Considerando \(H_0\) verdadeiro, temos que \[T = \frac{\bar{Y}_1 - \bar{Y}_2}{\sqrt{s_p^2\left(\frac{1}{n_1}+\frac{1}{n_2}\right)}} \sim t_{(n_1+n_2-2)},\] sendo \(n_1\) o total de observações do primeiro grupo, \(n_2\) o total de observações do segundo grupo, \(\bar{Y}_i = \frac{\sum_{j=1}^{n_i}{Y_{ij}}}{n_i}\), \(s_p^2 = \frac{(n_1-1)s_1^2 + (n_2-1)s_2^2}{n_1+n_2-2}\), \(s_i^2 = \frac{\sum_{j=1}^{n_i}{(Y_{ij} - \bar{Y_i})^2}}{n_i-1}\), \(i=1,2\).
Pressupostos:
Considerando \(H_0\) verdadeiro, temos que \[T = \frac{\bar{Y}_1 - \bar{Y}_2}{\sqrt{\frac{s_1^2}{n_1}+\frac{s_2^2}{n_2}}} \sim t_{\nu},\] sendo \(\nu = \frac{(A+B)^2}{\frac{A^2}{n_1-1} + \frac{B^2}{n_2-1}}\), \(A = \frac{s_1^2}{n_1}\) e \(B = \frac{s_2^2}{n_2}\).
Pressupostos:
Considerando \(H_0\) verdadeiro, temos que \[T = \frac{\bar{Y}_1 - \bar{Y}_2}{\sqrt{\frac{s_D^2}{n}}} \sim t_{(n-1)},\] sendo \(n = n_1 = n_2\) o total de observações pareadas, \(\bar{Y}_i = \frac{\sum_{j=1}^{n}{Y_{ij}}}{n}\), \(s_D^2 = \frac{\sum_{j=1}^{n}{(D_j - \bar{D})^2}}{n-1}\), \(D_j = Y_{1j} - Y_{2j}\) e \(\bar{D} = \frac{\sum_{j=1}^{n}{D_{j}}}{n}\).
Suponha que a variável resposta possa ser avaliada em \(K\) grupos e que para cada grupo tenha a seguinte distribuição: \[\begin{eqnarray} Y_{ij} &\stackrel{ind}{\sim}& N(\mu_i, \sigma^2), \quad i=1, \ldots, n_j, \quad j=1, \ldots, K, \end{eqnarray}\] e \(Y_{ij}\) independente de \(Y_{sj}\), para todo \(i \neq s\).
Supondo que há 2 grupos, temos que \(Y_{1j} \sim N(\mu_1, \sigma^2)\) e \(Y_{2j} \sim N(\mu_2, \sigma^2)\) queremos testar se o fator tem influência na variável resposta. Ou seja,
\[\begin{eqnarray} H_0: && \mu_1 = \mu_2 = \mu\\ H_1: && \mu_1 \neq \mu_2. \end{eqnarray}\]
Pressupostos realizados: Para cada grupo, supõe-se uma distribuição normal da seguinte forma: \[Y_{ij} = \mu_i + e_{ij}, \quad e_{ij} \stackrel{iid}{\sim} N(0,\sigma^2).\]
Note que estamos supondo:
Realizar o teste descrito acima, significa comparar os 2 modelos: \(Y_{1j} = \mu_1 + e_{1j}\) e \(Y_{2j} = \mu_2 + e_{2j}\).
Supondo \(H_1\) verdadeiro, temos que \(Y_{ij} = \mu_i + e_{ij}\).
Logo, o estimador de \(\mu_i\) pode ser obtido pelo método dos mínimos quadrados, ou seja, minimizando a soma dos erros quadráticos
\[\sum_{i=1}^2{\sum_{j=1}^{n_i}{e_{ij}^2}} = \sum_{i=1}^2{\sum_{j=1}^{n_i}{ (Y_{ij} - \mu_i)^2}}.\]
Portanto, temos que o estimador de \(\mu_i\) é \[\begin{eqnarray} \hat{\mu}_i &=& \bar{Y}_i = \frac{ \sum_{j=1}^{n_i}{Y_{ij}} }{n_i} \end{eqnarray}\]
Seja \(r_{ij}\) o resíduo do \(i\)-ésimo grupo da \(j\)-ésima unidade. Seja SQD a soma dos quadrados dentro dos grupos (também chamado de SQR), ou seja, a soma dos quadrados dos resíduos, quando \(H_1\) é verdadeiro. Logo, \[\begin{eqnarray} SQD = SQR = \sum_{i=1}^{2}{\sum_{j=1}^{n_i}{r_{ij}^2}} = \sum_{i=1}^2{\sum_{j=1}^{n_i}{(Y_{ij} - \bar{Y}_i)^2}} \end{eqnarray}\]
O estimador não viesado de \(\sigma^2\) é \[\begin{eqnarray} \hat{\sigma}^2 &=& S^2 = \frac{(n_1-1)S_1^2 + (n_2-1)S_2^2}{n_1+n_2-2} \quad \mbox{ sendo } S_i^2 = \frac{\sum_{j=1}^{n_i}{(Y_{ij}-\bar{Y}_i)^2}}{n_i-1} \end{eqnarray}\]
Portanto, \[\begin{eqnarray} SQD = SQR &=& (n_1-1) S_1^2 + (n_2-1) S_2^2 = (n-2) S^2 \end{eqnarray}\]
Note que \(\bar{Y}_i \sim N(\mu_i, \sigma^2/n_i)\). E, portanto, \(\frac{(\bar{Y}_i-\mu_i)\sqrt{n_i}}{S} \sim t_{(n-2)}\). Então, um intervalo de confiança para \(\mu_i\) bilateral com \(\gamma\)% de confiança é \[\left [ \bar{Y}_i - t_{1-\alpha/2} \frac{S}{\sqrt{n_i}} \;,\; \bar{Y}_i + t_{1-\alpha/2} \frac{S}{\sqrt{n_i}}\right]\] sendo \(\alpha = 1-\gamma\) o nível de significância e \(t_{1-\alpha/2}\) o quantil \(1-\alpha/2\) da distribuição t-Student com \(n-2\) graus de liberdade. E, portanto, \[\bar{Y}_1 - \bar{Y}_2 \sim N\left(\mu_1 - \mu_2, \frac{\sigma^2}{n_1} + \frac{\sigma^2}{n_2}\right).\] Sendo assim, \[\frac{\left( \bar{Y}_1 - \bar{Y}_2 \right) - \left( \mu_1 - \mu_2 \right)}{S\sqrt{\frac{1}{n_1} + \frac{1}{n_2}}} \sim t_{(n-2)}.\] Então, um intervalo de confiança para \(\mu_1 - \mu_2\) bilateral com \(\gamma\)% de confiança é \[\left [ \bar{Y}_1 - \bar{Y}_2 - t_{1-\alpha/2} S\sqrt{\frac{1}{n_1} + \frac{1}{n_2}} \;,\; \bar{Y}_1 - \bar{Y}_2 + t_{1-\alpha/2} S\sqrt{\frac{1}{n_1} + \frac{1}{n_2}}\right]\] Dessa forma, rejeitamos \(H_0\), com \(\alpha\)% de significância, quando o zero não estiver incluído no intervalo acima.
Supondo \(H_0\) verdadeiro, temos que \(Y_{ij} = \mu + e_{ij}\).
Logo, o estimador de \(\mu\) pode ser obtido pelo método dos mínimos quadrados, ou seja, minimizando a soma dos erros quadráticos
\[\sum_{i=1}^2{\sum_{j=1}^{n_i}{e_{ij}^2}} = \sum_{i=1}^2{\sum_{j=1}^{n_i}{ (Y_{ij} - \mu)^2}}.\]
Portanto, temos que o estimador de \(\mu\) é \[\begin{eqnarray} \hat{\mu} &=& \bar{Y} = \frac{\sum_{i=1}^2{\sum_{j=1}^{n_i}{Y_{ij}}}}{n} \end{eqnarray}\]
Seja \(r_{ij}\) o resíduo do \(i\)-ésimo grupo da \(j\)-ésima unidade. Seja SQT a soma dos quadrados totais, ou seja, a soma dos quadrados dos resíduos, quando \(H_0\) é verdadeiro. Logo, \[\begin{eqnarray} SQT = \sum_{i=1}^{2}{\sum_{j=1}^{n_i}{r_{ij}^2}} = \sum_{i=1}^2{\sum_{j=1}^{n_i}{(Y_{ij} - \bar{Y})^2}} \end{eqnarray}\]
O estimador não viesado de \(\sigma^2\) é \[\begin{eqnarray} \hat{\sigma}^2 &=& S_T^2 = \frac{1}{n-1}\sum_{i=1}^2{\sum_{j=1}^{n_i}{(Y_{ij}-\bar{Y})^2}} \end{eqnarray}\]
Portanto, \[\begin{eqnarray} SQT = (n-1) S_T^2 \end{eqnarray}\]
Seja \(SQE\) a soma dos quadrados entre os grupos. Logo, temos que \[\begin{eqnarray} SQT = SQD + SQE \end{eqnarray}\]
Sendo assim, temos que \[\begin{eqnarray} SQE = \sum_{i=1}^2{n_i(\bar{Y}_i - \bar{Y})^2}. \end{eqnarray}\] A soma acima representa a variabilidade entre as médias amostrais.
Seja \(R^2\) o , ou seja, a proporção da variação explicada pelo modelo. Então \[\begin{eqnarray} R^2 = \frac{SQE}{SQT}. \end{eqnarray}\]
Sob \(H_0\) verdadeiro, temos que \[\begin{eqnarray} T &=& \frac{\bar{Y}_1 - \bar{Y}_2}{S\sqrt{\frac{1}{n_1} + \frac{1}{n_2}}} \sim t_{(n_1 + n_2 - 2)}\\ T^2 &\sim& F_{(1, n_1+n_2-2)} \end{eqnarray}\] sendo \(t_{(\nu)}\) a distribuição t-Student com \(\nu\) graus de liberdade e \(F_{(\nu_1,\nu_2)}\) a distribuição F-Snedecor com \(\nu_1\) e \(\nu_2\) graus de liberdade.
Como \(\bar{Y} = \frac{n_1 \bar{Y}_1 + n_2 \bar{Y}_2}{n_1+n_2}\), temos que \[\begin{eqnarray} SQE &=& \frac{n_1n_2}{n_1+n_2}(\bar{Y}_1-\bar{Y}_2)^2 = \frac{(\bar{Y}_1-\bar{Y}_2)^2}{1/n_1 + 1/n_2} \end{eqnarray}\] Portanto \[\begin{eqnarray} T^2 &=& \frac{(\bar{Y}_1 - \bar{Y}_2)^2}{S^2(1/n_1 + 1/n_2)} = \frac{SQE}{S^2} = F \end{eqnarray}\] Rejeitamos \(H_0\) se \(F>c\) sendo \(c\) o valor crítico da distribuição F-Snedecor com \((1, n-2)\) graus de liberdade cuja probabilidade de uma variável aleatória com esta distribuição assumir um valor acima de \(c\) é \(\alpha\).
Essas informações são agrupadas numa tabela conhecida por ANOVA:
| Fontes de | Graus de | Soma dos | Média da soma | F |
|---|---|---|---|---|
| variação | liberdade | quadrados | dos quadrados | |
| Entre | 1 | SQE | MQE = \(\frac{SQE}{1}\) | F = \(\frac{MQE}{MQD}\) |
| Dentro | n-2 | SQD = SQR | MQD = \(\frac{SQD}{n-2}\) | |
| Total | n-1 | SQT | MQT = \(\frac{SQT}{n-1}\) |
Seja \(K\) o total de grupos ou fatores. Então \[\begin{eqnarray} Y_{ij} = \mu_i + e_{ij}, \quad i=1, \ldots,K, \quad j=1, \ldots, n_i, \quad n=\sum_{i=1}^{K}{n_i} \end{eqnarray}\]
Facilmente estendemos os resultados encontrados quando temos 2 subpopulações para mais subpopulações. Desta forma, temos que realizar o teste descrito acima, significa comparar \(K\) modelos: \(Y_{ij} = \mu_i + e_{ij}\), \(i=1, \ldots, K\). Sendo assim, temos que
\[\begin{eqnarray} SQE &=& \sum_{i=1}^{K}{n_i(\bar{Y}_i - \bar{Y})^2}\\ SQD &=& \sum_{i=1}^{K}{\sum_{j=1}^{n_i}{(Y_{ij}-\bar{Y}_i)^2}} = \sum_{i=1}^K{(n_i-1)S_i^2} = S^2 (n-K)\\ SQT &=& \sum_{i=1}^{K}{\sum_{j=1}^{n_i}{(Y_{ij}-\bar{Y})^2}} \\ F &=& \frac{MQE}{MQD} = \frac{SQE}{K-1}\frac{n-K}{SQD} = \frac{SQE}{(K-1)S^2} \end{eqnarray}\] sendo \(\bar{Y}_i\) a média amostral do \(i\)-ésimo grupo, \(S_i^2\) a variância amostral do \(i\)-ésimo grupo, \(S^2\) um estimador para a variância populacional quando \(H_1\) é verdadeiro e \(\bar{Y}\) a média amostral de toda a amostra.
Além disso, temos que a tabela da ANOVA é
| Fontes de | Graus de | Soma dos | Média da soma | F |
|---|---|---|---|---|
| variação | liberdade | quadrados | dos quadrados | |
| Entre | K-1 | SQE | MQE = \(\frac{SQE}{K-1}\) | F = \(\frac{MQE}{MQD}\) |
| Dentro | n-K | SQD = SQR | MQD = \(\frac{SQD}{n-K}\) | |
| Total | n-1 | SQT | MQT = \(\frac{SQT}{n-1}\) |
Rejeitamos \(H_0\) se \(F>c\) sendo \(c\) o valor crítico da distribuição F-Snedecor com \((K-1, n-K)\) graus de liberdade cuja probabilidade de uma variável aleatória com esta distribuição assumir um valor acima de \(c\) é \(\alpha\).
Exemplo: Suponha que o interesse esteja em avaliar a venda de um determinado produto em 2 estados diferentes (RJ e SP). Deseja-se investigar se o fator Estado influencia na venda. Dessa forma, a população é dividida em 2 grupos, sendo o primeiro composto pelas vendas do RJ e o segundo composto pelas vendas de SP. A variável resposta \(Y_{ij}\) corresponde a \(j\)-ésima venda do \(i\)-ésimo Estado, \(\mu_1\) a venda média do RJ e \(\mu_2\) a venda média de SP.
#Exemplo de Analise de Variancia
#comparando o lucro recebido pela venda de 1 produto em regioes diferentes
y1 = c(206.32,207.94,206.19,204.45,209.65,203.81,206.75,205.68,204.49,210.86)
y2 = c(217.08,221.43,218.04,224.13,211.82,213.9,221.28,229.43,213.54,214.51)
par(mfrow=c(1,3))
plot(y1,y2, bty="n", lwd=2)
plot(y1-y2, bty="n", lwd=2, xlab="indice")
hist(c(y1, y2), freq=F, ylab="densidade", main="Histograma")
#empilhando os dados
Estados = c("RJ","SP")
fator = as.factor( rep(Estados,c(length(y1), length(y2))) )
#fator = as.factor( rep(c(1,2),c(length(y1), length(y2))) )
z = c(y1,y2)
data.frame(fator, z)
## fator z
## 1 RJ 206.32
## 2 RJ 207.94
## 3 RJ 206.19
## 4 RJ 204.45
## 5 RJ 209.65
## 6 RJ 203.81
## 7 RJ 206.75
## 8 RJ 205.68
## 9 RJ 204.49
## 10 RJ 210.86
## 11 SP 217.08
## 12 SP 221.43
## 13 SP 218.04
## 14 SP 224.13
## 15 SP 211.82
## 16 SP 213.90
## 17 SP 221.28
## 18 SP 229.43
## 19 SP 213.54
## 20 SP 214.51
#calculando medidas para cada grupo
K = 2
ybarra = NULL
ni = NULL
s2i = NULL
for(i in 1:K)
{
ybarra[i] = mean(z[fator==Estados[i]])
ni[i] = length(z[fator==Estados[i]])
s2i[i] = var(z[fator==Estados[i]])
}
#definindo nivel de significancia
alpha = 0.05
#testando independencia
teste = chisq.test(y1, y2)
teste
##
## Pearson's Chi-squared test
##
## data: y1 and y2
## X-squared = 90, df = 81, p-value = 0.2313
if(teste$p.value<=alpha){print("rejeito independencia")}else{print("nao rejeito independencia")}
## [1] "nao rejeito independencia"
#testando normalidade pelo Shapiro
s = 0
K = 2 #total de modelos diferentes
for(i in 1:K)
{
teste = shapiro.test(z[fator==Estados[i]])
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando normalidade pelo Kolmogorov-Smirnov
s=0
for(i in 1:K)
{
teste = ks.test(z[fator==Estados[i]],"pnorm",mean(z[fator==Estados[i]]),sd(z[fator==Estados[i]]))
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando homocedasticidade
teste = bartlett.test(z,fator)
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "problema com a homocedasticidade"
#testando homocedasticidade
library(lawstat)
teste = levene.test(z, fator, location = c("median"))
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "problema com a homocedasticidade"
teste = var.test(y1,y2,conf.level=1-alpha)
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "problema com a homocedasticidade"
#Caso considerassemos as variancias diferentes
A = s2i[1]/ni[1]
B = s2i[2]/ni[2]
EstatT = (ybarra[1] - ybarra[2])/sqrt(A+B)
nu = (A+B)^2/(A^2/(ni[1]-1) + B^2/(ni[2]-1))
teste = t.test(y1, y2, paired = FALSE, var.equal = FALSE, conf.level=1-alpha)
c(nu, teste$parameter[1])
## df
## 11.99181 11.99181
c(EstatT, teste$statistic)
## t
## -6.280445 -6.280445
c(2*pt(EstatT, nu), teste$p.value)
## [1] 4.077261e-05 4.077261e-05
if(teste$p.value<=alpha){print("Rejeito a igualdade de medias")}else{print("Nao rejeito a igualdade de medias")}
## [1] "Rejeito a igualdade de medias"
Como as variâncias são diferentes, não posso realizar o teste da ANOVA.
#definindo nivel de significancia
alpha = 0.01
#testando independencia
teste = chisq.test(y1, y2)
teste
##
## Pearson's Chi-squared test
##
## data: y1 and y2
## X-squared = 90, df = 81, p-value = 0.2313
if(teste$p.value<=alpha){print("rejeito independencia")} else{print("nao rejeito independencia")}
## [1] "nao rejeito independencia"
#testando normalidade pelo Shapiro
s = 0
K = 2 #total de modelos diferentes
for(i in 1:K)
{
teste = shapiro.test(z[fator==Estados[i]])
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando normalidade pelo Kolmogorov-Smirnov
s=0
for(i in 1:K)
{
teste = ks.test(z[fator==Estados[i]],"pnorm",mean(z[fator==Estados[i]]),sd(z[fator==Estados[i]]))
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando homocedasticidade
teste = bartlett.test(z,fator)
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "homocedasticidade ok"
#testando homocedasticidade
library(lawstat)
teste = levene.test(z, fator, location = c("median"))
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "homocedasticidade ok"
teste = var.test(y1,y2,conf.level=1-alpha)
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "homocedasticidade ok"
#Teste t para amostras independentes com variancias iguais
sp2 = ((ni[1]-1)*s2i[1] + (ni[2]-1)*s2i[2])/(ni[1]+ni[2]-2)
EstatT = (ybarra[1] - ybarra[2])/sqrt(sp2*(1/ni[1]+1/ni[2]))
EstatT
## [1] -6.280445
testeT = t.test(y1, y2, paired = FALSE, var.equal = TRUE)
c(ni[1]+ni[2]-2, testeT$parameter[1])
## df
## 18 18
c(EstatT, testeT$statistic)
## t
## -6.280445 -6.280445
c(2*pt(EstatT, ni[1]+ni[2]-2), testeT$p.value)
## [1] 6.378389e-06 6.378389e-06
if(testeT$p.value<=alpha){print("Rejeito a igualdade de medias")}else{print("Nao rejeito a igualdade de medias")}
## [1] "Rejeito a igualdade de medias"
#ANOVA (considerando variancias iguais)
tabela = anova(lm(z~fator)) #forma 1
tabela
## Analysis of Variance Table
##
## Response: z
## Df Sum Sq Mean Sq F value Pr(>F)
## fator 1 708.29 708.29 39.444 6.378e-06 ***
## Residuals 18 323.22 17.96
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
res.anova=aov(z~fator)
res.anova
## Call:
## aov(formula = z ~ fator)
##
## Terms:
## fator Residuals
## Sum of Squares 708.2880 323.2225
## Deg. of Freedom 1 18
##
## Residual standard error: 4.237547
## Estimated effects may be unbalanced
summary(res.anova) #forma 2
## Df Sum Sq Mean Sq F value Pr(>F)
## fator 1 708.3 708.3 39.44 6.38e-06 ***
## Residuals 18 323.2 18.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Calculando os dados da tabela da ANOVA sem usar a
#funcao do R
n = sum(ni)
yt = mean(z)
SQT = sum((z-yt)^2)
SQE = sum(ni*(ybarra-yt)^2)
yb2 = rep(ybarra,ni)
SQD = sum((z-yb2)^2)
c(SQT, SQD + SQE)
## [1] 1031.511 1031.510
MQE = SQE/(K-1)
MQD = SQD/(n-K)
MQT = SQT/(n-1) #ST^2
s2 = ((ni[1]-1)*s2i[1] + (ni[2]-1)*s2i[2])/(ni[1]+ni[2]-K)
c(SQD, (n-K)*s2)
## [1] 323.2225 323.2225
EstatF = MQE/MQD
c(SQE/s2, EstatF)
## [1] 39.44399 39.44399
rbind(c(K-1, round(SQE,2), round(MQE,2), round(EstatF,3), 1-pf(EstatF, K-1, n-K)), c(n-K, round(SQD,2), round(MQD,2), NA, NA))
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 708.29 708.29 39.444 6.378389e-06
## [2,] 18 323.22 17.96 NA NA
tabela
## Analysis of Variance Table
##
## Response: z
## Df Sum Sq Mean Sq F value Pr(>F)
## fator 1 708.29 708.29 39.444 6.378e-06 ***
## Residuals 18 323.22 17.96
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
if(tabela$`Pr(>F)`[1] <= alpha){print("Rejeito a hipótese de igualdade de médias" )}else{print("Não rejeito a hipótese de igualdade de médias")}
## [1] "Rejeito a hipótese de igualdade de médias"
#comparando a estatistica de teste da ANOVA com a do teste T
c(testeT$statistic^2, tabela$`F value`[1])
## t
## 39.44399 39.44399
#comparando o p-valor da ANOVA com o do teste T
c(testeT$p.value, tabela$`Pr(>F)`[1])
## [1] 6.378389e-06 6.378389e-06
Exemplo: Suponha que o interesse esteja em avaliar a venda de um determinado produto em 3 estados diferentes (RJ, SP e MG). Deseja-se investigar se o fator Estado influencia na venda. Dessa forma, a população é dividida em 3 grupos, sendo o primeiro composto pelas vendas do RJ, o segundo composto pelas vendas de SP e o terceiro composto pelas vendas de MG. A variável resposta \(Y_{ij}\) corresponde a \(j\)-ésima venda do \(i\)-ésimo Estado, \(\mu_1\) a venda média do RJ, \(\mu_2\) a venda média de SP e \(\mu_3\) a venda média de MG.
y1 = c(209.9, 209.5, 209.6, 208.8, 209.5, 210.0, 211.7, 211.2, 210.3, 209.7)
y2 = c(250.4 , 249.6 , 247.9 , 249.5 , 250.0 , 250.0 , 249.5 , 249.3 , 251.8, 249.8 , 249.2, 249.0 , 250.4 , 250.6 , 250.4)
y3 = c(298.3 , 299.6 , 299.4 , 298.8 , 299.3 , 300.9 , 299.4 , 300.1 , 299.7, 301.4 , 301.4, 299.9 , 299.9 , 299.9, 299.8, 300.2 , 299.9 , 299.8 , 300.2, 301.7)
y = c(y1, y2, y3)
#y
fator = factor(rep(1:3,c(10,15,20)))
hist(y, freq=F, ylab="densidade", main="Histograma")
#empilhando os dados
z = c(y1,y2, y3)
#cbind(fator, z)
#testando normalidade pelo Shapiro
alpha = 0.05
s = 0
K = 3 #total de modelos diferentes
for(i in 1:K)
{
teste = shapiro.test(z[fator==i])
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando normalidade pelo Kolmogorov-Smirnov
s=0
for(i in 1:K)
{
teste = ks.test(z[fator==i],"pnorm",mean(z[fator==i]),sd(z[fator==i]))
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando homocedasticidade
teste = bartlett.test(z,fator)
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "homocedasticidade ok"
#testando homocedasticidade
library(lawstat)
teste = levene.test(z, fator, location = c("median"))
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "homocedasticidade ok"
tabela = anova(lm(z~fator))
res.anova=aov(z~fator)
res.anova
## Call:
## aov(formula = z ~ fator)
##
## Terms:
## fator Residuals
## Sum of Squares 58018.96 31.10
## Deg. of Freedom 2 42
##
## Residual standard error: 0.8604724
## Estimated effects may be unbalanced
summary(res.anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## fator 2 58019 29009 39180 <2e-16 ***
## Residuals 42 31 1
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Calculando os dados da tabela da ANOVA sem usar a
#funcao do R
ybarra = NULL
ni = NULL
s2i = NULL
for(i in 1:K)
{
ybarra[i] = mean(z[fator==i])
ni[i] = length(z[fator==i])
s2i[i] = var(z[fator==i])
}
n = sum(ni)
yt = mean(z)
SQT = sum((z-yt)^2)
SQE = sum(ni*(ybarra-yt)^2)
yb2 = rep(ybarra,ni)
SQD = sum((z-yb2)^2)
c(SQT, SQD + SQE)
## [1] 58050.05 58050.05
MQE = SQE/(K-1)
MQD = SQD/(n-K)
MQT = SQT/(n-1) #ST^2
s2 = ((ni[1]-1)*s2i[1] + (ni[2]-1)*s2i[2] + (ni[3]-1)*s2i[3])/(ni[1]+ni[2]+ni[3]-K)
c(SQD, (n-K)*s2)
## [1] 31.09733 31.09733
EstatF = MQE/MQD
c(SQE/(s2*(K-1)), EstatF)
## [1] 39180.15 39180.15
rbind(c(K-1, round(SQE,2), round(MQE,2), round(EstatF,3), 1-pf(EstatF, K-1, n-K)), c(n-K, round(SQD,2), round(MQD,2), NA, NA))
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 58018.96 29009.48 39180.15 0
## [2,] 42 31.10 0.74 NA NA
tabela
## Analysis of Variance Table
##
## Response: z
## Df Sum Sq Mean Sq F value Pr(>F)
## fator 2 58019 29009.5 39180 < 2.2e-16 ***
## Residuals 42 31 0.7
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
if(tabela$`Pr(>F)`[1] <= alpha){print("Rejeito a hipótese de igualdade de médias" )}else{print("Não rejeito a hipótese de igualdade de médias")}
## [1] "Rejeito a hipótese de igualdade de médias"
#Exemplo de Analise de Variancia
y1 = round(rnorm(10, 200, sqrt(1)),1)
y2 = round(rnorm(15, 200, sqrt(1)),1)
y3 = round(rnorm(20, 200, sqrt(1)),1)
y = c(y1, y2, y3)
#y
fator = factor(rep(1:3,c(10,15,20)))
hist(y, freq=F, ylab="densidade", main="Histograma")
#empilhando os dados
z = c(y1,y2, y3)
#cbind(fator, z)
#testando normalidade pelo Shapiro
alpha = 0.05
s = 0
K = 3 #total de modelos diferentes
for(i in 1:K)
{
teste = shapiro.test(z[fator==i])
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando normalidade pelo Kolmogorov-Smirnov
s=0
for(i in 1:K)
{
teste = ks.test(z[fator==i],"pnorm",mean(z[fator==i]),sd(z[fator==i]))
if(teste$p.value<=alpha){s=s+1}
}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando homocedasticidade
teste = bartlett.test(z,fator)
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "homocedasticidade ok"
#testando homocedasticidade
library(lawstat)
teste = levene.test(z, fator, location = c("median"))
if(teste$p.value>alpha){print("homocedasticidade ok")}else{print("problema com a homocedasticidade")}
## [1] "homocedasticidade ok"
tabela = anova(lm(z~fator))
res.anova=aov(z~fator)
res.anova
## Call:
## aov(formula = z ~ fator)
##
## Terms:
## fator Residuals
## Sum of Squares 2.34817 48.42383
## Deg. of Freedom 2 42
##
## Residual standard error: 1.073754
## Estimated effects may be unbalanced
summary(res.anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## fator 2 2.35 1.174 1.018 0.37
## Residuals 42 48.42 1.153
#Calculando os dados da tabela da ANOVA sem usar a
#funcao do R
ybarra = NULL
ni = NULL
s2i = NULL
for(i in 1:K)
{
ybarra[i] = mean(z[fator==i])
ni[i] = length(z[fator==i])
s2i[i] = var(z[fator==i])
}
n = sum(ni)
yt = mean(z)
SQT = sum((z-yt)^2)
SQE = sum(ni*(ybarra-yt)^2)
yb2 = rep(ybarra,ni)
SQD = sum((z-yb2)^2)
c(SQT, SQD + SQE)
## [1] 50.772 50.772
MQE = SQE/(K-1)
MQD = SQD/(n-K)
MQT = SQT/(n-1) #ST^2
s2 = ((ni[1]-1)*s2i[1] + (ni[2]-1)*s2i[2] + (ni[3]-1)*s2i[3])/(ni[1]+ni[2]+ni[3]-K)
c(SQD, (n-K)*s2)
## [1] 48.42383 48.42383
EstatF = MQE/MQD
c(SQE/(s2*(K-1)), EstatF)
## [1] 1.018331 1.018331
rbind(c(K-1, round(SQE,2), round(MQE,2), round(EstatF,3), 1-pf(EstatF, K-1, n-K)), c(n-K, round(SQD,2), round(MQD,2), NA, NA))
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2 2.35 1.17 1.018 0.3699413
## [2,] 42 48.42 1.15 NA NA
tabela
## Analysis of Variance Table
##
## Response: z
## Df Sum Sq Mean Sq F value Pr(>F)
## fator 2 2.348 1.1741 1.0183 0.3699
## Residuals 42 48.424 1.1529
if(tabela$`Pr(>F)`[1] <= alpha){print("Rejeito a hipótese de igualdade de médias" )}else{print("Não rejeito a hipótese de igualdade de médias")}
## [1] "Não rejeito a hipótese de igualdade de médias"
Seja \(Y_i \stackrel{indep}{\sim} N(\boldsymbol{x}_i^T\boldsymbol{\beta}, \sigma^2)\), para \(i=1, \ldots, n\), \(\boldsymbol{x}_i^T = (x_{i,0}, \ldots, x_{i,p-1})\) e \(\boldsymbol{\beta} = (\beta_0, \ldots, \beta_{p-1})^T\). Podemos estimar os parâmetros desconhecidos \((\boldsymbol{\beta}, \sigma^2)\) através dos seguintes estimadores não viesados:
\[\begin{eqnarray} \boldsymbol{\hat{\beta}} &=& \left(\boldsymbol{x}^T\boldsymbol{x}\right)^{-1}\boldsymbol{x}^T\boldsymbol{Y}\\ \hat{\sigma}^2 &=& \frac{(\boldsymbol{Y}-\boldsymbol{x}\boldsymbol{\beta})^T(\boldsymbol{Y}-\boldsymbol{x}\boldsymbol{\beta})}{n-p}. \end{eqnarray}\]
Seja \(Y_i \stackrel{indep}{\sim} N(\beta_0 + \beta_1 x_i, \sigma^2), \; i=1, \ldots, n\). Tem-se que \[\begin{eqnarray} S_{xy} &=& \sum_{i=1}^n{(x_i-\bar{x})(Y_i-\bar{Y})}\\ S_{xx} &=& \sum_{i=1}^n{(x_i-\bar{x})^2}\\ \hat{\beta}_0 &=& \bar{Y}-\hat{\beta}_1\bar{x}\\ \hat{\beta}_1 &=& \frac{S_{xy}}{S_{xx}}\\ \hat{\sigma}^2 &=& \frac{\sum_{i=1}^n{(Y_i-\hat{\beta}_0-\hat{\beta}_1 x_i)^2}}{n-2} = \frac{\sum_{i=1}^n{\hat{e}_i^2}}{n-2} = \frac{SQR}{n-2} \end{eqnarray}\] sendo \(\bar{Y}=\frac{\sum_{i=1}^n{Y_i}}{n}\) e \(\bar{x}=\frac{\sum_{i=1}^n{x_i}}{n}\).
| Fontes de | Graus de | Soma dos | Média da soma | F |
|---|---|---|---|---|
| variação | liberdade | quadrados | dos quadrados | |
| Regressão | 1 | SQReg = \(\frac{S^2_{xy}}{S_{xx}}\) | MQReg = \(\frac{SQReg}{1}\) | \(F_{MRLS} = \frac{MQReg}{MQR}\) |
| Residual | n-2 | SQR=\(\sum{\hat{e}_i^2}\) | MQR = \(\frac{SQR}{n-2}\) | |
| Total | n-1 | SQT=\(\sum(Y_i-\bar{Y})^2\) | MQT = \(\frac{SQT}{n-1}\) |
\(F_{MRLS} = \frac{MQReg}{MQR} \sim F(1, n-2)\).
#MRLS - gerando os dados
n = 1000
xi = rnorm(n)
x = cbind(rep(1,n), xi)
beta = c(10,1)
sigma2 = 1
y = rnorm(n, x %*% beta, sqrt(sigma2))
#analisando graficamente os dados gerados
par(mfrow=c(1,2))
hist(y, freq=F, ylab="densidade", main="Histograma")
plot(xi, y, lwd=2, bty="n", xlab="x")
lines(xi, x %*% beta, col="red", lwd=2)
#testando normalidade pelo Shapiro
alpha = 0.05
s = 0
teste = shapiro.test(y)
if(teste$p.value<=alpha){s=s+1}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#testando normalidade pelo Kolmogorov-Smirnov
s=0
teste = ks.test(y,"pnorm",mean(y),sd(y))
if(teste$p.value<=alpha){s=s+1}
if(s==0){print("normalidade ok")} else{print("problema com a normalidade")}
## [1] "normalidade ok"
#supondo beta0, beta1 e sigma2 desconhecidos
#ajustando um MRLS
ajuste = lm(y~xi)
tabela = anova(ajuste)
res.anova=aov(y~xi)
res.anova
## Call:
## aov(formula = y ~ xi)
##
## Terms:
## xi Residuals
## Sum of Squares 993.7187 980.1347
## Deg. of Freedom 1 998
##
## Residual standard error: 0.991009
## Estimated effects may be unbalanced
summary(res.anova)
## Df Sum Sq Mean Sq F value Pr(>F)
## xi 1 993.7 993.7 1012 <2e-16 ***
## Residuals 998 980.1 1.0
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
tabela
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## xi 1 993.72 993.72 1011.8 < 2.2e-16 ***
## Residuals 998 980.13 0.98
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#Calculando os dados da tabela da ANOVA sem usar a
#funcao do R
Sxy = sum((xi-mean(xi))*(y-mean(y)))
Sxx = sum((xi-mean(xi))^2)
beta1chapeu = Sxy/Sxx
beta0chapeu = mean(y)-beta1chapeu*mean(xi)
SQR = sum((y-beta0chapeu-beta1chapeu*xi)^2)
MQR = SQR/(n-2)
sigma2chapeu = MQR
SQReg = Sxy^2/Sxx
MQReg = SQReg/1
SQT = sum((y-mean(y))^2)
MQT = SQT/(n-1)
F_MRLS = MQReg/MQR
round(rbind(c(1, SQReg, MQReg, F_MRLS, 1-pf(F_MRLS, 1, n-2)), c(n-2, SQR, MQR, NA, NA)),2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 993.72 993.72 1011.83 0
## [2,] 998 980.13 0.98 NA NA
tabela
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## xi 1 993.72 993.72 1011.8 < 2.2e-16 ***
## Residuals 998 980.13 0.98
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
round(c(beta0chapeu, beta[1]),3)
## [1] 9.988 10.000
round(c(beta1chapeu, beta[2]),3)
## [1] 0.99 1.00
round(c(sigma2chapeu, sigma2),3)
## [1] 0.982 1.000
Podemos comparar os seguintes modelos:
\[\begin{eqnarray} H_0: \quad & Y_i &\stackrel{indep.}{\sim} N(\boldsymbol{x}_{M0} \boldsymbol{\beta}_{M0}, \sigma^2_{M0})\\ H_1: \quad & Y_i &\stackrel{indep.}{\sim} N(\boldsymbol{x}_{M1} \boldsymbol{\beta}_{M1}, \sigma^2_{M1}), \end{eqnarray}\] sendo \(q\) a dimensão de \(\boldsymbol{\beta}_{M0}\) e \(p\) a dimensão de \(\boldsymbol{\beta}_{M1}\), com \(q < p\).
Dessa forma, temos que a tabela de análise de variância é:
| Fontes de | Graus de | Soma dos | Média da | F |
|---|---|---|---|---|
| variação | liberdade | quadrados | soma dos | |
| quadrados | ||||
| Modelo com \(\boldsymbol{\beta}_0\) | q | \(\boldsymbol{\beta_{M0}}^T \boldsymbol{x_{M0}}^T \boldsymbol{y}\) | ||
| Melhoria devido ao modelo M1 | p-q | \(SQReg = \boldsymbol{\beta_{M1}}^T\boldsymbol{x_{M1}}^T\boldsymbol{y} - \boldsymbol{\beta_{M0}}^T \boldsymbol{x_{M0}}^T \boldsymbol{y}\) | \(MQReg = \frac{SQReg}{p-q}\) | \(F_{MRL} = \frac{MQReg}{MQR}\) |
| Residual | n-p | \(SQR = \boldsymbol{Y}^T\boldsymbol{Y} - \boldsymbol{\beta_{M1}}^T\boldsymbol{x_{M1}}^T\boldsymbol{y}\) | \(MQR = \frac{SQR}{n-p}\) |
\(F_{MRL} = \frac{D_0-D_1}{p-q} \frac{n-p}{D_1} = \frac{MQReg}{MQR} \sim F(p-q, n-p)\)
#modelo com somente intercepto
q = 1 #quantidade de parametros
x_M0 = rep(1,n)
betachapeu_M0 = solve(t(x_M0) %*% x_M0) %*% t(x_M0) %*% y
sigma2chapeu_M0 = t(y-x_M0%*%betachapeu_M0) %*% (y-x_M0%*%betachapeu_M0) / (n-q)
SQ0 = betachapeu_M0*t(x_M0) %*% y
SQ0
## [,1]
## [1,] 99709.96
#modelo com intercepto + coef. linear
p = 2 #quantidade de parametros
betachapeu_M1 = solve(t(x) %*% x) %*% t(x) %*% y
rbind(c(beta0chapeu, beta1chapeu), t(betachapeu_M1))
## xi
## [1,] 9.988246 0.9898746
## [2,] 9.988246 0.9898746
sigma2chapeu_M1 = t(y-x%*%betachapeu_M1) %*% (y-x%*%betachapeu_M1) / (n-p)
c(sigma2chapeu_M1, sigma2chapeu)
## [1] 0.9820989 0.9820989
SQReg2 = t(betachapeu_M1) %*% t(x) %*% y - betachapeu_M0*t(x_M0)%*% y
c(SQReg2, SQReg)
## [1] 993.7187 993.7187
MQReg2 = SQReg2 / (p-q)
c(MQReg2, MQReg)
## [1] 993.7187 993.7187
SQR2 = t(y)%*%y - t(betachapeu_M1) %*% t(x) %*% y
c(SQR2, SQR)
## [1] 980.1347 980.1347
MQR2 = SQR2/(n-p)
c(MQR2, MQR)
## [1] 0.9820989 0.9820989
SQT2 = t(y)%*%y
SQT2
## [,1]
## [1,] 101683.8
F_MRL = MQReg2/MQR2
c(F_MRL, F_MRLS)
## [1] 1011.832 1011.832
#c(q, SQ0, NA, NA, NA)
rbind(c(p-q, SQReg2, MQReg2, F_MRL, 1-pf(F_MRL, p-q, n-p)),
c(n-p, SQR2, MQR2, NA, NA))
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 993.7187 993.7186760 1011.832 0
## [2,] 998 980.1347 0.9820989 NA NA
tabela
## Analysis of Variance Table
##
## Response: y
## Df Sum Sq Mean Sq F value Pr(>F)
## xi 1 993.72 993.72 1011.8 < 2.2e-16 ***
## Residuals 998 980.13 0.98
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
#MRLS - gerando os dados
n = 1000
x1 = rnorm(n)
x2 = rbeta(n,2,3)
x2 = (x2-mean(x2))/sd(x2)
x = cbind(rep(1,n), x1, x2)
beta = c(0.5, 1, -2)
sigma2 = 0.05
y = rnorm(n, x %*% beta, sqrt(sigma2))
#analisando graficamente os dados gerados
par(mfrow=c(2,2))
hist(y, freq=F, ylab="densidade", main="Histograma")
plot(x1, y, lwd=2, bty="n", xlab="x")
points(x1, x %*% beta, col="red", lwd=2)
plot(x2, y-x1*beta[2], lwd=2, bty="n", xlab="x")
points(x2, x %*% beta, col="red", lwd=2)
#modelo com intercepto + uma covariavel apenas
q = 2 #quantidade de parametros
x_M0 = cbind(rep(1,n), x1)
betachapeu_M0 = solve(t(x_M0) %*% x_M0) %*% t(x_M0) %*% y
sigma2chapeu_M0 = t(y-x_M0%*%betachapeu_M0) %*% (y-x_M0%*%betachapeu_M0) / (n-q)
SQ0 = t(betachapeu_M0) %*% t(x_M0) %*% y
#modelo com intercepto + 2 covariaveis
p = 3 #quantidade de parametros
x = cbind(rep(1,n), x1, x2)
betachapeu_M1 = solve(t(x) %*% x) %*% t(x) %*% y
rbind(t(betachapeu_M1), beta)
## x1 x2
## 0.4988824 0.9980422 -1.994341
## beta 0.5000000 1.0000000 -2.000000
sigma2chapeu_M1 = t(y-x%*%betachapeu_M1) %*% (y-x%*%betachapeu_M1) / (n-p)
c(sigma2chapeu_M1, sigma2)
## [1] 0.05290923 0.05000000
SQReg = t(betachapeu_M1) %*% t(x) %*% y - t(betachapeu_M0) %*% t(x_M0)%*% y
MQReg = SQReg / (p-q)
SQR = t(y)%*%y - t(betachapeu_M1) %*% t(x) %*% y
MQR = SQR/(n-p)
F_MRL = MQR/MQReg
rbind(c(p-q, SQR, MQR, F_MRL, 1-pf(F_MRL, p-q, n-p)),
c(n-p, SQReg, MQReg, NA, NA))
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 52.7505 5.290923e-02 1.334769e-05 0.9970857
## [2,] 997 3963.9248 3.963925e+03 NA NA