ANOVA en R: Pruebas unidireccionales y bidireccionales con ejemplos

⚡ Resumen inteligente

El análisis de varianza (ANOVA) en R compara las medias de tres o más grupos dividiendo la variación total en componentes intergrupales e intragrupales. Este tutorial ejecuta pruebas unidireccionales y bidireccionales en el conjunto de datos de venenos, verifica los supuestos y aísla los pares que difieren con la prueba HSD de Tukey.

  • 📐 Estadística básica: La razón F divide la variabilidad entre grupos por la variabilidad dentro de los grupos, por lo que valores mayores contradicen la idea de que las medias son iguales.
  • 🧪 Sintaxis unidireccional: aov(time~poison, data = df) seguido de summary() devuelve los grados de libertad, el valor F y el valor p.
  • ✅ Comprobaciones de supuestos: Antes de confiar en el valor p, compruebe la independencia y la normalidad de los residuos con shapiro.test() y la igualdad de varianzas con leveneTest().
  • 🔎 Análisis post hoc: TukeyHSD() compara cada par de grupos manteniendo la tasa de error familiar en el nivel indicado.
  • 🧮 Extensión bidireccional: aov(time~poison + treat, data = df) agrega un segundo factor, y poison:treat agrega el término de interacción.
  • 📊 Resultados de la lectura: Un valor p inferior a 0.05 rechaza la hipótesis nula de igualdad de medias, pero nunca identifica qué grupo difiere.

ANOVA en R Unidireccional Bidireccional

¿Qué es ANOVA?

Análisis de variación (ANOVA) es una técnica estadística que se utiliza para comparar las medias de dos o más grupos. La prueba funciona dividiendo la variación total de una medición en la parte explicada por la pertenencia al grupo y la parte restante como ruido aleatorio. Por lo tanto, ANOVA en R indica si al menos una media de grupo difiere de las demás, no cuál. Es una extensión directa de la prueba t a situaciones en las que la variable factorial tiene más de dos niveles.

Antes de realizar una prueba, conviene saber qué miembro de la familia ANOVA se ajusta mejor a su diseño.

Tipos de pruebas ANOVA en R

El análisis de varianza (ANOVA) es un conjunto de pruebas, no un procedimiento único. La elección de la prueba adecuada depende de la cantidad de factores que se tengan y de cómo se hayan recopilado los datos.

Prueba Cuando usarlo Llamada R
ANOVA unidireccional Un factor con tres o más niveles aov(y ~ x, datos = df)
ANOVA bidireccional Dos factores independientes aov(y ~ x1 + x2, datos = df)
Bidireccional con interacción El efecto de un factor depende del otro. aov(y ~ x1 * x2, datos = df)
ANOVA de medidas repetidas Los mismos sujetos fueron medidos más de una vez. aov(y ~ x + Error(sujeto/x))
ÁNCOVA Se debe controlar una covariable continua aov(y ~ x + covariable, datos = df)
MANOVA Dos o más variables de respuesta a la vez manova(cbind(y1, y2) ~ x)

Este tutorial cubre las tres primeras. Las variantes restantes utilizan la misma interfaz aov(), así que una vez que sepas leer una tabla de salida, podrás leerlas todas.

ANOVA frente a prueba t en R: diferencias clave

Ambas pruebas comparan medias, por lo que conviene ser precisos sobre dónde una reemplaza a la otra.

Criterios Prueba T ANOVA
Número de grupos Exactamente dos Dos o más
Estadística de prueba t F, igual a t al cuadrado cuando hay dos grupos
Resultado Indica la dirección de la diferencia Solo se informa que existe una diferencia.
Se necesita seguimiento Ninguna Pruebas post hoc como la prueba HSD de Tukey
Función R prueba t() aov()

La tentación con tres grupos es realizar tres pruebas t separadas. Resístase. Cada prueba tiene su propia tasa de error del 5 por ciento, por lo que tres comparaciones aumentan la probabilidad de un falso positivo a aproximadamente el 14 por ciento. ANOVA responde a la misma pregunta con una sola prueba, y Tukey HSD luego maneja el detalle de pares con la tasa de error controlada. Para el caso de dos grupos, vea la Tutorial de la prueba t.

ANOVA unidireccional

Hay muchas situaciones en las que es necesario comparar la media entre varios grupos. Por ejemplo, el departamento de marketing quiere saber si tres equipos tienen el mismo rendimiento de ventas.

  • Equipo: factor de 3 niveles: A, B y C
  • Venta: una medida de desempeño

La prueba ANOVA puede determinar si los tres grupos tienen rendimientos similares.

Para aclarar si los datos provienen de la misma población, se puede realizar una Análisis de varianza de una sola vía (ANOVA unidireccional en adelante). Al igual que cualquier otra prueba estadística, proporciona evidencia sobre si se puede rechazar la hipótesis nula (H0). Cabe señalar que no rechazar H0 no equivale a demostrar su veracidad.

Hipótesis en la prueba ANOVA de una vía

  • H0: Las medias entre grupos son idénticas
  • H1: Al menos, la media de un grupo es diferente

En otras palabras, no rechazar H0 significa que no hay suficiente evidencia para concluir que la media de algún grupo difiere de las demás.

Esta prueba es similar a la prueba t, pero el análisis de varianza (ANOVA) es la opción correcta cuando hay más de dos grupos. Con exactamente dos grupos, ambas pruebas son equivalentes y el estadístico F es igual al cuadrado del estadístico t.

Supuestos

El análisis de varianza unidireccional (ANOVA) se basa en tres condiciones: las observaciones se seleccionan aleatoriamente y son independientes entre sí, los residuos dentro de cada grupo siguen una distribución aproximadamente normal y la varianza es la misma en todos los grupos (homogeneidad de la varianza). La sección sobre la verificación de supuestos que se presenta a continuación muestra cómo comprobar cada uno de ellos en R.

Interpretar la prueba ANOVA

El estadístico F se utiliza para probar si los datos provienen de poblaciones significativamente diferentes, es decir, medias muestrales diferentes.

Para calcular el estadístico F, es necesario dividir el variabilidad entre grupos sobre la variabilidad dentro del grupo.

El entre grupos La variabilidad refleja la distancia entre la media de cada grupo y la media general. Compare los dos gráficos a continuación para comprender mejor este concepto.

El gráfico de la izquierda muestra muy poca variación entre los tres grupos, por lo que las medias de los tres grupos se sitúan cerca de la total media.

El gráfico de la derecha muestra tres distribuciones muy separadas sin superposición, por lo que la diferencia entre la media general y la media de cada grupo es grande.

Interpretar la prueba ANOVA

El dentro del grupo La variabilidad mide qué tan lejos se encuentran las observaciones individuales de la media de su propio grupo. Algunos puntos se sitúan lejos del promedio de su grupo, y el término intragrupal captura precisamente esa dispersión, que es el error de muestreo.

Para comprender visualmente el concepto de variabilidad dentro del grupo, observe el siguiente gráfico.

La parte izquierda muestra la distribución de tres grupos diferentes. Al aumentar la dispersión de cada muestra, queda claro que la varianza individual es grande. El estadístico F disminuye, por lo que no se rechazaría la hipótesis nula.

La parte derecha muestra muestras con las mismas medias pero con una dispersión mucho menor. Esto eleva el estadístico F y apunta a favor de la hipótesis alternativa.

Interpretar la prueba ANOVA

Puede utilizar ambas medidas para construir el estadístico F. Es muy intuitivo comprender el estadístico F. Si el numerador aumenta, significa que la variabilidad entre grupos es alta y es probable que los grupos de la muestra provengan de distribuciones completamente diferentes.

En otras palabras, un valor bajo del estadístico F indica que existe poca o ninguna diferencia significativa entre las medias de los grupos.

Ejemplo de prueba ANOVA unidireccional

