Las pruebas no paramétricas representan una herramienta estadística fundamental cuando los datos no se ajustan a los supuestos de las pruebas paramétricas tradicionales, como la normalidad. Diseñar una clase efectiva para enseñar estas pruebas en RStudio implica combinar una sólida comprensión teórica con la aplicación práctica en un entorno que facilita el análisis y la visualización de datos. Esta guía te proporcionará una estructura detallada para desarrollar un curso completo y atractivo.
Las pruebas no paramétricas, también conocidas como pruebas de distribución libre, son métodos estadísticos que no requieren que los datos sigan una distribución particular, como la distribución normal. Son especialmente útiles cuando:
A diferencia de las pruebas paramétricas que a menudo se centran en la media, las pruebas no paramétricas suelen examinar hipótesis relacionadas con la mediana, los rangos o la forma general de la distribución.
Ilustración sobre la decisión entre pruebas paramétricas y no paramétricas.
R es un lenguaje de programación y entorno de software libre extremadamente potente para el cálculo estadístico y la generación de gráficos. Ofrece una vasta colección de paquetes y funciones integradas para realizar una amplia gama de análisis, incluidas las pruebas no paramétricas.
RStudio es un Entorno de Desarrollo Integrado (IDE) para R. Proporciona una interfaz gráfica amigable que facilita enormemente el trabajo con R, ofreciendo herramientas para:
La combinación de R y RStudio es ideal para enseñar y aplicar pruebas no paramétricas debido a su flexibilidad, potencia y la gran comunidad de usuarios que ofrece soporte y recursos.
Una clase bien estructurada facilitará el aprendizaje progresivo. A continuación, se propone un diseño modular que abarca desde los conceptos básicos hasta aplicaciones más específicas.
Se discutirán los supuestos fundamentales de las pruebas paramétricas (normalidad de los datos, homogeneidad de varianzas) y las consecuencias de violarlos. Se introducirán las pruebas no paramétricas como alternativas robustas cuando estos supuestos no se cumplen.
Este segmento cubrirá brevemente la instalación de R y RStudio, la creación de un nuevo proyecto para organizar el trabajo, la interfaz de RStudio (consola, editor de scripts, panel de entorno/historial, panel de archivos/gráficos/paquetes), y cómo instalar y cargar paquetes necesarios (usando install.packages("nombre_paquete")
y library(nombre_paquete)
).
Antes de decidirse por una prueba paramétrica, es crucial verificar la normalidad de los datos. Se enseñará a utilizar pruebas formales como el test de Shapiro-Wilk y métodos gráficos.
// Ejemplo: Test de Shapiro-Wilk en R
# Generar datos de ejemplo
datos_ejemplo <- rnorm(100) # Datos normalmente distribuidos
datos_no_normales <- rexp(100) # Datos con distribución exponencial (no normal)
# Aplicar test de Shapiro-Wilk
shapiro.test(datos_ejemplo)
shapiro.test(datos_no_normales)
# Interpretación:
# Si el p-valor es > 0.05, no se rechaza la hipótesis nula de normalidad.
# Si el p-valor es <= 0.05, se rechaza la hipótesis nula, sugiriendo que los datos no son normales.
# Visualización para evaluar normalidad
par(mfrow=c(1,2)) # Organizar gráficos en una fila y dos columnas
hist(datos_no_normales, main="Histograma de Datos No Normales")
qqnorm(datos_no_normales, main="Q-Q Plot de Datos No Normales")
qqline(datos_no_normales, col="red")
par(mfrow=c(1,1)) # Restaurar configuración de gráficos
Ejemplo de Q-Q plot utilizado para la evaluación visual de la normalidad de los datos. Una desviación significativa de la línea recta sugiere no normalidad.
Es la alternativa no paramétrica a la prueba t de Student para muestras independientes. Se utiliza para comparar las medianas (o más precisamente, las distribuciones) de dos grupos independientes. La función en R es wilcox.test()
especificando paired = FALSE
.
// Ejemplo: Prueba U de Mann-Whitney
grupo_A <- c(10, 12, 15, 11, 14)
grupo_B <- c(16, 18, 15, 19, 20)
wilcox.test(grupo_A, grupo_B, paired = FALSE, alternative = "two.sided")
# alternative puede ser "two.sided", "less", o "greater"
Es la alternativa no paramétrica a la prueba t de Student para muestras pareadas. Se utiliza para comparar las medianas de dos grupos dependientes o para comparar la mediana de una muestra con un valor de referencia. La función en R es wilcox.test()
especificando paired = TRUE
.
// Ejemplo: Prueba de Wilcoxon para rangos con signo
medicion_antes <- c(25, 30, 28, 35, 32)
medicion_despues <- c(22, 27, 25, 30, 29)
wilcox.test(medicion_antes, medicion_despues, paired = TRUE, alternative = "greater")
Una prueba simple para datos pareados que solo considera la dirección de la diferencia (positiva o negativa) entre pares de observaciones, ignorando la magnitud. Puede ser útil cuando los datos son muy asimétricos o tienen muchos outliers. La función SIGN.test()
se encuentra en paquetes como BSDA
o DescTools
.
// Ejemplo: Prueba del Signo (requiere paquete BSDA o similar)
# install.packages("BSDA")
library(BSDA)
SIGN.test(medicion_antes, medicion_despues, alternative = "greater")
La siguiente tabla resume algunas de las pruebas no paramétricas más utilizadas, sus contrapartes paramétricas y sus funciones en R.
Prueba No Paramétrica | Análogo Paramétrico | Nº de Grupos | Tipo de Muestras | Hipótesis Principal | Función en R (Paquete Base 'stats' salvo se indique) |
---|---|---|---|---|---|
U de Mann-Whitney | Prueba t para muestras independientes | 2 | Independientes | Igualdad de medianas/distribuciones | wilcox.test(..., paired = FALSE) |
Wilcoxon (rangos con signo) | Prueba t para muestras pareadas | 2 (o 1 vs valor teórico) | Dependientes/Pareadas | Igualdad de medianas de diferencias | wilcox.test(..., paired = TRUE) |
Prueba del Signo | Prueba t para muestras pareadas (menos potente) | 2 (o 1 vs valor teórico) | Dependientes/Pareadas | Igualdad de medianas de diferencias (basada en signos) | SIGN.test() (e.g., paquete BSDA ) |
Kruskal-Wallis | ANOVA de un factor | ≥3 | Independientes | Igualdad de medianas/distribuciones entre grupos | kruskal.test() |
Friedman | ANOVA de medidas repetidas | ≥3 | Dependientes/Medidas Repetidas | Igualdad de medianas/distribuciones entre tratamientos | friedman.test() |
Chi-Cuadrado de Independencia | (Para asociación) | ≥2 por variable | Independientes (categóricas) | Independencia entre variables categóricas | chisq.test() |
Prueba Exacta de Fisher | (Para asociación, muestras pequeñas) | 2x2 tablas (generalizable) | Independientes (categóricas) | Independencia entre variables categóricas | fisher.test() |
Correlación de Spearman | Correlación de Pearson | N/A (2 variables) | Ordinales o continuas no normales | Asociación monotónica | cor.test(..., method="spearman") |
Prueba de Jonckheere-Terpstra | (ANOVA con tendencia ordenada) | ≥3 | Independientes (con ordenamiento natural) | Tendencia ordenada en las medianas | jonckheere.test() (e.g., paquete DescTools o coin ) |
Prueba de Rachas (Runs Test) | N/A | 1 secuencia | Datos secuenciales | Aleatoriedad de la secuencia | runs.test() (e.g., paquete tseries o randtests ) |
Es la alternativa no paramétrica al ANOVA de un factor. Se utiliza para determinar si existen diferencias estadísticamente significativas entre las medianas de tres o más grupos independientes. La función en R es kruskal.test()
.
// Ejemplo: Prueba de Kruskal-Wallis
# Datos: rendimiento (valor) según tres tipos de fertilizantes (grupo)
datos_kruskal <- data.frame(
valor = c(4.6, 4.9, 5.0, 5.7, # Fertilizante 1
6.0, 6.8, 8.1, # Fertilizante 2
5.5, 5.9, 6.2, 6.5), # Fertilizante 3
grupo = factor(rep(c("F1", "F2", "F3"), times = c(4, 3, 4)))
)
kruskal.test(valor ~ grupo, data = datos_kruskal)
# Si el p-valor es significativo, indica que al menos un grupo difiere de los otros.
# Se necesitarían pruebas post-hoc (ej. Dunn's test, Conover-Iman test) para identificar qué grupos difieren.
Es la alternativa no paramétrica al ANOVA de medidas repetidas. Se utiliza para detectar diferencias en los tratamientos a través de múltiples intentos o condiciones en los mismos sujetos. La función en R es friedman.test()
.
// Ejemplo: Prueba de Friedman
# Datos: puntuaciones de 5 sujetos (bloque) bajo 3 condiciones (tratamiento)
# Los datos deben estar en formato "largo" o matricial.
# Ejemplo con formato matricial:
matriz_friedman <- matrix(c(
7, 8, 9, # Sujeto 1, Cond A, B, C
6, 7, 8, # Sujeto 2, Cond A, B, C
5, 6, 7, # Sujeto 3, Cond A, B, C
8, 9, 9, # Sujeto 4, Cond A, B, C
7, 7, 8 # Sujeto 5, Cond A, B, C
), ncol = 3, byrow = TRUE,
dimnames = list(Sujeto = paste0("S", 1:5), Tratamiento = c("A", "B", "C")))
friedman.test(matriz_friedman)
# Alternativamente, con datos en formato largo:
# datos_friedman_largo <- data.frame(
# puntuacion = c(7,8,9,6,7,8,5,6,7,8,9,9,7,7,8),
# sujeto = factor(rep(1:5, each=3)),
# tratamiento = factor(rep(c("A","B","C"), times=5))
# )
# friedman.test(puntuacion ~ tratamiento | sujeto, data = datos_friedman_largo)
Este mapa mental ofrece una visión general de la estructura propuesta para la clase, facilitando la comprensión de cómo se interconectan los diferentes módulos y temas.
Se utiliza para determinar si existe una asociación significativa entre dos variables categóricas. La función en R es chisq.test()
.
Una alternativa a la prueba Chi-Cuadrado cuando las frecuencias esperadas en las celdas de la tabla de contingencia son pequeñas (generalmente, si alguna es menor a 5). La función en R es fisher.test()
.
Mide la fuerza y dirección de la asociación monotónica entre dos variables clasificadas (ordinales) o continuas que no cumplen el supuesto de normalidad para la correlación de Pearson. La función en R es cor.test(..., method="spearman")
.
Útil para probar la presencia de una tendencia ordenada en las medianas de varios grupos independientes, donde los grupos tienen un orden natural (ej. dosis crecientes de un medicamento). La función jonckheere.test()
se encuentra en paquetes como DescTools
o coin
.
Evalúa si una secuencia de datos binarios (o datos que pueden ser dicotomizados) es aleatoria. Se puede encontrar en paquetes como tseries
o randtests
.
Se enfatizará la correcta interpretación del p-valor, la magnitud del efecto (cuando sea aplicable), y la importancia de la reproducibilidad en la investigación. Se discutirán las mejores formas de reportar los resultados de las pruebas no paramétricas, incluyendo el estadístico de prueba, los grados de libertad (si aplica), y el p-valor. También se mencionará la utilidad de la visualización de datos (e.g., boxplots, barplots) para complementar los resultados numéricos, utilizando paquetes como ggplot2
.
El siguiente gráfico de radar ofrece una comparación cualitativa de algunas características importantes de las pruebas no paramétricas discutidas. Estos son valores representativos y de opinión para ilustrar las diferencias relativas, donde una puntuación más alta (en una escala de 1 a 5) generalmente indica una mayor fortaleza en esa característica.
Para estudiantes más avanzados o cursos con mayor duración, se puede introducir brevemente cómo la programación funcional y los sistemas de objetos de R (como S3) permiten crear funciones personalizadas o "clases" (en un sentido más informal) para encapsular la lógica de realizar múltiples pruebas, generar reportes estandarizados o visualizar resultados de forma modular y reutilizable.
Por ejemplo, se podría diseñar una función que tome un conjunto de datos y variables, y automáticamente seleccione y ejecute la prueba no paramétrica más adecuada, devolviendo un objeto con los resultados formateados.
// Ejemplo conceptual de una función contenedora
# Definir un constructor simple para un objeto de prueba (estilo S3)
AnalisisNoParametrico <- function(datos, variable_respuesta, variable_agrupacion, tipo_prueba_sugerida) {
obj <- list(
datos_originales = datos,
respuesta = variable_respuesta,
agrupacion = variable_agrupacion,
prueba_sugerida = tipo_prueba_sugerida,
resultado_test = NULL,
interpretacion_basica = ""
)
class(obj) <- "AnalisisNoParametrico" # Asignar una clase S3
# Aquí se podría añadir lógica para ejecutar la prueba
# y poblar obj$resultado_test y obj$interpretacion_basica
# Ejemplo: if (tipo_prueba_sugerida == "MannWhitney") { ... }
return(obj)
}
# Se podrían definir métodos 'print', 'summary', 'plot' para la clase "AnalisisNoParametrico"
# print.AnalisisNoParametrico <- function(x, ...) { ... }
Este enfoque ayuda a mantener el análisis organizado, reproducible y escalable, especialmente en proyectos complejos.
Para consolidar el aprendizaje, es crucial incluir un caso práctico completo. Usaremos el conjunto de datos ChickWeight
disponible en R como ejemplo para aplicar la prueba de Kruskal-Wallis.
Este video demuestra cómo realizar la prueba de Kruskal-Wallis en RStudio, una técnica esencial cuando se comparan más de dos grupos independientes y los datos no cumplen los supuestos paramétricos. Observará el proceso paso a paso, desde la carga de datos hasta la interpretación de los resultados, lo cual es fundamental para el Módulo 3 de nuestra clase.
data(ChickWeight) # Cargar el dataset
str(ChickWeight) # Ver la estructura del dataset
summary(ChickWeight) # Resumen estadístico
head(ChickWeight) # Primeras filas
# Consideraremos el peso (weight) en un tiempo específico, por ejemplo, el día 20.
chick_day20 <- ChickWeight[ChickWeight$Time == 20, ]
library(ggplot2)
# Boxplot del peso por dieta el día 20
ggplot(chick_day20, aes(x = Diet, y = weight, fill = Diet)) +
geom_boxplot() +
labs(title = "Distribución del Peso de los Pollos por Dieta (Día 20)",
x = "Dieta", y = "Peso (g)") +
theme_minimal()
# Verificar normalidad por grupo (opcional, ya que usaremos no paramétrica)
# Podríamos usar shapiro.test() para cada dieta si quisiéramos comparar con ANOVA.
# Ejemplo para Dieta 1:
# shapiro.test(chick_day20$weight[chick_day20$Diet == "1"])
Queremos comparar el peso entre las diferentes dietas (más de dos grupos independientes). Dado que podríamos no asumir normalidad o igualdad de varianzas, la prueba de Kruskal-Wallis es apropiada.
kruskal_result <- kruskal.test(weight ~ Diet, data = chick_day20)
print(kruskal_result)
Si el p-valor obtenido es menor que el nivel de significancia (usualmente 0.05), se concluye que hay una diferencia estadísticamente significativa en el peso mediano entre al menos dos de las dietas. Si es así, se podrían realizar pruebas post-hoc (como la prueba de Dunn con ajuste de Bonferroni) para determinar qué pares de dietas difieren significativamente.
# Ejemplo de prueba post-hoc (si Kruskal-Wallis es significativo)
# install.packages("dunn.test")
# library(dunn.test)
# if (kruskal_result$p.value < 0.05) {
# dunn.test(chick_day20$weight, g = chick_day20$Diet, method = "bonferroni")
# }
La evaluación del aprendizaje puede incluir:
Es crucial inculcar en los estudiantes la importancia de: