1 Contrastes paramétricos frente a no paramétricos

Una de las primeras dificultades con las que uno se encuentra al hacer estadística es decidir correctamente qué prueba utilizar en un caso concreto. Esta decisión depende del tipo de datos que estemos manejando (y las suposiciones que podemos hacer) y de lo que queramos contrastar.

Debido a la gran importancia que tienen las suposiciones sobre la distribución (normalidad, simetría, etc.) los contrastes se pueden dividir entre paramétricos y no paramétricos. La estadística paramétrica es aquella en la que se tiene (o se asume) cierta información sobre la distribución de probabilidad de la población y se quiere decidir sobre los parámetros que la definen. Por ejemplo, la prueba t supone que la población es normal y se decide sobre la media.

Los casos en los que no se tenga información sobre la distribución (o no se pueda asumir) son los que trata la estadística no paramétrica. También se suele denominar libre de distribución (debido a que algunos autores consideran una definición más amplia de estadística no paramétrica).

Se deben emplear pruebas no paramétricas en lugar de paramétricas cuando:

  • los datos se puedan ordenar de alguna manera (ordinales) pero no haya normalidad. Por ejemplo, datos provenientes de escalas Likert donde “1” significa “Muy en desacuerdo” y “10” “Muy de acuerdo”;
  • los datos son categóricos o nominales, esto es, se pueden distinguir en categorías. Por ejemplo, datos de personas según sexo o raza;
  • los datos son numéricos pero no provienen de una normal. En este caso se podría intentar emplear transformaciones de datos para lograr normalidad.

Muchos de los métodos paramétricos, por suerte, funcionan bien cuando la normalidad solo se puede suponer aproximadamente. Por otro lado, los no paramétricos se ha visto que son casi tan capaces de detectar diferencias entre poblaciones como los paramétricos cuando se cumplen todos los supuestos, y cuando no se cumplen a menudo son más potentes en hacerlo. Por esa razón, algunos estadísticos prefieren utilizar contrastes no paramétricos frente a sus análogos paramétricos (ver Wackerly, Mendenhall, & Scheaffer, 2008).

Un resumen de las pruebas que veremos en este tema junto con sus alternativas paramétricas se recogen en la siguiente tabla:

Pruebas paramétricas y no paramétricas
Comparar \ Tipo de datos Paramétricos Ordinales Categóricos
Dos grupos independientes t independiente Mann-Whitney Exacto de Fisher
Dos grupos dependientes t dependiente Wilcoxon McNemar
Dos o más grupos independientes ANOVA de una vía Kruskal-Wallis Chi-cuadrado
Dos o más grupos dependientes ANOVA medidas repetidas Friedman Q de Cochran

Nota: En el enlace Motulsky (2012) se puede encontrar más información y una tabla más amplia que la anterior.

2 Datos ordinales

En este apartado nos centramos en las diferentes pruebas que podemos utilizar cuando los datos de los que disponemos se pueden ordenar de alguna manera. Por ejemplo, las ya comentadas escalas Likert.

Las pruebas que veremos en este apartado se basan en el cálculo de los números de orden o rangos (del inglés ranking). Los números de orden de un vector son los valores que resultan de ordenarlos de menor a mayor y asignar a cada elemento su posición. Por ejemplo, si tenemos un vector con cinco valores el vector de números de orden asigna al menor de ellos un “1” y al mayor un “5”. Veamos un ejemplo sencillo de cómo se calcula el vector de números de orden.

vector       <- c( 14, 10, 13, 11, 12, 17, 19 )
rangosVector <- rank( vector ) # números de orden
rbind( vector, rangosVector ) # mostrar los dos vectores por filas
##              [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## vector         14   10   13   11   12   17   19
## rangosVector    5    1    4    2    3    6    7

Como podemos ver, el primer valor del vector es “14”. El primer número de orden (correspondiente al “14”) indica la posición que le correspondería a ese valor si se ordenara el vector de menor a mayor. El “14” es el quinto valor más pequeño del vector (más pequeños son 10, 11, 12 y 13), por lo que si se ordenara quedaría en la posición “5”. Así, el primer número de orden es “5”.

¿Y si hubieran dos valores “14”? Al ordenar nos quedarían en las posiciones “5” y “6”, ¿qué números de orden se les asignan? La función rank() por defecto les asigna a cada uno el valor medio “5.5”, pero con el argumento ties.method se puede cambiar.