Utilizará el conjunto de datos de veneno para implementar la prueba ANOVA unidireccional. El conjunto de datos contiene 48 filas y 3 variables:

  • Tiempo: Tiempo de supervivencia del animal.
  • veneno: Tipo de veneno utilizado: nivel de factor: 1,2 y 3
  • tratar: Tipo de tratamiento utilizado: nivel de factor: 1,2 y 3

Antes de comenzar a calcular la prueba ANOVA, debe preparar los datos de la siguiente manera:

  • Paso 1: importar los datos
  • Paso 2: eliminar la variable innecesaria
  • Paso 3: convertir la variable veneno como nivel ordenado
library(dplyr)
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/poisons.csv"
df <- read.csv(PATH) %>%
select(-X) %>% 
mutate(poison = factor(poison, ordered = TRUE))
glimpse(df)

Salida:

## Observations: 48
## Variables: 3
## $ time   <dbl> 0.31, 0.45, 0.46, 0.43, 0.36, 0.29, 0.40, 0.23, 0.22, 0...
## $ poison <ord> 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 1, 1, 1, 1, 2, 2, 2...
## $ treat  <fctr> A, A, A, A, A, A, A, A, A, A, A, A, B, B, B, B, B, B, ...		

Nuestro objetivo es probar la siguiente suposición:

  • H0: No hay diferencia en el tiempo promedio de supervivencia entre los grupos.
  • H1: El promedio del tiempo de supervivencia es diferente para al menos un grupo.

En otras palabras, se quiere saber si existe una diferencia estadística entre la media del tiempo de supervivencia según el tipo de veneno administrado al conejillo de indias.

Procederá de la siguiente manera:

  • Paso 1: Verifique el formato de la variable veneno
  • Paso 2: Imprima el resumen estadístico: recuento, media y desviación estándar
  • Paso 3: Dibuje un diagrama de caja
  • Paso 4: Calcule la prueba ANOVA unidireccional
  • Paso 5: Realizar una comparación por pares con la prueba HSD de Tukey.

Paso 1) Comprueba los niveles de veneno con el código que aparece a continuación. Deberías ver tres valores de caracteres, ya que el verbo mutate convirtió la columna en un factor ordenado.

levels(df$poison)

Salida:

## [1] "1" "2" "3"

Paso 2) Calcula la media y la desviación estándar.

df %>%
	group_by(poison) %>%
	summarise(
		count_poison = n(),
		mean_time = mean(time, na.rm = TRUE),
		sd_time = sd(time, na.rm = TRUE)
	)

Salida:

## 
# A tibble: 3 x 4
##   poison count_poison mean_time    sd_time
##    <ord>        <int>     <dbl>      <dbl>
## 1      1           16  0.617500 0.20942779
## 2      2           16  0.544375 0.28936641
## 3      3           16  0.276250 0.06227627

Paso 3) En el paso tres, puedes comprobar gráficamente si hay una diferencia entre la distribución. Tenga en cuenta que incluye el punto nervioso.

ggplot(df, aes(x = poison, y = time, fill = poison)) +
    geom_boxplot() +
    geom_jitter(shape = 15,
        color = "steelblue",
        position = position_jitter(0.21)) +
    theme_classic()

Salida:

Ejemplo de prueba ANOVA unidireccional

Paso 4) Puede ejecutar la prueba ANOVA unidireccional con el comando aov. La sintaxis básica de una prueba ANOVA es:

aov(formula, data)
Arguments:			
- formula: The equation you want to estimate
- data: The dataset used	

La sintaxis de la fórmula es:

y ~ X1+ X2+...+Xn # X1 +  X2 +... refers to the independent variables
y ~ . # use all the remaining variables as independent variables

Ahora puedes responder a la pregunta: ¿existe alguna diferencia en el tiempo de supervivencia entre los conejillos de indias, dado el tipo de veneno administrado?

Almacena el modelo en un objeto y pásalo a summary() para obtener una impresión legible de los resultados.

