A pesar de la sencillez y utilidad del t-test, para que sus resultados sean válidos es necesario que se cumplan una serie de condiciones, entre las que se encuentran:
Independencia: Las observaciones tienen que ser independientes las unas de las otras. Para ello, el muestreo debe ser aleatorio y el tamaño de la muestra inferior al 10% de la población. (Existe una adaptación de t-test para datos pareados)
Normalidad: Las poblaciones que se comparan tienen que seguir una distribución normal. Si bien la condición de normalidad recae sobre las poblaciones, no se suele disponer de información sobre ellas, por lo que se emplean las muestras (dado que son reflejo de la población) para determinarlo. En caso de cierta asimetría, los t-test son considerablemente robustos si el tamaño de las muestras es mayor o igual a 30.
Igualdad de varianza (homocedasticidad): la varianza de las poblaciones comparadas debe de ser igual. Tal como ocurre con la condición de normalidad, si no se dispone de información de las poblaciones, esta condición se ha de asumir a partir de las muestras. En caso de no cumplirse esta condición se puede emplear un Welch Two Sample t-test, que incorpora una corrección a través de los grados de libertad que compensa la diferencia de varianzas, con el inconveniente de que pierde poder estadístico.
Es importante evaluar hasta qué punto el no cumplimiento de una o varias de sus condiciones puede afectar al resultado del t-test. Si su utilización queda descartada, se puede recurrir a otros test estadísticos.
Una de las principales razones que por las que los investigadores descartan la utilización del t-test es por la falta de normalidad en la distribución de las muestras. Si bien es cierto que el t-test requiere como condición que las poblaciones de origen sigan una distribución normal, a medida que se incrementa el tamaño de las muestras se vuelve menos sensible al no cumplimiento de esta condición.
En el siguiente ejemplo se simulan dos poblaciones con la misma media, una de las cuales tiene mucha asimetría, y se evalúa el resultado de un t-test para diferentes tamaños muestrales.
x <- seq(0, 10, length = 1000)
y <- dlnorm(x = x, meanlog = 0.5, sdlog = 1)
plot(x, y, type = "l", lty = 1, xlab = "x", col = "blue", ylab = "Densidad",
main = "Distribuciones lognormal y normal con misma media",
xlim = c(-2, 10))
x_2 <- seq(-2, 10, length = 1000)
y_2 <- dnorm(x = x_2, mean = 2.718282, sd = 1)
lines(x_2, y_2, col = "red")
legend("topright",
legend = c("media lognormal = 2.72", "media normal = 2.72"),
col = c("blue", "red"), lty = 1, cex = 0.7)
Para los tamaños muestrales 5, 10, 20, 30, 50, 100, 200, 300, 500 se
extraen 1000 observaciones y se identifica el porcentaje test que se
considerarían significativos para un nivel de significancia α=0.05. El
nivel basal esperado es del 5%.
test_significativos <- vector(mode = "numeric")
tamanyo_muestral <- c(5, 10, 20, 30, 50, 100, 200, 300, 500, 1000)
for(i in tamanyo_muestral){
p_values <- rep(NA, 1000)
for(j in 1:1000) {
muestra_a <- rlnorm(n = i, meanlog = 0.5, sdlog = 1)
muestra_b <- rnorm(n = i, mean = 2.718282, sd = 1)
p_values[j] <- t.test(muestra_a, muestra_b, var.equal = FALSE)$p.value
}
test_significativos <- c(test_significativos, mean(p_values < 0.05)*100)
}
names(test_significativos) <- c(5, 10, 20, 30, 50, 100, 200, 300, 500, 1000)
test_significativos
## 5 10 20 30 50 100 200 300 500 1000
## 14.7 12.7 10.0 10.3 10.8 7.4 6.7 5.2 5.5 5.0
plot(x = tamanyo_muestral, y = test_significativos, type = "b", ylim = c(0,20),
ylab = "% de test significativos", xlab = "tamaño muestral")
abline(h = 5, col = "red")
La simulación muestra que, debido a la pronunciada desviación respecto
de la normalidad que presenta una de las poblaciones, para tamaños
muestrales por debajo de 100 observaciones el % de test que resultan
significativos está bastante por encima del nivel basal, lo que da lugar
a demasiados falsos positivos. A partir de 100 observaciones, el % de
test significativos se aproxima al nivel basal teórico (5%), por lo que
la capacidad del t-test pasa a ser buena.
Pa n > 200 el test Ttiene un nivel de falsos positivos cercanos al 5%. Pero para otros tamaños muestrales no los tiene. Esto esto se debe a que en muestras con reemplazamiento (mas) para tamaños muestrales menores a 100 la distribución de la media no se aproxima a la normal, partiendo de cualquier distribución (no se cumple el TCL)
Por este motivo no se debe aplicar el test de comparaciones T entre vairables cuantitativas si no tenemos normalidad y n < 200 se debe aplicar el test de Mann Witney, que es el test con un correcto porcentaje de falsos positivos (potente)
El test de Mann–Whitney–Wilcoxon (WMW), también conocido como Wilcoxon rank-sum test o u-test, es un test no paramétrico que contrasta si dos muestras proceden de poblaciones equidistribuidas.
La idea en la que se fundamenta este test es la siguiente: si las dos muestras comparadas proceden de la misma población, al juntar todas las observaciones y ordenarlas de menor a mayor, cabría esperar que las observaciones de una y otra muestra estuviesen intercaladas aleatoriamente. Por lo contrario, si una de las muestras pertenece a una población con valores mayores o menores que la otra población, al ordenar las observaciones, estas tenderán a agruparse de modo que las de una muestra queden por encima de las de la otra.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.2.3
set.seed(567)
datos <- data.frame(muestra = rep(c("A", "B"), each = 10),
valor = rnorm(n = 20, mean = 10, sd = 5),
cordenada_y = rep(0, 20))
ggplot(data = datos, aes(x = valor, y = cordenada_y)) +
geom_point(aes(colour = muestra), size = 3) +
ylab("") + xlab("rango") +
theme_bw() +
theme(axis.text.y = element_blank()) +
ggtitle("Muestras procedentes de la misma población")
set.seed(567)
datos <- data.frame(muestra = rep(c("A", "B"), each = 10),
valor = c(rnorm(n = 10, mean = 10, sd = 5), rnorm(n = 10, mean = 20, sd = 5)),
cordenada_y = rep(0, 20))
ggplot(data = datos, aes(x = valor, y = cordenada_y)) +
geom_point(aes(colour = muestra), size = 3) +
ylab("") + xlab("rango") +
theme_bw() +
theme(axis.text.y = element_blank()) +
ggtitle("Muestras procedentes de distintas poblaciones")
Acorde a esta idea, el test de Mann–Whitney–Wilcoxon contrasta que la
probabilidad de que una observación de la población X supere a una
observación de la población Y es igual a la probabilidad de que una
observación de la población Y supere a una de la población X. Es decir,
que los valores de una población no tienden a ser mayores que los de
otra.
Es común encontrar mencionado que el test de Mann–Whitney–Wilcoxon compara medianas, sin embargo, esto sólo es cierto cuando las poblaciones comparadas difieren únicamente es su localización, pero el resto de características (dispersión, asimetría…) son iguales.
Al igual que ocurre con muchos test no paramétricos, el test de Mann–Whitney–Wilcoxon es menos potente que el t-test (tienen menos probabilidad de rechazar la H0 cuando realmente es falsa) ya que ignora valores extremos. En el caso de los t-test, al trabajar con medias, si los tienen en cuenta. Esto hace a su vez que el test de Mann–Whitney–Wilcoxon sea una prueba más robusta que los t-test. En concreto, la pérdida de potencia es del 5%.
Supóngase que se dispone de dos muestras, de las que no se conoce el tipo de distribución de las poblaciones de origen y cuyo tamaño es demasiado pequeño para determinar si siguen una distribución normal. ¿Existe una diferencia significativa entre poblaciones? Se emplea un ejemplo con muestras pequeñas para poder ilustrar fácilmente los pasos, no significa que con muestras tan pequeñas el test de Mann–Whitney–Wilcoxon sea preciso
muestraX <- c(1.1, 3.4, 4.3, 2.1, 7.0, 2.5)
muestraY <- c(7.0, 8.0, 3.0, 5.0, 6.2, 4.4)
Al disponer de tan pocas observaciones y desconocer las poblaciones de origen, no se puede asumir que a excepción de su localización ambas distribuciones son iguales, por lo tanto, las hipótesis que contrasta el test de Mann–Whitney–Wilcoxon
Para poder aplicar el test de Mann–Whitney–Wilcoxon se requiere que la varianza sea igual en los dos grupos. Los test más recomendados para analizar homocedasticidad en estos casos son el test de Levene o el test de Fligner-Killeen, ambos trabajan con la mediana por lo que son menos sensibles a la falta de normalidad (si se está empleando un test de Mann–Whitney–Wilcoxon suele ser porque los datos no se distribuyen de forma normal).
fligner.test(x = list(muestraX, muestraY))
##
## Fligner-Killeen test of homogeneity of variances
##
## data: list(muestraX, muestraY)
## Fligner-Killeen:med chi-squared = 0.07201, df = 1, p-value = 0.7884
El test de Fligner-Killeen el estadístico asciende a 0.07 con un p valor de 0.78 > 0.05. Tenemos evidencia empírica suficiente para aceptar la hipótesis de homocedasticidad.
# Unión de las dos muestras.
observaciones <- sort(c(muestraX, muestraY))
observaciones
## [1] 1.1 2.1 2.5 3.0 3.4 4.3 4.4 5.0 6.2 7.0 7.0 8.0
# corregir las ligaduras
rango_observaciones <- rank(observaciones)
observaciones <- cbind(observaciones, rango_observaciones)
observaciones
## observaciones rango_observaciones
## [1,] 1.1 1.0
## [2,] 2.1 2.0
## [3,] 2.5 3.0
## [4,] 3.0 4.0
## [5,] 3.4 5.0
## [6,] 4.3 6.0
## [7,] 4.4 7.0
## [8,] 5.0 8.0
## [9,] 6.2 9.0
## [10,] 7.0 10.5
## [11,] 7.0 10.5
## [12,] 8.0 12.0
U = min (U1, U2)
U1 = n1*n2+(n1(n1+1))/2-R1
U1 = n1*n2+(n2(n2+1))2-R2
n1 = tamaño de la muestra del grupo 1. n2 = tamaño de la muestra del grupo 2. R1 = sumatorio de los rangos del grupo 1. R2 = sumatorio de los rangos del grupo 2.
R1 <- sum(1,5,6,2,10.5,3)
R2 <- sum(10.5, 12, 4, 8, 9, 7)
n1 <- length(muestraX)
n2 <- length(muestraY)
U1 <- (n1*n2)+(n1*(n1+1)/2-R1)
U2<- (n1*n2)+(n1*(n1+1)/2-R2)
U <- min(U1, U2)
U
## [1] 6.5
Cálculo de p-value
Una vez ha obtenido el valor del estadístico U se puede calcular cual es la probabilidad de que adquiera un valor igual o más extremo que el observado. Si el tamaño de las muestras es inferior a 10, se compara el valor obtenido de U con los valores de una tabla U de Mann-Whitney. Si el U es menor que el valor correspondiente en la tabla, la diferencia es significativa. En este caso, el valor de la tabla para α=0.05 , n1=6 y n2=6 es de 5. Dado que U obtenido es >5 no se considera significativa la diferencia. Si n1>10 y n2>10 se puede asumir que U se distribuye de forma aproximadamente normal, rechazando H0 si Z calculado es mayor que el valor de Z para el α elegido (este es método utilizado por defecto en R).
wilcox.test(x=muestraX, y=muestraY, alternative = "two.sided", paired = FALSE, conf.int = 0.95)
## Warning in wilcox.test.default(x = muestraX, y = muestraY, alternative =
## "two.sided", : cannot compute exact p-value with ties
## Warning in wilcox.test.default(x = muestraX, y = muestraY, alternative =
## "two.sided", : cannot compute exact confidence intervals with ties
##
## Wilcoxon rank sum test with continuity correction
##
## data: muestraX and muestraY
## W = 6.5, p-value = 0.07765
## alternative hypothesis: true location shift is not equal to 0
## 95 percent confidence interval:
## -4.9000274 0.4000139
## sample estimates:
## difference in location
## -2.390035
El estadístico W = 6.5 con un p valor de 0.77 > 0.05. Tenemos evidencia empírica suficiente para aceptar la hipótesis nula de igualdad de medias.
En la salida devuelta por la función, el valor W equivale a U.
Cuando hay ligaduras o ties, la función wilcox.test() no es capaz de calcular el p-value exacto por lo que devuelve una aproximación asumiendo que U se distribuye de forma ~ normal. En estos casos, o cuando los tamaños muestrales son mayores de 20 y se quiere la aproximación por la normal, es más recomendable emplear la función wilcox_test() del paquete coin.
library(coin)
## Warning: package 'coin' was built under R version 4.2.3
## Loading required package: survival
# La función wilcox.test() del paquete coin requiere pasarle los argumentos en
# forma de función (~), por lo que los datos tienen que estar almacenados en
# forma de data frame.
datos <- data.frame(
grupo = as.factor(rep(c("A", "B"), c(6, 6))),
valores = c(muestraX, muestraY))
wilcox_test(valores ~ grupo, data = datos, distribution = "exact", conf.int=0.95)
##
## Exact Wilcoxon-Mann-Whitney Test
##
## data: valores by grupo (A, B)
## Z = -1.8447, p-value = 0.06926
## alternative hypothesis: true mu is not equal to 0
## 95 percent confidence interval:
## -4.9 0.4
## sample estimates:
## difference in location
## -2.4
El estadístico z = -1.84 con un p valor de 0.069 > 0.05. Tenemos evidencia empírica suficiente par aaceptar la hipótesis nula de igualdad de medias.
Tamaño del efecto
t_efecto <- 1.8447/sqrt(n1+n2)
t_efecto
## [1] 0.532519
Una de las clasificaciones del tamaño más utilizada es:
0.1 = pequeño 0.3 = mediano ≥0.5 = grande
Tenemos un efecto grande, pero al aceptar H0 no es estadísticamente significativo.
Por ejemplo: si las dos muestras comparadas proceden de poblaciones con asimetrías en direcciones opuestas, a pesar de que tanto la media como la mediana sean exactamente las mismas en ambos grupos, el p-value obtenido puede ser muy bajo.
grupo_a <- c(5, 5, 5, 5, 5, 5, 7, 8, 9, 10)
grupo_b <- c(1, 2, 3 ,4, 5, 5, 5, 5, 5, 5)
par(mfrow = c(1,2))
hist(grupo_a, col = "cyan4", main = "")
hist(grupo_b, col = "firebrick", main = "")
wilcox.test(grupo_a, grupo_b, paired = FALSE)
## Warning in wilcox.test.default(grupo_a, grupo_b, paired = FALSE): cannot
## compute exact p-value with ties
##
## Wilcoxon rank sum test with continuity correction
##
## data: grupo_a and grupo_b
## W = 82, p-value = 0.007196
## alternative hypothesis: true location shift is not equal to 0
El p-valor obtenido indica claras evidencias en contra de la hipótesis nula de que las medianas de ambos grupos son iguales. Sin embargo, si se calculan las medianas de las muestras, el resultado es el mismo.
median(grupo_a)
## [1] 5
median(grupo_b)
## [1] 5
Por otro lado, el test de Mann–Whitney–Wilcoxon incrementa su sensibilidad a diferencias más allá de las medianas. Por ejemplo, aumenta el poder estadístico de detectar diferencias significativas en la probabilidad de que observaciones de un grupo superen a las del otro debido únicamente a diferencias en la dispersión de las poblaciones de origen y no porque sus medianas sean distintas. Si el objetivo del estudio es identificar cualquier diferencia distribucional, esto no supone un problema, pero si lo que se quiere comparar son las medianas, se obtendrán p-values que no se corresponden con la pregunta que el investigador quiere responder.
x <- seq(0, 5, length = 1000)
y <- dlnorm(x = x, meanlog = 0.5, sdlog = 1.7)
plot(x, y, type = "l", lty = 1, xlab = "x", col = "blue", ylab = "Densidad",
main = "Distribuciones lognormal y normal con misma mediana", xlim=c(-5, 5))
x_2 <- seq(-5, 5, length = 1000)
y_2 <- dnorm(x = x_2, mean = 1.648721, sd = 1)
lines(x_2, y_2, col = "red")
legend("topright",
legend = c("mediana lognormal = 0.5", "mediana normal = 0.5"),
col = c("blue", "red"), lty = 1,cex = 0.7)
set.seed(888)
muestra_a <- rlnorm(n = 20, meanlog = 0.5, sdlog = 1.7)
muestra_b <- rnorm(n = 20, mean = 1.648721, sd = 1)
par(mfrow = c(1,2))
hist(muestra_a, breaks = 10, main = "", col = "blue")
hist(muestra_b, breaks = 10, main = "", col = "red")
En base a la falta de normalidad de la muestra a, el investigador
considera que el t-test no es adecuado para comparar la localización de
las poblaciones y decide que quiere comparar medianas con el test de
Mann–Whitney–Wilcoxon.
wilcox.test(muestra_a, muestra_b, paired = FALSE)
##
## Wilcoxon rank sum exact test
##
## data: muestra_a and muestra_b
## W = 196, p-value = 0.9254
## alternative hypothesis: true location shift is not equal to 0
EL resultado le indica que no hay evidencias para considerar que la localización de las poblaciones es distinta y concluye que las medianas de ambas poblaciones son iguales.
Véase lo que ocurre si el tamaño muestral se incrementa de 20 a 1000 observaciones.
set.seed(888)
muestra_a <- rlnorm(n = 1000, meanlog = 0.5, sdlog = 1.7)
muestra_b <- rnorm(n = 1000, mean = 1.648721, sd = 1)
wilcox.test(muestra_a,muestra_b, paired = FALSE)
##
## Wilcoxon rank sum test with continuity correction
##
## data: muestra_a and muestra_b
## W = 551900, p-value = 5.842e-05
## alternative hypothesis: true location shift is not equal to 0
En este caso, la conclusión obtenida es totalmente opuesta, hay muchas evidencias en contra de la hipótesis nula de que ambas poblaciones tienen la misma localización por lo que el investigador podría concluir erróneamente que las medianas de ambas poblaciones son distintas.
En estos casos, usaríamos la comparación de medias basada en la T de Student.
sesion_info <- devtools::session_info()
dplyr::select(
tibble::as_tibble(sesion_info$packages),
c(package, loadedversion, source)
)
## # A tibble: 80 × 3
## package loadedversion source
## <chr> <chr> <chr>
## 1 bslib 0.4.2 CRAN (R 4.2.2)
## 2 cachem 1.0.6 CRAN (R 4.2.2)
## 3 callr 3.7.3 CRAN (R 4.2.3)
## 4 cli 3.6.0 CRAN (R 4.2.2)
## 5 codetools 0.2-18 CRAN (R 4.2.2)
## 6 coin 1.4-2 CRAN (R 4.2.3)
## 7 colorspace 2.1-0 CRAN (R 4.2.3)
## 8 crayon 1.5.2 CRAN (R 4.2.3)
## 9 devtools 2.4.5 CRAN (R 4.2.3)
## 10 digest 0.6.31 CRAN (R 4.2.2)
## # ℹ 70 more rows