TEST DE KRUSKAL WALLIS

1.- INTRODUCCIÓN

El test de Kruskal-Wallis, también conocido como test H, es la alternativa no paramétrica al test ANOVA de una vía para datos no pareados. Se trata de una extensión del test de Mann-Whitney para más de dos grupos. Es por lo tanto de un test que emplea rangos para contrastar la hipótesis de que k muestras han sido obtenidas de una misma población.

A diferencia del ANOVA en el que se comparan medias, el test de Kruskal-Wallis contrasta si las diferentes muestras están equidistribuidas y que por lo tanto pertenecen a una misma distribución (población). Bajo ciertas simplificaciones puede considerarse que el test de Kruskal-Wallis compara las medianas.

H0: todas las muestras provienen de la misma población (distribución). HA: Al menos una muestra proviene de una población con una distribución distinta. El test de Kruskal-Wallis es el test adecuado cuando los datos tienen un orden natural, es decir, cuando para darles sentido tienen que estar ordenados o bien cuando no se satisfacen las condiciones para poder aplicar un ANOVA. Por ejemplo, si se quiere estudiar la diferencia entre hombres y mujeres en una carrera, se puede disponer de dos tipos de datos: los tiempos de cada participante (análisis con ANOVA) o las posiciones en las que ha terminado la carrera cada participante (análisis con Kruskal-Wallis test).

2.- CONDICIONES

En la mayoría de la bibliografía consultada consideran que el ANOVA es bastante robusto a la falta de normalidad sobre todo con muestras medianas o grandes. Sólo recomiendan el uso del test de Kruskal-Wallis cuando las poblaciones a comparar sean claramente asimétricas, se cumpla que todas lo sean en la misma dirección y que la varianza sea homogénea.

Si la varianza no es homogénea el test adecuado es un ANOVA con corrección de Welch. En los casos en los que se trata de datos puramente ordinales el ANOVA no es una opción.

3.- Comparaciones POST HOC

Al igual que ocurre con un ANOVA, si el test de Kruskal-Wallis es significativo, implica que al menos dos grupos de entre los comparados son significativamente diferentes, pero no indica cuales. Para saberlo es necesario compararlos todos entre ellos. Esto implica realizar una corrección del nivel de significancia para evitar incrementar el error de tipo I. Los dos métodos de comparación post-hoc más empleados para un test de Kruskal-Wallis son:

4.- TAMAÑO DEL EFECTO

No hay una manera general de calcular el tamaño del efecto de una prueba Kruskal-Wallis. Lo que se suele hacer es calcular el tamaño del efecto sobre las parejas que hayan resultado significativamente distintas en el análisis post-hoc. Si las comparaciones post-hoc se hacen mediante Mann-Whitney, se tendrá que calcular el efecto asociado a dicho test.

5.- EJERCICIO

Un estudio compara el número de huevos que pone un determinado insecto bajo 3 condiciones distintas. ¿Existen diferencias significativas dependiendo de las condiciones?

datos <- data.frame(
  condicion = c(rep("condicion1", 18), rep("condicion2", 18), rep("condicion3", 18)),
  n_huevos = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 27, 28, 29, 30, 51, 52, 53, 342, 40,
               41, 42, 43, 44, 45, 46, 47, 48, 67, 88, 89, 90, 91,92, 93, 94, 293,
               19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 25, 36, 37, 58, 59, 60, 71, 72)
)
head(datos)
##    condicion n_huevos
## 1 condicion1        1
## 2 condicion1        2
## 3 condicion1        3
## 4 condicion1        4
## 5 condicion1        5
## 6 condicion1        6

5.1.- Medidas descriptivas

Medias

aggregate(n_huevos ~condicion, data = datos, FUN = mean)
##    condicion n_huevos
## 1 condicion1 37.38889
## 2 condicion2 77.38889
## 3 condicion3 36.27778

Se comprueba que la media de huevos bajo la condición 1 es de 37. 38, para la condición 2, es de 7738 y para la condición 3 es de 36.27. Se observan promedios diferentes en cada clase. Aunque la media de la condición 1 y la 2 parecen similares.

MEDIANAS

aggregate(n_huevos ~condicion, data = datos, FUN = median)
##    condicion n_huevos
## 1 condicion1     12.5
## 2 condicion2     57.5
## 3 condicion3     26.5

Al analizar las medianas, sí se observarían diferencias en los promedios entre las condiciones analizadas. Los resultados no son parecidos a los promedios, indiciando la presencia de datos extremos en las distribuciones.

VARIANZAS

aggregate(n_huevos ~condicion, data = datos, FUN = var)
##    condicion  n_huevos
## 1 condicion1 6100.6046
## 2 condicion2 3412.6046
## 3 condicion3  345.6242

Tenemos varianzas muy diferentes entre las categorías; se debería ver un problema de heterocedasticidad entre los grupos.

DESVIACIONES TÍPICAS

aggregate(n_huevos ~condicion, data = datos, FUN = sd)
##    condicion n_huevos
## 1 condicion1 78.10637
## 2 condicion2 58.41750
## 3 condicion3 18.59097

Tenemos desviaciones típicas muy diferentes; entre las categorías se debería verificar un problema de heterocedasticidad entre los grupos.

5.3. - ANÁLISIS GRÁFICO

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
ggplot(data=datos, mapping = aes(x=condicion, y=n_huevos, color=condicion))+
  geom_boxplot()+
  theme_bw()+
  theme(legend.position="right")

En el diagrama de caja, lo primero que observamos son datos anómalos muy importantes (mucha separación) con la condición 1 y la condición 2.

En segundo lugar, las dispersiones mostradas en los boxplots son diferentes.

Se aprecia que la media puede ser similar entre la condición 1 y la 3. Pero que la condición 1 muestra diferencias con la 2, pero la 2 comparte valores con la 3, en este caso podría tener medias similares.

