© Ricardo Solar/UFMG - compartilhamento e utilização não-comercial livres. Não reproduzir sem autorização >http://doi.org/10.5281/zenodo.7392285

Neste exercício, faremos um teste T e um teste F do início ao fim, manualmente. Naturalmente, o teste F é feito com um único comando no R, e faremos isso ao final. O objetivo desse exercício é entender cada um dos passos que compõem esse teste, entendendo de onde sai cada um dos valores.

1 Carregamento dos dados

Senhora <- 1:20

Resultado <- c(6,1,3,5.5,5,2.5,2,2,5,6,5.5,3,2,4,1,4,1,1,4,5)

Riqueza <- c("Com_carro",
       rep("Sem_carro", 2),
       rep("Com_carro", 2),
       rep("Sem_carro", 3),
       rep("Com_carro",3),
       rep("Sem_carro", 8),
       "Com_carro")

(meusdados <- data.frame(Senhora, Resultado, Riqueza, stringsAsFactors = T))

2 Teste T

A fórmula do teste T é bastante simples, sendo ela:

\[t=\frac{\bar{x_1}-\bar{x_2}}{\sqrt{ \frac{\sigma^2_1}{n_1} + \frac{\sigma^2_2}{n_2} }}\], onde:

\(t\) = valor do teste t

\(x_1\) = média da amostra 1

\(x_2\) = média da amostra2

\(\sigma^2_1\) = variância da amostra 1

\(\sigma^2_2\) = variância da amostra 2

\(n_1\) = tamanho da amostra 1

\(n_2\) = tamanho da amostra 2

Fazendo as contas:

amostra1 <- dplyr::filter(meusdados, Riqueza=="Com_carro")
amostra2 <- dplyr::filter(meusdados, Riqueza=="Sem_carro")

media1 <- mean(amostra1$Resultado)
media2 <- mean(amostra2$Resultado)

s1 <- var(amostra1$Resultado)
s2 <- var(amostra2$Resultado)

n1 <- nrow(amostra1)
n2 <- nrow(amostra2)

(valor_t <- (media1-media2)/sqrt((s1/n1)+(s2/n2)))
## [1] 8.361036
t.test(Resultado~Riqueza, data=meusdados)
## 
##  Welch Two Sample t-test
## 
## data:  Resultado by Riqueza
## t = 8.361, df = 16.894, p-value = 2.085e-07
## alternative hypothesis: true difference in means between group Com_carro and group Sem_carro is not equal to 0
## 95 percent confidence interval:
##  2.304232 3.860604
## sample estimates:
## mean in group Com_carro mean in group Sem_carro 
##                5.428571                2.346154

3 Teste F

Para fazermos o teste F, precisamos calcular:

  • média geral
  • média por tratamento
  • Soma de Quadrados Total
  • Soma de Quadrados do Resíduo
  • Soma de Quadrados do Tratamento
  • Graus de Liberdade do Resíduo
  • Graus de Liberdade do Tratamento
  • Quadrado Médio do Resíduo
  • Quadrado Médio do Tratamento

O valor de F que estamos buscando é: \(F=\frac{\frac{SQ_{trat}}{gl_{trat}}}{\frac{SQ_{res}}{gl_{res}}}\), onde:

\[SQ_{tot}=\sum_{1}^{n}{xi-\bar{x}} \]

&

\[SQ_{res}=\sum_{1}^{n_a}{(x_ai-\bar{x_a})} + \sum_{1}^{n_b}{(x_bi-\bar{x_b})} \]

Vamos aos cálculos:

3.1 Soma de quadrados total, ou seja, o quanto desvia da média geral

mediageral <- mean(meusdados$Resultado)
y <- meusdados$Resultado
(desviostot <- (y-mediageral))
##  [1]  2.575 -2.425 -0.425  2.075  1.575 -0.925 -1.425 -1.425  1.575  2.575
## [11]  2.075 -0.425 -1.425  0.575 -2.425  0.575 -2.425 -2.425  0.575  1.575

Graficamente, os desvios para a média geral são representados assim:

Agora calculamos os quadrados desse desvio:

(sqtot <- sum(desviostot^2))
## [1] 61.1375

Que graficamente aparecem assim:

Graficamente, essa é a representação da Soma de quadrados dos desvios.

3.2 Agora queremos saber a soma de quadrados do resíduio, ou seja, quanto ainda erram meus dados ainda que eu tenha um tratamento explicando?

xy2 <- dplyr::arrange(meusdados, Riqueza)
ypred <- with(meusdados, tapply(Resultado, Riqueza, mean))
(desviosres <- ifelse(xy2$Riqueza=="Com_carro", xy2$Resultado-ypred[1], xy2$Resultado-ypred[2]))
##  [1]  0.57142857  0.07142857 -0.42857143 -0.42857143  0.57142857  0.07142857
##  [7] -0.42857143 -1.34615385  0.65384615  0.15384615 -0.34615385 -0.34615385
## [13]  0.65384615 -0.34615385  1.65384615 -1.34615385  1.65384615 -1.34615385
## [19] -1.34615385  1.65384615
(sqerro <- sum(desviosres^2))
## [1] 17.90659

3.3 Agora podemos calcular a soma de quadrados do Tratamento, que nada mais é quanto o tratamento reduziu do erro total.

(sqefeito <- sqtot-sqerro)
## [1] 43.23091

3.4 Agora iremos calcular o Quadrado médio, que consiste em dividir os valores de SQtrat e SQres pelos respectivos graus de liberdade

#QMTrat
QMefeito <- sqefeito/1 ##Variancia entre

##QMres
QMerro <- sqerro/18 ##Variancia dentro

3.5 Prontinho, agora temos tudo pra calcular o valor de F

##F
(F_ratio <- QMefeito/QMerro)
## [1] 43.45641
##F-critico
qf(p = 0.95, df1 = 1, df2 = 18)
## [1] 4.413873

3.6 No R, essa é uma conta bem simples

Basta usarmos o comando aov, que significa analysis of variance.

aov(Resultado~Riqueza, data=meusdados)
Df Sum Sq Mean Sq F value Pr(>F)
Riqueza 1 43.23091 43.2309066 43.45641 3.4e-06
Residuals 18 17.90659 0.9948107 NA NA

Portanto, vemos que para ambos os testes (T e F), comparamos médias de dois grupos. No primeiro caso, o interesse era a comparação direta das médias, enquanto no Teste F, o objetivo é compreender quanto um tratamento reduz a variância não explicada (Resíduo). Fizemos tudo passo a passo, mas ao final vimos que os comandos t.test e aov fazem essas análises de maneira bem direta, facilitando bem nosso trabalho.

Nas próximas lições, começaremos com uma tabela pré-existente, ou seja, não precisaremos construí-la manualmente no R.