anova_one_way <- aov(time~poison, data = df)
summary(anova_one_way)

Code Explicación

  • aov(tiempo ~ veneno, datos = df): Ejecute la prueba ANOVA con la siguiente fórmula
  • summary(anova_one_way): Imprime el resumen de la prueba

Salida:

##             Df Sum Sq Mean Sq F value   Pr(>F)
## poison       2  1.033  0.5165   11.79 7.66e-05 ***
## Residuals   45  1.972  0.0438                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

El valor p es 7.66e-05, muy por debajo del umbral habitual de 0.05, y los tres asteriscos indican la mayor significancia estadística. Se puede rechazar H0 y concluir que al menos un grupo de veneno tiene un tiempo medio de supervivencia diferente.

Cómo comprobar los supuestos del ANOVA en R

Un valor p de ANOVA solo es fiable cuando se cumplen las tres condiciones mencionadas anteriormente. Cada una de ellas se verifica directamente en R, y todas se ejecutan sobre el objeto del modelo ajustado.

1. Independencia de las observaciones. Esta es una característica del diseño del estudio, no de los datos, por lo que ninguna prueba puede corregirla. Cada cobaya debe medirse una sola vez y asignarse a su grupo al azar. Si el mismo sujeto aparece en varias filas, se necesita un modelo de medidas repetidas.

2. Normalidad de los residuos. El análisis de varianza (ANOVA) asume que los residuos, no los datos brutos, siguen una distribución aproximadamente normal. Examine el gráfico QQ y confirme con la prueba de Shapiro-Wilk:

par(mfrow = c(2, 2))
plot(anova_one_way)          # four diagnostic plots

shapiro.test(residuals(anova_one_way))

Los puntos que se aproximan a la diagonal del gráfico QQ normal indican residuos normales. Un valor p de Shapiro-Wilk superior a 0.05 significa que no se puede rechazar la normalidad.

3. Homogeneidad de la varianza. Cada grupo debería mostrar una dispersión similar. El gráfico de residuos frente a valores ajustados debería tener forma de banda plana en lugar de embudo. Confírmelo con la prueba de Levene, que es más robusta ante la falta de normalidad que la de Bartlett.

library(car)
leveneTest(time ~ poison, data = df)

bartlett.test(time ~ poison, data = df)

Un valor p superior a 0.05 respalda la igualdad de varianzas.

Qué hacer cuando una suposición resulta ser incorrecta. Si las varianzas son desiguales, ejecute oneway.test(time ~ poison, data = df, var.equal = FALSE), la corrección de Welch. Si los residuos no siguen una distribución normal y la muestra es pequeña, cambie a la prueba de rangos de Kruskal-Wallis, kruskal.test(time ~ poison, data = df). Con muestras grandes y equilibradas, el ANOVA es bastante robusto ante desviaciones moderadas de la normalidad, por lo que un resultado límite de Shapiro-Wilk rara vez es fatal.

Comparación por pares

Una prueba F significativa indica que las medias de los grupos no son todas iguales, pero no especifica qué par difiere. La prueba de diferencia significativa honesta de Tukey responde a esta pregunta comparando cada par y controlando la tasa de error global.

TukeyHSD(anova_one_way)

Salida:

Comparación por pares

Lea la salida una fila por par. diff La columna contiene la diferencia entre las medias de los dos grupos, lvr y licencia acotar el intervalo de confianza del 95 por ciento para esa diferencia, y p adj es el valor p ajustado para comparaciones múltiples. Un par difiere significativamente cuando su intervalo excluye el cero, lo que equivale a cuando p adj es inferior a 0.05. En este conjunto de datos, las comparaciones que involucran al veneno 3 son las significativas, lo que coincide con el diagrama de caja: el grupo 3 tiene un tiempo de supervivencia medio claramente menor que los grupos 1 y 2, mientras que los grupos 1 y 2 son estadísticamente indistinguibles entre sí.

