Contraste por permutaciones: permutation test
Un esquema de contraste de hipótesis para \(X \sim N(\mu, \sigma^2)\) con hipótesis:
\[ H_0: \mu = \mu_0 \quad \text{vs} \quad H_A: \mu \ne \mu_0 \]
Un Permutation Test (o prueba de permutación) es un método no paramétrico utilizado para probar hipótesis estadísticas. En lugar de depender de supuestos sobre la distribución de los datos, este enfoque utiliza las permutaciones (reordenamientos) de los datos para construir una distribución nula y evaluar la significancia estadística de un estadístico observado.
El objetivo principal es determinar si un efecto observado (como la diferencia entre medias de dos grupos) podría haberse obtenido por azar, bajo la suposición de que la hipótesis nula (\(H_0\)) es verdadera.
Supongamos que queremos evaluar si existe una diferencia significativa entre los rendimientos académicos de estudiantes que usan un método de estudio tradicional frente a aquellos que usan un método experimental.
Calcular la diferencia de medias observada: \[ \text{Diferencia observada} = \bar{X}_\text{experimental} - \bar{X}_\text{tradicional}. \]
Generar todas las permutaciones posibles (o una muestra aleatoria si los datos son grandes) de las etiquetas de grupo.
Para cada permutación, recalcular la diferencia de medias y construir la distribución nula.
Calcular el p-valor como la proporción de permutaciones en las que la diferencia simulada es mayor o igual (en valor absoluto) que la diferencia observada.
Aquí está un ejemplo práctico de un permutation test en Python:
import numpy as np
# Datos
= np.array([70, 75, 80, 85, 90])
grupo_tradicional = np.array([88, 92, 94, 96, 98])
grupo_experimental
# Diferencia observada
= np.mean(grupo_experimental) - np.mean(grupo_tradicional)
observed_diff
# Combinar los grupos
= np.concatenate([grupo_tradicional, grupo_experimental])
datos_combinados
# Permutaciones
= 10000
n_permutaciones = []
differences
for _ in range(n_permutaciones):
np.random.shuffle(datos_combinados)= datos_combinados[:len(grupo_tradicional)]
grupo_1_perm = datos_combinados[len(grupo_tradicional):]
grupo_2_perm = np.mean(grupo_2_perm) - np.mean(grupo_1_perm)
diff
differences.append(diff)
# Calcular el p-valor
= np.array(differences)
differences = np.mean(np.abs(differences) >= np.abs(observed_diff))
p_value
# Resultados
print(f"Diferencia observada: {observed_diff:.2f}")
print(f"P-valor: {p_value:.4f}")
# Visualizar la distribución
import matplotlib.pyplot as plt
=30, alpha=0.7, color='gray', label='Distribución nula')
plt.hist(differences, bins='red', linestyle='--', label='Diferencia observada')
plt.axvline(observed_diff, color-observed_diff, color='red', linestyle='--')
plt.axvline('Prueba de permutación')
plt.title('Diferencia de medias')
plt.xlabel('Frecuencia')
plt.ylabel(
plt.legend() plt.show()