Una guía para las pruebas de permutación

Una prueba de permutación (a veces llamada prueba de aleatorización) es una forma de probar la diferencia en los resultados entre los diferentes grupos de tratamiento.

Este tutorial explica cómo realizar una prueba de permutación usando un ejemplo en R.

Un ejemplo de prueba de permutación

Los investigadores quieren saber si el programa de entrenamiento A o el programa de entrenamiento B ayuda a los jugadores de baloncesto a aumentar de peso en el transcurso de un mes. Para probar las diferencias entre los programas de entrenamiento, los investigadores reclutan a 100 jugadores y asignan al azar 50 para usar el programa A y 50 para usar el programa B durante un mes.

#set seed para hacer este ejemplo replicable
 set.seed (0)

# crear un marco de datos que muestre el programa de entrenamiento y el aumento de peso resultante
# para 100 jugadores
data <- data.frame (tratamiento = rep (c ('A', 'B'), cada uno = 50))
data $ weight_gain <- ifelse (datos $ tratamiento == 'A', rnorm (50, 10, 2), rnorm (50, 12, 2))

#ver las primeras 6 filas y las últimas 6 filas del encabezado del marco de datos
 (datos); tail (datos)

# tratamiento weight_gain
# 1 A 12.525909
# 2 A 9.347533
# 3 A 12.659599
# 4 A 12.544859
N.º 5 A 10.829283
# 6 A 6.920100

# tratamiento weight_gain
# 95 B 13.19252
# 96 B 12.23944
# 97 B 11.43565
# 98 B 14.91198
# 99 B 12.45804
# 100 B 13.99309

A continuación, podemos encontrar la diferencia en el aumento de peso medio entre los dos programas:

# encontrar el aumento de peso medio para los jugadores en el programa A
mean_A <- mean (data $ weight_gain [data $ tratamiento == 'A'])

# encontrar el aumento de peso medio para los jugadores en el programa B
 mean_B <- mean (data $ weight_gain [data $ treatment == 'B'])

# encontrar la diferencia entre las ganancias medias de peso de los programas
 mean_B - mean_A

# [1] 1.99495

Podemos ver que los jugadores del programa B ganaron un promedio de 1.99 libras más que los jugadores del programa A.

Ahora, la idea detrás de la prueba de permutación es que podemos «mezclar» o permutar los datos observados asignando diferentes valores de resultado a cada observación de entre el conjunto de resultados observados reales.

Cuando permutamos los valores de resultado durante la prueba, podemos ver todas las posibles asignaciones de tratamientos alternativos que podríamos haber tenido. Esto nos permite ver dónde cae la diferencia media en nuestros datos observados en relación con todas las diferencias medias que podríamos haber visto.

Una prueba de permutación requiere que veamos todas las posibles permutaciones de los datos, pero esto puede ser una gran cantidad de permutaciones si los datos son incluso algo grandes.

Por lo tanto, podemos realizar una prueba de permutación aproximada simplemente realizando una gran cantidad de remuestreos. Esto debería permitirnos aproximarnos a la distribución de permutación real.

Para obtener una sola permutación de los datos, podemos muestrear sin reemplazo de los datos observados y calcular la diferencia media entre los dos programas una vez más:

#muestra de los valores de tratamiento de datos originales sin reemplazo
samp <- muestra (datos $ tratamiento, longitud (datos $ tratamiento), reemplazar = FALSO)

#cree un nuevo marco de datos con los tratamientos originales ('A' y 'B') todos mezclados
 data_permutation <- data
data_permutation $ tratamiento <- samp

#ver las primeras 6 y últimas 6 filas de este nuevo encabezado de marco de datos permutado
 (data_permutation); tail (data_permutation)

# tratamiento weight_gain
# 1 B 12.525909
# 2 A 9.347533
# 3 A 12.659599
# 4 B 12.544859
N.º 5 A 10.829283
# 6 A 6.920100

# tratamiento weight_gain
# 95 A 13.19252
# 96 B 12.23944
# 97 A 11.43565
# 98 A 14.91198
# 99 A 12.45804
N.º 100 A 13.99309

Observe cómo todos los valores de weight_gain se mantuvieron iguales, pero los tratamientos ahora están mezclados. Este nuevo marco de datos representa una versión permutada de nuestro marco de datos original.

Ahora podemos encontrar la diferencia entre los dos programas de entrenamiento basados ​​en estos datos permutados:

# encontrar el aumento de peso medio para los jugadores en el programa A
mean_A <- mean (data_permutation $ weight_gain [data_permutation $ tratamiento == 'A'])

# encontrar el aumento de peso medio para los jugadores en el programa B
 mean_B <- mean (data_permutation $ weight_gain [data_permutation $ treatment == 'B'])

# encontrar la diferencia entre las ganancias medias de peso de los programas
 mean_B - mean_A

# [1] -0.4353178

Si repetimos este proceso muchas veces, podemos crear nuestra distribución de permutación aproximada, que representa la distribución de muestreo para la diferencia media. Podemos usar un bucle for simple en R para ejecutar este proceso de permutación 3000 veces y generar las diferencias medias en un vector:

#crea un vector vacío
diff_vector <- numérico (0)

# cree 3,000 permutaciones del marco de datos original, encuentre la diferencia media 
# entre los dos programas en cada permutación, luego 
genere esta diferencia media # en un vector
para (i en 1: 3000) {
samp <- muestra (datos $ tratamiento, longitud (datos $ tratamiento), reemplazar = FALSO)

data_permutation <- datos
data_permutation $ tratamiento <- samp

mean_A <- mean (data_permutation $ weight_gain [data_permutation $ tratamiento == 'A'])
mean_B <- mean (data_permutation $ weight_gain [data_permutation $ tratamiento == 'B'])

# encontrar la diferencia entre las ganancias medias de peso de los programas
diff_vector [i] <- mean_B - mean_A

}

#ver el encabezado de las primeras 6 diferencias medias
 (diff_vector)

# [1] -0.4353178 0.2503843 -0.5839568 -0.1733017 0.1372405 0.6878647

A continuación, podemos crear un histograma para ver esta distribución de diferencias medias y dibujar una línea vertical en nuestra diferencia media observada real de 1.99495.

hist (diff_vector, xlim = c (-2, 2), col = "steelblue", breaks = 100)
abline (v = 1.99495, col = "negro", lwd = 2)

Distribución de la prueba de permutación de las diferencias de medias

Nuestra diferencia media observada en el aumento de peso parece bastante extrema en términos de la distribución de posibles diferencias medias si el aumento de peso fuera realmente independiente del tratamiento.

Podemos usar esta distribución para obtener un valor p para nuestra diferencia media observada contando cuántas diferencias medias permutadas son más grandes que la que observamos en nuestros datos reales, luego dividiendo por el número de distribuciones permutadas, que en este caso es 3,000 :

# suma de prueba de una cola
 (diff_vector> 1.99495) / 3000

# [1] 0
# suma de prueba de dos colas
 (abs (diff_vector)> 1.99495) / 3000

[1] 0

Ya sea que llevemos a cabo una prueba de una o dos colas, nuestro valor p es cero de cualquier manera. Esto indica que es poco probable que nuestra diferencia se deba al azar si de hecho el aumento de peso fue independiente del tratamiento.

Prueba de permutación utilizando la biblioteca de monedas

En lugar de realizar una prueba de permutación escribiendo nuestro propio código, podríamos simplemente usar la biblioteca de monedas en R.

#cargar biblioteca de monedas
biblioteca (moneda)

# prueba de una cola prueba de
 independencia (datos $ ganancia de peso ~ datos $ tratamiento, alternativa = "menos")

# Prueba de independencia general asintótica
#
#data: data $ weight_gain por data $ tratamiento (A, B)
#Z = -4,9134, valor p = 4,475e-07
# hipótesis alternativa: menos

# prueba de dos colas
 independent_test (data $ weight_gain ~ data $ tratamiento)

# Prueba de independencia general asintótica
#
#data: data $ weight_gain por data $ tratamiento (A, B)
#Z = -4,9134, valor p = 8,949e-07
# hipótesis alternativa: two.sided

A partir de los resultados de la prueba, podemos ver que nuestra distribución de permutación aproximada proporcionó la misma inferencia y un valor p casi idéntico que la biblioteca de monedas .

  • https://r-project.org
  • https://www.python.org/
  • https://www.stata.com/

Deja un comentario

Este tutorial explica cómo usar la función mutate () en R para agregar nuevas variables a un marco de datos.…
statologos comunidad-2

Compartimos información EXCLUSIVA y GRATUITA solo para suscriptores (cursos privados, programas, consejos y mucho más)

You have Successfully Subscribed!