ANOVA bidireccional

Un ANOVA bidireccional añade un segundo factor a la fórmula. Funciona exactamente igual que la prueba unidireccional, solo que la fórmula cambia:

y ~ x1 + x2

Aquí, y es la variable de respuesta cuantitativa, mientras que x1 y x2 son factores categóricos.

Hipótesis en la prueba ANOVA de dos vías

  • H0: Las medias de los grupos son iguales para ambas variables factoriales.
  • H1: Al menos una media grupal difiere, para al menos uno de los dos factores.

Se añade la variable de tratamiento al modelo. Esta variable registra el tratamiento administrado al conejillo de indias. La fórmula aditiva que se muestra a continuación evalúa si cada factor afecta al tiempo de supervivencia de forma individual, teniendo en cuenta el efecto de los demás.

Modifique el código agregando "tratar" junto a la primera variable independiente.

anova_two_way <- aov(time~poison + treat, data = df)
summary(anova_two_way)

Salida:

##             Df Sum Sq Mean Sq F value  Pr(>F)    
## poison       2 1.0330  0.5165   20.64 5.7e-07 ***
## treat        3 0.9212  0.3071   12.27 6.7e-06 ***
## Residuals   42 1.0509  0.0250                    
## ---

Ambos valores p (5.7e-07 para el veneno y 6.7e-06 para el tratamiento) están muy por debajo de 0.05, por lo que se rechaza H0 para ambos factores y se concluye que cambiar el veneno o el tratamiento afecta el tiempo de supervivencia.

Agregar un término de interacción

El modelo aditivo anterior supone que el efecto del veneno es el mismo independientemente del tratamiento. Para comprobar esta suposición, sustituya el signo más por un asterisco, que representa tanto los efectos principales como su interacción:

anova_interaction <- aov(time~poison * treat, data = df)
summary(anova_interaction)

Si la fila de veneno/tratamiento no es significativa, el modelo aditivo es la mejor opción porque consume menos grados de libertad.

ANOVA en R: Guía rápida de pruebas

La tabla que aparece a continuación enumera cada prueba utilizada anteriormente, la llamada a R que la ejecuta y la hipótesis que evalúa:

Prueba Code Hipótesis P-valor
ANOVA de una vía
aov(y ~ X, data = df)
H1: El promedio es diferente para al menos un grupo 0.05
Por parejas
TukeyHSD(ANOVA summary)
0.05
ANOVA de dos vías
aov(y ~ X1 + X2, data = df)
H1: Al menos una media de grupo difiere para cualquiera de los factores. 0.05

Preguntas Frecuentes

El valor F es la razón entre la varianza entre grupos y la varianza dentro de los grupos. Los valores cercanos a 1 sugieren que las medias de los grupos son similares. Los valores altos indican que los grupos provienen de poblaciones con medias diferentes.

Utilice oneway.test() con var.equal = FALSE cuando las varianzas sean desiguales, y kruskal.test() cuando los residuos no sigan una distribución normal. Transformar una respuesta asimétrica con log() suele restablecer tanto la normalidad como la igualdad de varianzas.

Cada prueba t conlleva un riesgo de falso positivo del 5 %. Tres pruebas por pares elevan la tasa de error global a aproximadamente el 14 %. El análisis de varianza (ANOVA) mantiene una única prueba global en el 5 %, y la prueba HSD de Tukey ajusta las comparaciones por pares.

ANOVA es un filtro estándar para la selección de características: clasifica los predictores categóricos según la fuerza con la que separan una variable objetivo numérica. Los equipos de IA también lo utilizan para comparar variantes de modelos en diferentes conjuntos de validación cruzada.

Sí. Los asistentes de IA pueden explicar los grados de libertad, traducir los valores p a un lenguaje sencillo e indicar incumplimientos de supuestos en los gráficos de diagnóstico. Siempre confirme la lectura con sus propios resultados de leveneTest() y shapiro.test().

Resumir este post con: