Formula

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}} \]

Dados

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

Comparação

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]

Descritiva dos ranks

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 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.