vector2       <- c( 14, 10, 13, 11, 12, 14, 19 )
rangosVector2 <- rank( vector2, ties.method = "average" )
rbind( vector2, rangosVector2 )
##               [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## vector2       14.0   10   13   11   12 14.0   19
## rangosVector2  5.5    1    4    2    3  5.5    7

2.1 Comparación entre dos grupos

Pasamos a ver algunas pruebas no paramétricas para comparar las distribuciones de dos grupos.

2.1.1 Prueba U de Mann-Whitney (suma de rangos de Wilcoxon)

La prueba U de Mann-Whitney, conocida simplemente como U-test y equivalente a la prueba de los rangos sumados de Wilcoxon, es la prueba no paramétrica alternativa al t-test para muestras independientes (unpaired en inglés).

Se utiliza cuando los datos son ordinales (que tienen un orden) pero no se puede asumir normalidad. Así, cuando tenemos muestras pequeñas se prefiere el U-test antes que el t-test. Al contrario de lo que mucha gente cree, y se encuentra erróneamente en bastantes artículos, el U-test requiere de homogeneidad de varianzas (homocedasticidad). Y otro detalle es que aunque el U-test se considera el equivalente no paramétrico al t-test, este compara medianas y no medias.

Este test, al utilizar números de orden o rangos, también es preferible cuando existen valores atípicos.

2.1.1.1 ¿Cómo funciona la prueba U de Mann-Whitney?

Supongamos que tenemos un par de muestras y queremos contrastar si hay diferencias entre las poblaciones de las que provienen.

muestraA <- c( 1.1, 3.4, 4.3, 2.1, 7.0 , 2.5 )
muestraB <- c( 7.0, 8.0, 3.0, 5.0, 6.2 , 4.4 )

La idea que hay detrás del U-test es juntar las dos muestras y asignar a cada valor un número de orden, esto es, al valor más pequeño se le asigna un “1”, al segundo más pequeño un “2”, y así hasta el más grande (en este caso, el valor más grande es “8.0” y, por tanto, se le asigna un “12”). Si hubiera valores repetidos, llamadas ligaduras (o ties en inglés), se les asigna la media (en este caso, el valor “7.0” está repetido y en lugar de asignarles “10” y “11” se les asigna “10.5” a cada uno).

muestraTotal  <- c( muestraA, muestraB ) # unión de las muestras
rangosMuestra <- rank( muestraTotal )
muestraTotal  <- cbind( muestraTotal, rangosMuestra )
muestraTotal
##       muestraTotal rangosMuestra
##  [1,]          1.1           1.0
##  [2,]          3.4           5.0
##  [3,]          4.3           6.0
##  [4,]          2.1           2.0
##  [5,]          7.0          10.5
##  [6,]          2.5           3.0
##  [7,]          7.0          10.5
##  [8,]          8.0          12.0
##  [9,]          3.0           4.0
## [10,]          5.0           8.0
## [11,]          6.2           9.0
## [12,]          4.4           7.0

Después se suman los números de orden para cada muestra (el mínimo de estos dos valores, que llamamos \(R_1\) y \(R_2\), es lo que se conoce como suma de rangos de Wilcoxon). El estadístico U estará definido como

\[U_1 = R_1 - \frac{n_1 (n_1 + 1)}{2}\] \[U_2 = R_2 - \frac{n_2 (n_2 + 1)}{2}\] \[U = \min(U_1, U_2)\]

donde \(n_1\) y \(n_2\) son los tamaños de cada muestra.

sumaRangosA <- sum( rangosMuestra[ 1:6 ] )
sumaRangosB <- sum( rangosMuestra[ 6:12 ] )
n1 <- length( muestraA )
n2 <- length( muestraB )
U1 <- sumaRangosA - n1 * ( n1 + 1 ) / 2
U2 <- sumaRangosB - n2 * ( n2 + 1 ) / 2
c( U1, U2 )
## [1]  6.5 32.5

En la práctica, cuando aparecen ligaduras (valores repetidos) no se calcula el valor exacto del estadístico U; se calcula una aproximación.

2.1.1.2 En R

Para hacer todos estos cálculos con R podemos utilizar la función wilcox.test().

wilcox.test( muestraA, muestraB )
## Warning in wilcox.test.default(muestraA, muestraB): cannot compute exact p-
## value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  muestraA and muestraB
## W = 6.5, p-value = 0.07765
## alternative hypothesis: true location shift is not equal to 0

Nota: El estadístico U en R se denomina W. Por defecto en la función se tiene paired = FALSE. Nos aparece un mensaje de aviso (que no de error) debido a que las ligaduras no permiten calcular el p-valor exacto (se usa una aproximación a la normal).