ggplot(data=datos, mapping=aes(x=n_huevos, color = condicion))+
  geom_histogram()+
  facet_grid(.~condicion)+
  theme(legend.position="right")
## `stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

El primer histograma no acepta la normalidad, pues presenta datos atípicos mayores a 300. Tiene forma más de una chi-cuadrado.

El segundo histograma no acepta la normalidad, pues presenta datos atípicos mayores a 280. Tiene forma más de una chi-cuadrado.

El tercer histograma presenta una marcada asimetría positiva y además un gran apuntamiento. Por ello, no aceptaría la normalidad.

Dado que las distribuciones son similares (gran asimetría positiva y apuntamiento), podemos aplicar el test de Kruskal Wallis para la comparación de las medias (no el ANOVA, pues éste se aplica con normalidad y homocedasticidad).

5.4.- HETEROCEDASTICIDAD

library(car)
## Warning: package 'car' was built under R version 4.2.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.2.3
library(carData)
leveneTest(n_huevos ~ condicion, data=datos, center = "median")
## Warning in leveneTest.default(y = y, group = group, ...): group coerced to
## factor.
## Levene's Test for Homogeneity of Variance (center = "median")
##       Df F value Pr(>F)
## group  2  0.7929  0.458
##       51

El estadístico de contraste F asciende a 0.7929 con un p valor de 0.45 > 0.05. Tenemos evidencia empírica suficiente para aceptar la hipótesis nula de homocedasticidad.

Como conclusión, no se acepta la normalidad en los grupos, los grupos tienen la misma distribución y se acepta la homocedasticidad. La prueba indicada de comparaciones de promedios es la prueba de Kruskal Wallis.

5.5. - TEST DE KRUSKAL WALLIS

kruskal.test(n_huevos ~condicion, data = datos)
## 
##  Kruskal-Wallis rank sum test
## 
## data:  n_huevos by condicion
## Kruskal-Wallis chi-squared = 19.964, df = 2, p-value = 4.623e-05

El test proporciona un p valor de 0.000 < 0.05.

Tenemos evidencia empírica suficiente para rechazar la hipótesis nula de igualdad de promedios entre los grupos.

Comparaciones post-hoc para saber que dos grupos difieren

Existen diferencias métodos de corrección del nivel de significancia, entre ellos destacan el de Bonferroni, que es muy estricto y el de holm, este último parece ser más recomendado.

pairwise.wilcox.test(x= datos$n_huevos, g = datos$condicion, p.adjust.method = "holm")
## Warning in wilcox.test.default(xi, xj, paired = paired, ...): cannot compute
## exact p-value with ties

## Warning in wilcox.test.default(xi, xj, paired = paired, ...): cannot compute
## exact p-value with ties
## 
##  Pairwise comparisons using Wilcoxon rank sum exact test 
## 
## data:  datos$n_huevos and datos$condicion 
## 
##            condicion1 condicion2
## condicion2 0.00029    -         
## condicion3 0.04795    0.00058   
## 
## P value adjustment method: holm

Condición 2 vs condición 1: El p valor es 0.00029 < 0.05. Las medias son diferentes.

Condición 3 vs condición 1: El p valor es 0.047 < 0.05. Las medias son diferentes.

Condición 3 vs condición 2: EL p valor es 0.00058 < 0.05. Las medias son diferentes.

Al nivel de significación del 5%, todas las medias son diferentes.

pairwise.wilcox.test(x= datos$n_huevos, g = datos$condicion, p.adjust.method = "bonferroni")
## Warning in wilcox.test.default(xi, xj, paired = paired, ...): cannot compute
## exact p-value with ties

## Warning in wilcox.test.default(xi, xj, paired = paired, ...): cannot compute
## exact p-value with ties
## 
##  Pairwise comparisons using Wilcoxon rank sum exact test 
## 
## data:  datos$n_huevos and datos$condicion 
## 
##            condicion1 condicion2
## condicion2 0.00029    -         
## condicion3 0.14386    0.00087   
## 
## P value adjustment method: bonferroni

Condición 2 vs condición 1: El p valor es 0.00029 < 0.05. Las medias son diferentes.

Condición 3 vs condición 1: El p valor es 0.14386 > 0.05. Las medias son iguales.

Condición 3 vs condición 2: EL p valor es 0.00087 < 0.05. Las medias son diferentes.

La condición 1 y la 3 presentan la misma media. Pero no para el resto de comparaciones.

6. - CONCLUSIÓN

El promedio de huevos de los insectos es similar, empleando la condición 3 y la 1. En cambio, para el resto de comparaciones, las medias de los huevos serían diferentes al nivel de significación del 5%.

7. - INFORMACIÓN DE LA SESIÓN

sesion_info <- devtools::session_info()
dplyr::select(
  tibble::as_tibble(sesion_info$packages),
  c(package, loadedversion, source)
)
## # A tibble: 69 × 3
##    package    loadedversion source        
##    <chr>      <chr>         <chr>         
##  1 abind      1.4-5         CRAN (R 4.2.0)
##  2 bslib      0.4.2         CRAN (R 4.2.2)
##  3 cachem     1.0.6         CRAN (R 4.2.2)
##  4 callr      3.7.3         CRAN (R 4.2.3)
##  5 car        3.1-2         CRAN (R 4.2.3)
##  6 carData    3.0-5         CRAN (R 4.2.3)
##  7 cli        3.6.0         CRAN (R 4.2.2)
##  8 colorspace 2.1-0         CRAN (R 4.2.3)
##  9 crayon     1.5.2         CRAN (R 4.2.3)
## 10 devtools   2.4.5         CRAN (R 4.2.3)
## # ℹ 59 more rows