Se você faz pesquisa científica então com certeza já precisou comparar médias para analisar os resultados obtidos. O problema é que existem muitos testes estatísticos possíveis e cada um deles é aplicado para uma situação diferente.
Então, como saber qual o melhor para os dados da sua pesquisa? Para responder essa pergunta é preciso saber qual o tipo de dado que você tem em mãos.
As variáveis da sua pesquisa podem ser: quantitativas ou qualitativas, apresentar ou não distribuição normal, ser pareadas ou não e ter mais ou menos de dois níveis. Essas características serão as responsáveis pela escolha dos testes.
Continue lendo para saber mais sobre cada um dos testes e a sua aplicabilidade.
Quantitativa não apresenta distribuição normal
Teste de Wilcoxon/ Mann-Whitney
Este é um teste não paramétrico baseado nos postos dos valores obtidos combinando 2 amostras, sendo que a utilização dele é ideal para a comparação de 2 amostras não pareadas. Exemplo:
GrupoA1 <- c(1, 2, 3, 2, 3, 4, 5, 4, 3, 2, 2, 2, 3, 2, 3, 2)
GrupoA2 <- c(3, 4, 4, 4, 5, 5, 3, 3, 2, 3, 3, 4, 2, 4)
MedidasA <- c(GrupoA1, GrupoA2)
MedidasA %>%
shapiro.test()# Não segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.90592, p-value = 0.01176
GruposA <- c(rep("G1", length(GrupoA1)),
rep("G2", length(GrupoA2))) %>%
as.factor()
wilcox.test(MedidasA ~ GruposA, exact = FALSE)# exact: quando não tem empate nos postos
##
## Wilcoxon rank sum test with continuity correction
##
## data: MedidasA by GruposA
## W = 61.5, p-value = 0.03053
## alternative hypothesis: true location shift is not equal to 0
whitney.abg(MedidasA, GruposA)
## N Média E.P. 1º Q. 2º Q. 3º Q. Valor-p
## G1 16 2.6875 0.2536196 2 2.5 3 0.03052584
## G2 14 3.5000 0.2513699 3 3.5 4 0.03052584
Teste de Kruskall-Wallis
O teste de Kruskal-Wallis é uma extensão do de Wilcoxon/Mann-Whitney. É um teste não paramétrico utilizado para comparar 3 ou mais amostras não pareadas. Ele é usado para testar a hipótese nula de que todas as populações possuem médias iguais contra a hipótese alternativa de que ao menos duas das populações possuem médias diferentes quanto à uma variável quantitativa. Exemplo:
GrupoB1 <- c(1, 1, 3, 2, 2, 4, 4, 4, 2, 2, 3, 2, 1, 2, 3, 2)
GrupoB2 <- c(4, 5, 4, 4, 5, 5, 3, 3, 2, 5, 3, 4)
GrupoB3 <- c(5, 4, 4, 4, 3, 5, 4, 4, 5, 5, 3, 3, 2, 3, 3, 4, 2, 4)
MedidasB <- c(GrupoB1, GrupoB2, GrupoB3)
MedidasB %>%
shapiro.test()# Não segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.90793, p-value = 0.001482
GruposB <- c(rep("G1", length(GrupoB1)),
rep("G2", length(GrupoB2)),
rep("G3", length(GrupoB3))) %>%
as.factor()
kruskal.test(MedidasB ~ GruposB)
##
## Kruskal-Wallis rank sum test
##
## data: MedidasB by GruposB
## Kruskal-Wallis chi-squared = 14.47, df = 2, p-value = 0.0007208
kruskal.abg(MedidasB, GruposB)$tabela
## N Média E.P. 1º Q. 2º Q. 3º Q. Valor-p
## G1 16 2.375000 0.2561738 2 2 3 0.0007207691
## G2 12 3.916667 0.2875796 3 4 5 0.0007207691
## G3 18 3.722222 0.2258688 3 4 4 0.0007207691
Quando o teste de Kruskall-Wallis verifica diferença significativa, utiliza-se o de Nemenyi, que é um post-hoc, para a verificação de diferenças par-a-par (comparações múltiplas). Exemplo:
if(!require(PMCMR)){ install.packages("PMCMR"); require(PMCMR) }
posthoc.kruskal.nemenyi.test(MedidasB ~ GruposB, dist = "Chisq")# Método para determinar o valor-p (defaut tukey)
##
## Pairwise comparisons using Nemenyi-test with Chi-squared
## approximation for independent samples
##
## data: MedidasB by GruposB
##
## G1 G2
## G2 0.0039 -
## G3 0.0059 0.9018
##
## P value adjustment method: none
kruskal.abg(MedidasB, GruposB)$C.Multiplas
## G1 G2
## G2 0.003937787 NA
## G3 0.005871800 0.9018024
Teste de Wilcoxon pareado
O teste de Wilcoxon pareado é utilizado para comparar se as medidas de posição de 2 amostras são iguais no caso em que as amostras são dependentes (pareadas). Exemplo:
GrupoC1 <- c(2, 2, 1, 3, 1, 3, 2, 2, 3, 3, 3, 3, 2, 1, 1, 2, 4, 2)
GrupoC2 <- c(3, 4, 3, 3, 2, 3, 3, 4, 3, 3, 3, 3, 3, 4, 2, 2, 4, 2)
MedidasC <- c(GrupoC1, GrupoC2)
MedidasC %>%
shapiro.test()# Não segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.87325, p-value = 0.0006849
GruposC <- c(rep("G1", length(GrupoC1)),
rep("G2", length(GrupoC2))) %>%
as.factor()
wilcox.test(MedidasC ~ GruposC, exact = FALSE, paired = TRUE)
##
## Wilcoxon signed rank test with continuity correction
##
## data: MedidasC by GruposC
## V = 0, p-value = 0.007745
## alternative hypothesis: true location shift is not equal to 0
wilcox.abg(GrupoC1, GrupoC2)
## N_validos Média E.P 1ºQ 2ºQ 3ºQ Valor-P
## diferença 18 -0.7777778 0.2222222 -1 -0.5 0 0.007744715
Teste de Friedman
Esse é um teste não-paramétrico utilizado para comparar 3 ou mais amostras pareadas quanto à uma variável quantitativa. Exemplo:
GrupoD1 <- c(2, 2, 1, 3, 1, 3, 2, 2, 3, 3, 3, 3, 2, 1, 1, 2, 4, 2)
GrupoD2 <- c(3, 4, 3, 3, 2, 3, 3, 4, 3, 3, 3, 3, 3, 4, 2, 2, 4, 2)
GrupoD3 <- c(2, 5, 4, 4, 3, 4, 4, 5, 4, 4, 2, 4, 2, 5, 3, 3, 4, 2)
MedidasD <- c(GrupoD1, GrupoD2, GrupoD3)
MedidasD %>%
shapiro.test()# Não segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.91304, p-value = 0.0008227
Matriz <- cbind(GrupoD1, GrupoD2, GrupoD3)
Matriz %>%
friedman.test()
##
## Friedman rank sum test
##
## data: .
## Friedman chi-squared = 16.836, df = 2, p-value = 0.0002208
Quando o teste de Friedman verifica diferença significativa, utiliza-se o de Nemenyi, que é um post-hoc, para a verificação de diferenças par-a-par (comparações múltiplas). Exemplo:
Matriz %>%
posthoc.friedman.nemenyi.test()# Pacote PMCMR
##
## Pairwise comparisons using Nemenyi multiple comparison test
## with q approximation for unreplicated blocked data
##
## data: .
##
## GrupoD1 GrupoD2
## GrupoD2 0.21810 -
## GrupoD3 0.00099 0.13394
##
## P value adjustment method: none
Quantitativa apresenta distribuição normal
Teste t
A utilização do teste t é ideal para comparar 2 amostras quanto à uma variável quantitativa quando essa segue uma distribuição normal. Existem três casos para a sua utilização: amostras não pareadas com variâncias populacionais iguais, amostras não pareadas com variâncias populacionais diferentes, e amostras pareadas. Exemplo do primeiro caso:
set.seed(16)
GrupoE1 <- rnorm(25, 3, 1)
set.seed(16)
GrupoE2 <- rnorm(21, 4, 1)
MedidasE <- c(GrupoE1, GrupoE2)
MedidasE %>%
shapiro.test()# Segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.98049, p-value = 0.6261
GruposE <- c(rep("G1", length(GrupoE1)),
rep("G2", length(GrupoE2))) %>%
as.factor()
if(!require(car)){ install.packages("car"); require(car) }
leveneTest(MedidasE ~ GruposE)# Variâncias iguais
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 1e-04 0.9923
## 44
t.test(GrupoE1, GrupoE2, var.equal = TRUE)
##
## Two Sample t-test
##
## data: GrupoE1 and GrupoE2
## t = -3.3456, df = 44, p-value = 0.001687
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -1.6352090 -0.4057567
## sample estimates:
## mean of x mean of y
## 3.134466 4.154949
Exemplo do segundo caso:
set.seed(16)
GrupoF1 <- rnorm(25, 3, 1)
set.seed(16)
GrupoF2 <- rnorm(21, 4, 2)
MedidasF <- c(GrupoF1, GrupoF2)
MedidasF %>%
shapiro.test()# Segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.98159, p-value = 0.6719
GruposF <- c(rep("G1", length(GrupoF1)),
rep("G2", length(GrupoF2))) %>%
as.factor()
leveneTest(MedidasF ~ GruposF)# Variâncias diferentes
## Levene's Test for Homogeneity of Variance (center = median)
## Df F value Pr(>F)
## group 1 8.2799 0.006163 **
## 44
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
t.test(GrupoE1, GrupoE2, var.equal = FALSE)
##
## Welch Two Sample t-test
##
## data: GrupoE1 and GrupoE2
## t = -3.3383, df = 42.254, p-value = 0.001768
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -1.6372852 -0.4036805
## sample estimates:
## mean of x mean of y
## 3.134466 4.154949
Exemplo do terceiro caso:
set.seed(16)
GrupoH1 <- rnorm(25, 3, 2)
set.seed(16)
GrupoH2 <- rnorm(25, 4, 1)
MedidasH <- c(GrupoH1, GrupoH2)
MedidasH %>%
shapiro.test()# Segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.96379, p-value = 0.1282
t.test(GrupoH1, GrupoH2, paired = TRUE)
##
## Paired t-test
##
## data: GrupoH1 and GrupoH2
## t = -4.248, df = 24, p-value = 0.0002811
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
## -1.2860539 -0.4450143
## sample estimates:
## mean of the differences
## -0.8655341
ANOVA
A análise de variância (ANOVA) pode determinar se existe diferença significativa entre três ou mais grupos quanto à uma variável quantitativa que siga distribuição normal. A ANOVA usa testes F para testar estatisticamente a igualdade entre médias.
set.seed(16)
GrupoG1 <- rnorm(26, 3, 1)
set.seed(16)
GrupoG2 <- rnorm(22, 5, 2)
set.seed(16)
GrupoG3 <- rnorm(19, 4, 1)
MedidasG <- c(GrupoG1, GrupoG2, GrupoG3)
MedidasG %>%
shapiro.test()# Segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.96997, p-value = 0.1046
GruposG <- c(rep("G1", length(GrupoG1)),
rep("G2", length(GrupoG2)),
rep("G3", length(GrupoG3))) %>%
as.factor()
model <- lm(MedidasG ~ GruposG)
if(!require(stats)){ install.packages("stats"); require(stats) }
model %>%
aov() %>%
summary()
## Df Sum Sq Mean Sq F value Pr(>F)
## GruposG 2 51.56 25.781 12.46 2.69e-05 ***
## Residuals 64 132.44 2.069
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Quando se verifica diferença significativa entre os grupos na ANOVA, utiliza-se o teste de Tukey, que é um post-hoc, para a verificação de diferenças par-a-par (comparações múltiplas). Exemplo:
model %>%
aov() %>%
TukeyHSD()
## Tukey multiple comparisons of means
## 95% family-wise confidence level
##
## Fit: aov(formula = .)
##
## $GruposG
## diff lwr upr p adj
## G2-G1 2.079207 1.07931276 3.07910145 0.0000146
## G3-G1 1.010591 -0.03118535 2.05236636 0.0591258
## G3-G2 -1.068617 -2.14964050 0.01240729 0.0533450
Dados longitudinais agrupados via GEE
O método GEE, conhecido como Modelos Marginais, é um dos métodos mais adequados no tratamento de dados longitudinais agrupados (3 ou mais grupos), quando a variável de interesse segue distribuição normal. Exemplo:
set.seed(16)
GrupoI1 <- rnorm(20, 3, 1.5)
set.seed(16)
GrupoI2 <- rnorm(20, 3.5, 1.2)
set.seed(16)
GrupoI3 <- rnorm(20, 4, 1)
MedidasI <- c(GrupoI1, GrupoI2, GrupoI3)
MedidasI %>%
shapiro.test()# Segue distribuição normal
##
## Shapiro-Wilk normality test
##
## data: .
## W = 0.96577, p-value = 0.09037
GruposI <- c(rep("G1", length(GrupoI1)),
rep("G2", length(GrupoI2)),
rep("G3", length(GrupoI3))) %>%
as.factor()
ID <- c(seq(1:length(GrupoI1)),
seq(1:length(GrupoI2)),
seq(1:length(GrupoI3))) %>%
as.factor()
Data <- data.frame(ID, MedidasI, GruposI)
if(!require(geepack)){ install.packages("geepack"); require(geepack) }
model2 <- geeglm(MedidasI ~ GruposI, id = ID, family = gaussian,
corstr = "exchangeable", data = Data[order(Data$ID),])
model2 %>%
summary()
##
## Call:
## geeglm(formula = MedidasI ~ GruposI, family = gaussian, data = Data[order(Data$ID),
## ], id = ID, corstr = "exchangeable")
##
## Coefficients:
## Estimate Std.err Wald Pr(>|W|)
## (Intercept) 3.36763 0.32171 109.58 < 2e-16 ***
## GruposIG2 0.42647 0.06434 43.93 3.40e-11 ***
## GruposIG3 0.87746 0.10724 66.95 3.33e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Estimated Scale Parameters:
## Estimate Std.err
## (Intercept) 1.438 0.3614
##
## Correlation: Structure = exchangeable Link = identity
##
## Estimated Correlation Parameters:
## Estimate Std.err
## alpha 0.9595 2.665e-09
## Number of clusters: 20 Maximum cluster size: 3
Já consegue definir qual o tipo de teste adequado para a sua pesquisa? Deixe suas dúvidas nos comentários aqui embaixo que iremos responder. E, caso precise de ajuda, entre em contato para fazer seu orçamento! Nós realizamos análises estatísticas para trabalhos acadêmicos como teses e dissertações.
EScrito em colaboração com Luis Henrique Carvalho
6 comentários em “Qual o melhor teste para a comparação de médias?”
Poxa gostei muito do seu artigo, o outro blog que eu
estava lendo não tinha a mesma informação. A sua está
correta
A função %>% não existe mais????
Bom dia, Vanderley. Existe sim! O operador pipe (%>%) ainda existe. Este operador é utilizado principalmente com as bibliotecas tidyverse/dplyr. Em alguns artigos ou scripts pela internet você pode encontrar o operador pipe como sendo |>. Isso porque a versão 4.1 do R trouxe algumas novidades para os usuários, como por exemplo a inclusão de um operador pipe nativo (|>).
Neste caso, se eu tenho dados sobre consumo de um produto e quero comparar as categorias entre quem consome menos e quem consome mais, qual seria o teste mais adequado?
Bom dia, Lucas!
De acordo com as informações que você nos deu, o teste Mann-Whitney poderia ser utilizado já que possui 2 grupos (consome menos e consome mais o produto) independentes (não pareados). Mas, para algo mais assertivo, seria melhor você analisar primeiramente os dados, ver o comportamento e avaliar se a sugestão se encaixa ao seu estudo!
Your article helped me a lot, is there any more related content? Thanks!