El estadístico U se aproxima a una distribución normal (cuando los tamaños muestrales son mayores a 20 se considera muy buena) y, por tanto, se puede tipificar a una normal Z (hay fórmulas con las que se pueden calcular la media y la desviación típica). En R podemos emplear la función wilcox_test() del paquete coin (no preinstalado por defecto) que requerirá un fórmula como argumento (no la pareja de muestras). Es la opción recomendada si hay ligaduras en los datos.

## install.packages( "coin" )
library( "coin" )
grupo <- factor( c( rep( "A", length(muestraA) ),
                    rep( "B", length(muestraB) ) ) )
muestraTotal <- c( muestraA, muestraB )
wilcox_test( muestraTotal ~ grupo, distribution = "exact" )
## 
##  Exact Wilcoxon-Mann-Whitney Test
## 
## data:  muestraTotal by grupo (A, B)
## Z = -1.8447, p-value = 0.06926
## alternative hypothesis: true mu is not equal to 0

2.1.1.3 Tamaño del efecto

El tamaño del efecto para un U-test se calcula a partir de la \(Z\) que nos devuelve la función wilcox_test() con la fórmula

\[r=\dfrac {Z} {\sqrt {N}} \]

donde \(N\) es el tamaño total de la muestra (\(N = n_1 + n_2\)). El signo no importa, así que se comunica el valor absoluto de \(r\).

Tamaño del efecto
Pequeño Mediano Grande
abs(r) 0.1 0.3 0.5

En nuestro caso anterior

N            <- length( muestraA ) + length ( muestraB ) # tamaño muestral
wilcoxTest   <- wilcox_test( muestraTotal ~ grupo, distribution = "exact" )
tamañoEfecto <- statistic( wilcoxTest ) / sqrt( N )
tamañoEfecto
##          A 
## -0.5325195

2.1.1.4 Ejemplo

Supongamos que queremos saber las diferencias de opinión entre jóvenes y adultos sobre una cierta ley. Para ello se ha pasado una encuesta en la que se ha puntuado de 1 a 10 el grado de acuerdo (siendo “1” “Muy en desacuerdo” y “10” “Muy de acuerdo”). ¿La respuesta de los jóvenes es más negativa que la de los adultos?

dfEncuesta <- read.table( "files/feir50A-encuesta.csv" , header = TRUE, sep = ";" )
head( dfEncuesta )
##   grupo opinion
## 1 joven       3
## 2 joven       4
## 3 joven       5
## 4 joven       4
## 5 joven       8
## 6 joven       4
wilcox.test( dfEncuesta$opinion ~ dfEncuesta$grupo, alternative = "greater" )
## Warning in wilcox.test.default(x = c(9L, 10L, 3L, 5L, 9L, 4L, 6L, 7L, 5L, :
## cannot compute exact p-value with ties
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  dfEncuesta$opinion by dfEncuesta$grupo
## W = 78, p-value = 0.01796
## alternative hypothesis: true location shift is greater than 0

Como el p-valor es menor a 0.05 rechazamos la hipótesis nula a favor de la alternativa de que los adultos están más de acuerdo con la ley.

wilcoxTest <- wilcox_test( dfEncuesta$opinion ~ dfEncuesta$grupo, alternative = "greater",
                           distribution = "exact" )
N          <- nrow( dfEncuesta ) # tamaño muestral
statistic( wilcoxTest ) / sqrt( N ) # tamaño del efecto
##    adulto 
## 0.4776153

En valor absoluto obtenemos un tamaño del efecto de 0.4776, cercano a considerarse grande.

Nota: En este ejemplo solo hemos visto cómo aplicar la prueba U. Para que fuese completo se debería contrastar primero si cumple el requisito de homogeneidad de varianzas con, por ejemplo, el test de Levene.

2.1.2 Prueba de los rangos con signo de Wilcoxon

La prueba de los rangos con signo de Wilcoxon (Wilcoxon Signed-rank test en inglés), también conocida como test de Wilcoxon, es la versión no paramétrica del t-test para muestras dependientes. Igual que la prueba U de Mann-Whitney este test compara medianas en lugar de medias.

2.1.2.1 ¿Cómo funciona el test de los rangos con signo de Wilcoxon?

Cuando tenemos muestras dependientes lo primero que se hace habitualmente es calcular sus diferencias. La idea de esta prueba es guardar los signos de esas diferencias y, con los valores absolutos, asignar números de orden como en la prueba de Mann-Whitney (quitando los de diferencia nula).

grupoAntes       <- c( 2, 4, 6, 1, 3 )
grupoDespues     <- c( 5, 2, 7, 1, 6 )
grupoDiferencia  <- grupoAntes - grupoDespues
rangosDiferencia <- rank( abs( grupoDiferencia[ grupoDiferencia != 0 ] ) )
## el resultado de los números de orden es c( 3.5, 2.0, 1.0, 3.5 )
## añadimos un 0 a mano para cuadrar la tabla
rangosDiferencia <- c( 3.5, 2.0, 1.0, 0, 3.5 )
dfGrupo <- data.frame( grupoAntes, grupoDespues, sign( grupoDiferencia ), 
                     abs( grupoDiferencia ), rangosDiferencia )
names(dfGrupo ) <- c( "antes", "despues", "signo", "diferencia", "rangos" )
dfGrupo
##   antes despues signo diferencia rangos
## 1     2       5    -1          3    3.5
## 2     4       2     1          2    2.0
## 3     6       7    -1          1    1.0
## 4     1       1     0          0    0.0
## 5     3       6    -1          3    3.5

Una vez hecho esto hay que sumar, por un lado, los números de orden que provienen de diferencias positivas y, por otro lado, los de diferencias negativas (los de diferencias nulas no se suman). El mínimo de estos dos valores es el valor del estadístico W de Wilcoxon.

\[W_+ = \sum_{\text{signo}>0} \text{rango}(i)\] \[W_- = \sum_{\text{signo}<0} \text{rango}(i)\] \[W = \min(W_+, W_-)\]

donde \(\text{rango}(i)\) es el número de orden que le corresponde a la observación \(i\).

sumaPositivos <- sum( dfGrupo[ dfGrupo$signo ==  1, ]$rangos )
sumaNegativos <- sum( dfGrupo[ dfGrupo$signo == -1, ]$rangos )
c( sumaPositivos, sumaNegativos )
## [1] 2 8

2.1.2.2 En R

Para hacer estos cálculos con R podemos utilizar la función wilcox.test() con el argumento paired = TRUE.

wilcox.test( grupoAntes, grupoDespues, paired = TRUE )
## Warning in wilcox.test.default(grupoAntes, grupoDespues, paired = TRUE):
## cannot compute exact p-value with ties
## Warning in wilcox.test.default(grupoAntes, grupoDespues, paired = TRUE):
## cannot compute exact p-value with zeroes
## 
##  Wilcoxon signed rank test with continuity correction
## 
## data:  grupoAntes and grupoDespues
## V = 2, p-value = 0.3573
## alternative hypothesis: true location shift is not equal to 0

Nota: El estadístico se denomina V en lugar de W. Cuando hay ceros o ligaduras se calcula un p-valor aproximado.

Este estadístico W (denominado V en R) también se puede tipificar a un valor Z (hay fórmulas para la media y la varianza) que será útil para calcular posteriormente el tamaño del efecto. En R se puede utilizar la función wilcoxsign_test() del paquete coin. Es el recomendado cuando hay ligaduras o ceros.

## install.packages( "coin" )
library( "coin" )
wilcoxsign_test( grupoAntes ~ grupoDespues, distribution = "exact" )
## 
##  Exact Wilcoxon-Pratt Signed-Rank Test
## 
## data:  y by x (pos, neg) 
##   stratified by block
## Z = -1.0937, p-value = 0.375
## alternative hypothesis: true mu is not equal to 0

2.1.2.3 Tamaño del efecto

El tamaño del efecto para un test de Wilcoxon se calcula y considera de manera similar al del test de Mann-Whitney

\[r=\dfrac {Z} {\sqrt {N}}\]

donde \(N\) es el tamaño total de la muestra (aunque hayan sido observaciones sobre los mismos sujetos).

En nuestro caso anterior

N              <- length( grupoAntes ) + length ( grupoDespues ) # tamaño muestral
wilcoxSignTest <- wilcoxsign_test( grupoAntes ~ grupoDespues, distribution = "exact" )
statistic( wilcoxSignTest ) / sqrt( N ) # tamaño del efecto
##        pos 
## -0.3458702

2.1.3 Otros contrastes

2.1.3.1 Test de Kolmogorov-Smirnov para dos muestras

Sirve también para comparar dos muestras independientes, es decir, es una alternativa al U-test. En este caso, sin embargo, se comparan distribuciones de probabilidad en general (posición, forma, etc.); por tanto, se podría dar el caso que diera resultados distintos a la prueba U. Ver ?ks.test().

Algunos test del siguiente apartado también se pueden utilizar para comparar dos grupos.