Podemos utilizar vários tamanhos de efeito para testes não paramétricos. Usando a referência de Gignac (2019, cap. 16), podemos calcular um tamanho de efeito com métrica semelhante à do d de Cohen para análises Mann-Whitney (i.e., comparação entre dois grupos). A fórmula é apresentada abaixo.
\[ d = z * \sqrt{\frac{1}{n_1} + \frac{1}{n_2}} \]
Para fazer as análises, vamos comparar o desempenho de meninas e meninos em dois escores diferentes. Os primeiros casos no banco de dados estão apresentados abaixo.
| sex | escore_1 | escore_2 |
|---|---|---|
| Meninos | 7 | 6 |
| Meninos | 4 | 4 |
| Meninos | 7 | 3 |
| Meninos | 3 | 4 |
| Meninas | 7 | 4 |
| Meninas | 8 | 6 |
E algumas análises descritivas para entender um pouco os dados
| escore | Sexo | n | mean | se | sd | median | min | max |
|---|---|---|---|---|---|---|---|---|
| Escore 1 | Meninos | 62 | 6.77 | 0.21 | 1.62 | 7 | 3 | 9 |
| Escore 1 | Meninas | 44 | 7.57 | 0.20 | 1.30 | 8 | 4 | 9 |
| Escore 2 | Meninos | 62 | 5.03 | 0.22 | 1.74 | 5 | 3 | 9 |
| Escore 2 | Meninas | 44 | 5.00 | 0.26 | 1.73 | 5 | 3 | 9 |
Para comparação entre grupos, vamos usar o pacote coin e a função wilcox_test.
library(coin)
wilcox_test(escore_1 ~ sex, data = base)
##
## Asymptotic Wilcoxon-Mann-Whitney Test
##
## data: escore_1 by sex (Meninos, Meninas)
## Z = -2.531, p-value = 0.01137
## alternative hypothesis: true mu is not equal to 0
De acordo com os resultados, poderíamos interpretar que há uma diferença significativa (p < 0,05) nos “escores 1” entre meninos e meninas. Porém, é necessário também compreender o tamanho dessa diferença. Usando o resultado do pacote, poderíamos facilmente substituir os valores na fórmula acima e calcular o valor do d de Cohen
\[ d = z * \sqrt{\frac{1}{n_1} + \frac{1}{n_2}} \] \[ d = -2.531 * \sqrt{\frac{1}{62} + \frac{1}{44}} \]
\[ d = -2.531 * \sqrt{0.01612903 + 0.02272727} \] \[ d = -2.531 * 0.19712 \] \[ d = -0.4989107 \] ou seja, um d = -0.50 (arredondando), um tamanho de efeito que pode ser considerado moderado.
OK, até aí tudo bem, exceto pelo fato de que não estamos com esse processo automatizado.
Abaixo apresento uma função que combina o pacote coin com a fórmula para o d.
full.mann.whitney <- function(dv = x, iv = y, data = data){
require(coin)
require(tidyverse)
#test
obj = coin::wilcox_test(data[[dv]] ~ data[[iv]], data = data)
#preparing
n_s = means_teste[[iv]] %>% summary() %>% data.frame() %>%
rename(n = ".") %>% rownames_to_column("group")
#effect size
d = obj@statistic@teststatistic * (sqrt((1/n_s[1,2]) + (1/n_s[2,2])))
#output
out = list(results = obj, "effect size d" = d)
return(out)
}
Uma vez que a fórmula está carregada, ela pode ser usada da seguinte maneira:
full.mann.whitney(dv = "escore_1", iv = "sex", data = base)
## $results
##
## Asymptotic Wilcoxon-Mann-Whitney Test
##
## data: data[[dv]] by data[[iv]] (Meninos, Meninas)
## Z = -2.531, p-value = 0.01137
## alternative hypothesis: true mu is not equal to 0
##
##
## $`effect size d`
## [1] -0.4989161
O nome das variáveis deve vir entre parênteses para que o código funcione a princípio.
A função pode ser aplicada no escore 2 para verificar se há diferenças
full.mann.whitney(dv = "escore_2", iv = "sex", data = base)
## $results
##
## Asymptotic Wilcoxon-Mann-Whitney Test
##
## data: data[[dv]] by data[[iv]] (Meninos, Meninas)
## Z = 0.0065555, p-value = 0.9948
## alternative hypothesis: true mu is not equal to 0
##
##
## $`effect size d`
## [1] 0.001292226
Os resultados indicam que não há diferença e o tamanho de efeito é pequeno. Poderíamos escrever assim: não há diferença significativa entre meninos e meninas no escore 2 [z = 0,01 p = 0,995 d = 0,00]
Até aqui vimos que há diferença no escore 1 e não no escore 2, mas não foi possível ver qual grupo possui maiores escores.
Podemos usar a média ou e mediana, mas talvez seja mais interessante utilizar a média dos ranks gerados na análise Mann-Whitney (meio que esse é o ponto, já que estamos trabalhando com dados transformados).
Para isso, vamos usar essa função criada e exportar os resultados gerados pelo pacote coin.
resultado1 = full.mann.whitney(dv = "escore_1", iv = "sex", data = base)
para ter acesso ao dados transformados temos que usar o seguinte comando objeto_resultado$results@statistic@ytrans note: aqui usamos @ para “puxar” os resultados dentro do pacote coin. O mais comum é usar $ como na primeira parte, porém, esse operador não funciona com resultados desse pacote.
Dessa forma, ao escrever resultado1$results@statistic@ytrans vamos ter acesso aos ranks na ordem dos dados. Como abaixo:
| 47.0 |
| 5.5 |
| 47.0 |
| 1.5 |
| 47.0 |
| 72.0 |
Como isso é uma variável, podemos usar ela para criar um novo banco de dados e tirar as descritivas dos ranks! Para isso, é necessário compreender, também, a como o pacote tratou os dados categóricos. Vamos tentar observar como o pacote coin codificou a variável sexo:
summary(factor(resultado1$results@statistic@xtrans))
## 0 1
## 44 62
Assim, fica claro que o pacote tratou as meninas como 0 e meninos como 1. Então, ao rodar as linhas abaixo, temos um banco de dados onde juntamos a transformação em ranks da nossa VD (variável dependente) com a codificação da nossa VI (variável independente)
nova_base <- data.frame(V1 = resultado1$results@statistic@ytrans,
sex = factor(resultado1$results@statistic@xtrans, levels = c(0,1),
labels = c("meninas", "meninos")))
| V1 | sex |
|---|---|
| 47.0 | meninos |
| 5.5 | meninos |
| 47.0 | meninos |
| 1.5 | meninos |
| 47.0 | meninas |
| 72.0 | meninas |
Onde V1 é a média dos ranks.
Usando o pacote psych e o tidyverse podemos gerar análises descritivas e gráficos com esse novo banco.
Descritivas
library(tidyverse)
nova_base %>%
psych::describeBy(.,group = .$sex, mat = T) %>%
select(group1,mean,se) %>% filter(se !=0)
## group1 mean se
## V11 meninas 62.27273 4.220923
## V12 meninos 47.27419 3.827136
Assim, fica claro que meninas possuem maiores escores que meninos.
Gráfico
nova_base %>%
psych::describeBy(.,group = .$sex, mat = T) %>%
select(group1,mean,se) %>% filter(se !=0) %>%
rename(Sexo = group1,
Média = mean) %>%
ggplot(aes(x = Sexo, y = Média, group = Sexo, color = Sexo))+
geom_point(size = 3, position = position_dodge(.4))+
geom_errorbar(aes(ymin = Média - 1.96*se, ymax = Média + 1.96*se),
color = "black",width = 0.35, position = position_dodge(.4))+
ylim(0,90)+ xlab(NULL)+
scale_color_manual(values = c("#ffb12b", "#2b6bff"))+
theme_classic()
OBS : com o gráfico dá para perceber que há certa sobreposição entre os intervalos de confiança, indicando que talvez a diferença entre grupos não seja de fato significativa.