Para que o R saiba que as variáveis sexo e idade deverão ser consideradas como fatores, é preciso declará-las como fatores:
tab15_1<-data.frame(
individuo=1:20,
tempo_Y=c(96,92,106,100,98,104,110,101,116,106,109,100,112,105,118,108,113,112,127,117),
sexo_W=factor(c("H","M","H","M","M","H","H","M","M","H","H","M","M","M","H","H","M","M","H","H")),
idade_X=factor(c(20,20,20,20,25,25,25,25,30,30,30,30,35,35,35,35,40,40,40,40)),
acuidade_Z=c(90,100,80,90,100,90,80,90,70,90,90,80,90,80,70,90,90,90,60,80))| individuo | tempo_Y | sexo_W | idade_X | acuidade_Z |
|---|---|---|---|---|
| 1 | 96 | H | 20 | 90 |
| 2 | 92 | M | 20 | 100 |
| 3 | 106 | H | 20 | 80 |
| 4 | 100 | M | 20 | 90 |
| 5 | 98 | M | 25 | 100 |
| 6 | 104 | H | 25 | 90 |
| 7 | 110 | H | 25 | 80 |
| 8 | 101 | M | 25 | 90 |
| 9 | 116 | M | 30 | 70 |
| 10 | 106 | H | 30 | 90 |
| 11 | 109 | H | 30 | 90 |
| 12 | 100 | M | 30 | 80 |
| 13 | 112 | M | 35 | 90 |
| 14 | 105 | M | 35 | 80 |
| 15 | 118 | H | 35 | 70 |
| 16 | 108 | H | 35 | 90 |
| 17 | 113 | M | 40 | 90 |
| 18 | 112 | M | 40 | 90 |
| 19 | 127 | H | 40 | 60 |
| 20 | 117 | H | 40 | 80 |
Assim, quando acessamos cada uma delas, vemos que há a identificação dos níveis dos fatores de cada uma delas:
attach(tab15_1)
sexo_W## [1] H M H M M H H M M H H M M M H H M M H H
## Levels: H M
idade_X## [1] 20 20 20 20 25 25 25 25 30 30 30 30 35 35 35 35 40 40 40 40
## Levels: 20 25 30 35 40
Se quisermos calcular as estatísticas descritivas para cada subgrupo, masculino e feminino, podemos utilizar os subvetores de acordo com a variável sexo:
# Estatísticas descritivas para o grupo dos homens:
summary2(tempo_Y[sexo_W=="H"])## [,1]
## N 10.00000
## Min. 96.00000
## 1st Qu. 106.00000
## Median 108.00000
## Mean 110.00000
## 3rd Qu. 115.00000
## Max. 127.00000
## Tr Mean 109.75000
## Var 74.54444
## StDev 8.63391
## SE Mean 0.92919
# Estatísticas descritivas para o grupo das mulheres:
summary2(tempo_Y[sexo_W=="M"])## [,1]
## N 10.00000
## Min. 92.00000
## 1st Qu. 100.00000
## Median 103.00000
## Mean 105.00000
## 3rd Qu. 112.00000
## Max. 116.00000
## Tr Mean 105.12500
## Var 62.98889
## StDev 7.93655
## SE Mean 0.89087
# Uma maneira mais elegante é utilizar a função sapply:
## Estatísticas descrtivas do tempo de reacAo por sexo
summary_sexo<-sapply(levels(sexo_W),function(sex){summary2(tempo_Y[sexo_W==sex])})
summary_sexo## H M
## [1,] 10.00000 10.00000
## [2,] 96.00000 92.00000
## [3,] 106.00000 100.00000
## [4,] 108.00000 103.00000
## [5,] 110.00000 105.00000
## [6,] 115.00000 112.00000
## [7,] 127.00000 116.00000
## [8,] 109.75000 105.12500
## [9,] 74.54444 62.98889
## [10,] 8.63391 7.93655
## [11,] 0.92919 0.89087
## Estatísticas descrtivas do tempo de reacAo por idade
summary_idade<-sapply(levels(idade_X),function(age){summary2(tempo_Y[idade_X==age])})
summary_idade## 20 25 30 35 40
## [1,] 4.0000 4.0000 4.0000 4.0000 4.0000
## [2,] 92.0000 98.0000 100.0000 105.0000 112.0000
## [3,] 95.0000 100.0000 104.0000 107.0000 113.0000
## [4,] 98.0000 102.0000 108.0000 110.0000 115.0000
## [5,] 98.5000 103.0000 108.0000 111.0000 117.0000
## [6,] 102.0000 106.0000 111.0000 114.0000 120.0000
## [7,] 106.0000 110.0000 116.0000 118.0000 127.0000
## [8,] 98.0000 102.5000 107.5000 110.0000 115.0000
## [9,] 35.6667 26.2500 44.2500 31.5833 46.9167
## [10,] 5.9722 5.1235 6.6521 5.6199 6.8496
## [11,] 1.2219 1.1318 1.2896 1.1853 1.3086
Inicialmente, para calcularmos os resíduos, vamos construir dois vetores com as médias de cada grupo (por sexo e por idade) de acordo com as informações de cada indivíduo:
mean_idade<-rep(0,20)
for(age in levels(idade_X)){
mean_idade[mean_idade==0]<-((idade_X==age)*mean(tempo_Y[idade_X==age]))[mean_idade==0]
}
mean_sexo<-rep(0,length(sexo_W))
for(sex in levels(sexo_W)){
mean_sexo[mean_sexo==0]<-((sexo_W==sex)*mean(tempo_Y[sexo_W==sex]))[mean_sexo==0]
}
mean_idade## [1] 98.50 98.50 98.50 98.50 103.25 103.25 103.25 103.25 107.75 107.75
## [11] 107.75 107.75 110.75 110.75 110.75 110.75 117.25 117.25 117.25 117.25
mean_sexo## [1] 110.1 104.9 110.1 104.9 104.9 110.1 110.1 104.9 104.9 110.1 110.1
## [12] 104.9 104.9 104.9 110.1 110.1 104.9 104.9 110.1 110.1
Agora vamos calcular os resíduos e montar a Tabela 15.4:
e1<-tempo_Y-mean(tempo_Y)
e2<-tempo_Y-mean_sexo
e3<-tempo_Y-mean_idade
tab15_4<-cbind(tab15_1[,1:4],e1,e2,e3)| individuo | tempo_Y | sexo_W | idade_X | e1 | e2 | e3 |
|---|---|---|---|---|---|---|
| 1 | 96 | H | 20 | -11.5000 | -14.1000 | -2.5000 |
| 2 | 92 | M | 20 | -15.5000 | -12.9000 | -6.5000 |
| 3 | 106 | H | 20 | -1.5000 | -4.1000 | 7.5000 |
| 4 | 100 | M | 20 | -7.5000 | -4.9000 | 1.5000 |
| 5 | 98 | M | 25 | -9.5000 | -6.9000 | -5.2500 |
| 6 | 104 | H | 25 | -3.5000 | -6.1000 | 0.7500 |
| 7 | 110 | H | 25 | 2.5000 | -0.1000 | 6.7500 |
| 8 | 101 | M | 25 | -6.5000 | -3.9000 | -2.2500 |
| 9 | 116 | M | 30 | 8.5000 | 11.1000 | 8.2500 |
| 10 | 106 | H | 30 | -1.5000 | -4.1000 | -1.7500 |
| 11 | 109 | H | 30 | 1.5000 | -1.1000 | 1.2500 |
| 12 | 100 | M | 30 | -7.5000 | -4.9000 | -7.7500 |
| 13 | 112 | M | 35 | 4.5000 | 7.1000 | 1.2500 |
| 14 | 105 | M | 35 | -2.5000 | 0.1000 | -5.7500 |
| 15 | 118 | H | 35 | 10.5000 | 7.9000 | 7.2500 |
| 16 | 108 | H | 35 | 0.5000 | -2.1000 | -2.7500 |
| 17 | 113 | M | 40 | 5.5000 | 8.1000 | -4.2500 |
| 18 | 112 | M | 40 | 4.5000 | 7.1000 | -5.2500 |
| 19 | 127 | H | 40 | 19.5000 | 16.9000 | 9.7500 |
| 20 | 117 | H | 40 | 9.5000 | 6.9000 | -0.2500 |
| NA | NA | NA | NA | 8.5008 | 8.0714 | 5.3998 |
Vamos construir a função IC_t para calcular IC para a distribuição t no caso de das subgrupos na amostra:
IC_t<-function(x_barra1,x_barra2,s1,s2,n1,n2,gama=0.95){
left_tail<-(1-gama)/2
gamma_adj<-left_tail+gama # ajuste para somar a cauda inferior da distribuição somente para encontrar o quantil gama usando a função dist. acumulada
Se=((n1-1)*s1+(n2-1)*s2)/(n1+n2-2)
llim1<-x_barra1-qt(gamma_adj,df = (n1+n2-2))*sqrt(Se)/sqrt(n1) # calcula o limite inferior
ulim1<-x_barra1+qt(gamma_adj,df = (n1+n2-2))*sqrt(Se)/sqrt(n1) # calcula o limite inferior
llim2<-x_barra2-qt(gamma_adj,df = (n1+n2-2))*sqrt(Se)/sqrt(n2) # calcula o limite inferior
ulim2<-x_barra2+qt(gamma_adj,df = (n1+n2-2))*sqrt(Se)/sqrt(n2) # calcula o limite inferior
#writeLines(paste("IC_1(",gama,"):[",round(llim1,3),";",round(ulim1,3),"]\n",sep=""))
#writeLines(paste("IC_2(",gama,"):[",round(llim2,3),";",round(ulim2,3),"]\n",sep=""))
return(list(ic_calc1=c(inf.lim=llim1,upper.lim=ulim1),ic_calc2=c(inf.lim=llim2,upper.lim=ulim2)))
}
IC_t(mean(tempo_Y[sexo_W=="H"]),mean(tempo_Y[sexo_W=="M"]),var(tempo_Y[sexo_W=="H"]),var(tempo_Y[sexo_W=="M"]),10,10,gama=0.95)## $ic_calc1
## inf.lim upper.lim
## 104.59 115.61
##
## $ic_calc2
## inf.lim upper.lim
## 99.391 110.409
Para o IC de diferença de médias, utilizaremos a mesma função IC_diff_medias que construímos no capítulo anterior:
IC_diff_medias(mean(tempo_Y[sexo_W=="M"]),mean(tempo_Y[sexo_W=="H"]),
var(tempo_Y[sexo_W=="M"]),var(tempo_Y[sexo_W=="H"]),10,10,gama=0.95)## [1] "IC(0.95):]-2.5914;12.9914["
Para construirmos uma tabela de ANOVA, devemos referenciá-la a um modelo linear, que será calculado com a função lm. Assim, a tabela de ANOVA para o modelo 15.4 que contém o fator sexo é:
fit15_4_sexo<-anova(lm(tempo_Y~sexo_W))| FV | gl | SQ | QM | F | |
|---|---|---|---|---|---|
| sexo_W | 1 | 135.2 | 135.200 | 1.9661 | 0.17788 |
| Residuals | 18 | 1237.8 | 68.767 | NA | NA |
Uma outra função que também calcula a tabela de ANOVA é a função aov. Nela é possível também aplicar o método plot e verificar a análise de resíduos do modelo:
par(mfrow=c(2,2))
plot(aov(lm(tempo_Y~sexo_W))) Figura 15.1.A: Análise de resíduos para o Modelo de Estímulo em função do sexo.
qf(0.95,1,18)## [1] 4.4139
if(fit15_4_sexo$`F value`[1]>qf(0.95,1,18)){
print("Rejeito H_0")
} else print( "Aceito H0")## [1] "Aceito H0"
O boxplot pode ser contruído com a notação y~x1+...+xk, em que y representa a variável de interesse e x1+...+xk as variáveis agrupadoras. Assim:
boxplot(tempo_Y~idade_X, col="lightblue3")Figura 15.2: Box plots para a variável Y(estímulo) para cada nível de idade.
Podemos também construir tal figura utilizando o pacote ggplot2:
library(ggplot2)
p <- ggplot(tab15_1,aes(idade_X, tempo_Y))
p + geom_boxplot(stat = "boxplot", fill = "brown4",
position = "dodge", colour = "#858585",
outlier.shape = 16, outlier.size = 1, notch = FALSE,
notchwidth = 0.5) +
xlab("Idade") + ylab("Estímulo")+
theme(panel.background = element_rect(fill = "azure2"))Figura 15.2: Box plots para a variável Y(estímulo) para cada nível de idade utilizando o pacote ggplot2.
Para calcular a ANOVA para o fator idade, teremos:
fit15_4_idade<-anova(lm(tempo_Y~idade_X))par(mfrow=c(2,2))
plot(aov(lm(tempo_Y~idade_X))) Figura 15.1.B: Análise de resíduos para o Modelo de Estímulo em função do Idade.
| FV | gl | SQ | QM | F | |
|---|---|---|---|---|---|
| idade_X | 4 | 819 | 204.750 | 5.5438 | 0.00605 |
| Residuals | 15 | 554 | 36.933 | NA | NA |
plot(as.vector(idade_X),e3,col="darkred",pch=20,xaxt="n")
axis(1,at=c(19.6,24.6,29.6,34.6,39.6),labels=c("20 anos","25 anos","30 anos","35 anos","40 anos"))
abline(v=c(19.6,24.6,29.6,34.6,39.6), col="darkgrey", lty=2)Figura 15.3: Resíduos do modelo \(y_{ij}=\mu_i+e_{ij}\) para o fator idade.
qf(0.95,4,15)## [1] 3.0556
if(fit15_4_idade$`F value`[1]>qf(0.95,4,15)){
print("Rejeito H_0")
} else print( "Aceito H0")## [1] "Rejeito H_0"
medias_idade<-sapply(levels(idade_X),function(age){mean(tempo_Y[idade_X==age])})
medias_idade## 20 25 30 35 40
## 98.50 103.25 107.75 110.75 117.25
Para calcular a diferença entre as idades conforme calculado na Tabela 15.8, utilize a função diff
diff(medias_idade)## 25 30 35 40
## 4.75 4.50 3.00 6.50
print(kable(cbind(c("média","diferença"),rbind(medias_idade,c(0,diff(medias_idade)))),caption="**Tabela 15.8**:Médias e diferenças de médias para os diversos grupos de idade para o Exemplo 15.1.",col.names = c("","20 anos","25 anos","30 anos","35 anos","40 anos"),row.names = FALSE))| 20 anos | 25 anos | 30 anos | 35 anos | 40 anos | |
|---|---|---|---|---|---|
| média | 98.5 | 103.25 | 107.75 | 110.75 | 117.25 |
| diferença | 0 | 4.75 | 4.5 | 3 | 6.5 |
Novamente, vamos construir uma função para construir os ICs:
IC_t_diff<-function(x_barra1,x_barra2,SQ,n,n1,n2,gama=0.95){
left_tail<-(1-gama)/2
gamma_adj<-left_tail+gama # ajuste para somar a cauda inferior da distribuição somente para encontrar o quantil gama usando a função dist. acumulada
Se=SQ/(n-2)
llim1<-(x_barra1-x_barra2)-qt(gamma_adj,df = (n-2))*sqrt(Se)*sqrt(1/n1+1/n2) # calcula o limite inferior
ulim1<-(x_barra1-x_barra2)+qt(gamma_adj,df = (n-2))*sqrt(Se)*sqrt(1/n1+1/n2) # calcula o limite inferior
#writeLines(paste("t_c:",qt(gamma_adj,df = (n-2))))
#writeLines(paste("IC_1(",gama,"):[",round(llim1,3),";",round(ulim1,3),"]\n",sep=""))
#writeLines(paste("IC_2(",gama,"):[",round(llim2,3),";",round(ulim2,3),"]\n",sep=""))
return(ic_calc=c(inf.lim=llim1,upper.lim=ulim1))
}Calculando agora todos os ICs de diferenças entre grupos de idades, temos:
v<-levels(idade_X)
SQ<-fit15_4_idade$`Sum Sq`[1] #fit15_4_idade ;e o modelo ajustado e $`Sum Sq`[1] é a SQ para a idade.
ics_diff_idades<-matrix(NA,10,2)
cont=1
lab_ics<-character(0)
vec_diff_idades<-numeric()
for( i in 1:4)
for(j in (i+1):5){
ics_diff_idades[cont,]<-IC_t_diff(mean(tempo_Y[idade_X==v[i]]),mean(tempo_Y[idade_X==v[j]]),SQ,20,4,4,gama = 0.995)
vec_diff_idades[cont]<-mean(tempo_Y[idade_X==v[i]])-mean(tempo_Y[idade_X==v[j]])
lab_ics[cont]<-paste(v[i],v[j],sep="_")
cont=cont+1
}
rownames(ics_diff_idades)<-lab_ics
ics_diff_idades## [,1] [,2]
## 20_25 -19.997 10.4967
## 20_30 -24.497 5.9967
## 20_35 -27.497 2.9967
## 20_40 -33.997 -3.5033
## 25_30 -19.747 10.7467
## 25_35 -22.747 7.7467
## 25_40 -29.247 1.2467
## 30_35 -18.247 12.2467
## 30_40 -24.747 5.7467
## 35_40 -21.747 8.7467
### Grafico com os ICs
plot(1:10,vec_diff_idades, ylim=c(min(ics_diff_idades)-1,max(ics_diff_idades)+1), type="p",xaxt="n",xlab="pares",ylab="ICs")
axis(1,at=1:10,labels=lab_ics) # labels no eixo x
for (i in 1:10) {
if(ics_diff_idades[i,1]>0 || ics_diff_idades[i,2]<0) {color="red"} else color="darkblue"
lines(x =c(i,i), y=t(ics_diff_idades)[,i], col=color) # Plotando os ICs
}Figura 15.6.A: Intervalos de confiança simultâneos para as diferenças de médias da variável Y(estímulo) por idade.
O teste de Bartlett é calculado no R a partir da função bartlett.test:
bartlett.test(x, g)
# x: Vetor com a variável de interesse
# g: vetor contendo a qual grupo cada elemento de x pertence
bartlett.test(x=tempo_Y, g=idade_X)##
## Bartlett test of homogeneity of variances
##
## data: tempo_Y and idade_X
## Bartlett's K-squared = 0.299, df = 4, p-value = 0.99
O Quadro 15.1 é formado pela saída da análise de variância, que já calculamos anteriormente (fit15_4_idade) e os ICs de cada um dos grupos de idades:
fit15_4_idade## Analysis of Variance Table
##
## Response: tempo_Y
## Df Sum Sq Mean Sq F value Pr(>F)
## idade_X 4 819 204.8 5.54 0.0061
## Residuals 15 554 36.9
ics_idades<-matrix(NA,5,2)
cont=1
for(age in levels(idade_X)){
ics_idades[cont,]<-IC(n = 4, mean(tempo_Y[idade_X==age]),sd(tempo_Y[idade_X==age]),gama=0.95)
cont=cont+1
}## IC(0.95):[92.647;104.353]
##
## IC(0.95):[98.229;108.271]
##
## IC(0.95):[101.231;114.269]
##
## IC(0.95):[105.243;116.257]
##
## IC(0.95):[110.538;123.962]
print(kable(cbind(medias_idade,ics_idades),caption="Média e Intervalos de confiança por grupo de idade",col.names = c("Média","Limite Inferior", "Limite Superior")))##
##
## Table: Média e Intervalos de confiança por grupo de idade
##
## Média Limite Inferior Limite Superior
## --- ------- ---------------- ----------------
## 20 98.50 92.647 104.35
## 25 103.25 98.229 108.27
## 30 107.75 101.231 114.27
## 35 110.75 105.243 116.26
## 40 117.25 110.538 123.96
### gráfico dos ICs
plot(c(20,25,30,35,40),medias_idade, ylim=c(min(ics_idades)-1,max(ics_idades)+1), type="p",xlab="Idade",ylab="ICs")
for (i in 1:5) lines(x =c(v[i],v[i]), y=t(ics_idades)[,i]) # Plotando os ICsFigura 15.6.A: ICs para médias dos grupos de idades.
boxplot(e3~as.vector(idade_X),col="lightblue3",pch=20)Figura 15.4: Box plot para os resíduos por nível do fator idade.
boxplot(e3,col = "lightblue3")Figura 15.5: Box plot para os resíduos de todas as idades.