Introducción

En esta sección, aprenderemos un nuevo método llamado análisis de varianza (ANOVA) y un nuevo estadístico de prueba llamado F. El ANOVA utiliza una única prueba de hipótesis para comprobar si las medias de varios grupos son iguales:

Generalmente, debemos comprobar tres condiciones en los datos antes de realizar un ANOVA:

Cuando se cumplen estas tres condiciones, podemos realizar un ANOVA para determinar si los datos proporcionan evidencia sólida contra la hipótesis nula de que todos los grupos son iguales.

El estadístico F

El estadístico F se utiliza para comparar la variabilidad entre los grupos con la variabilidad dentro de los grupos. Se calcula como la razón entre la varianza entre los grupos y la varianza dentro de los grupos:

\[F = \frac{MS_{between}}{MS_{within}}\].

Donde:

\[MS_{between} = \frac{SS_{between}}{df_{between}}\]

\[MS_{within} = \frac{SS_{within}}{df_{within}}\]

\[SS_{between} = \sum_{i=1}^{k} n_i (\bar{X}_i - \bar{X})^2\]

\[SS_{within} = \sum_{i=1}^{k} \sum_{j=1}^{n_i} (X_{ij} - \bar{X}_i)^2\]

Para encontrar el valor crítico de F, se utiliza la tabla de distribución F con \(df_{between}\) y \(df_{within}\) grados de libertad. Si el valor calculado de F es mayor que el valor crítico de F, se rechaza la hipótesis nula.

Figura 1a. La varianza entre grupos (\(MS_{between}\)) es mayor que la varianza dentro de grupos (\(MS_{within}\)).

Figura 1b. La varianza entre grupos (\(MS_{between}\)) es menor que la varianza dentro de grupos (\(MS_{within}\)).

Gráfico de F con ggplot2

Vamos a graficar curvas de distribución F para diferentes grados de libertad. Para ello, utilizaremos el paquete ggplot2 y la función df() para calcular la densidad de probabilidad de la distribución F.

# Cargar el paquete ggplot2
library(ggplot2)

# Crear un rango de valores para la variable F
x <- seq(0, 5, length.out = 100)
# Crear un data frame con los valores de F y los grados de libertad
df_data <- data.frame(
  F = rep(x, 3),
  df1 = rep(c(2, 5, 10), each = 100),
  df2 = rep(c(2, 5, 10), each = 100)
)

# gráficas de F
ggplot(df_data, aes(x = F)) +
  geom_line(aes(y = df(F, df1, df2), color = factor(df1)), size = 1) +
  labs(x = "F", y = "Densidad de probabilidad") +
  scale_color_manual(values = c("red", "blue", "green"), name = "Grados de libertad") +
  theme_minimal()

Figura 2. Gráficas de la distribución F para diferentes grados de libertad. Las curvas representan la densidad de probabilidad de la distribución F para diferentes combinaciones de grados de libertad.

EJEMPLO 1. ANOVA de un factor

Selección de los datos y creación de grupos del archivo diabetes.csv.

Para obtener datos analizables con el ANOVA, seleccionaremos un conjunto de datos que contenga al menos tres grupos. En este caso, utilizaremos el archivo diabetes.csv, que contiene datos sobre la diabetes en diferentes grupos de pacientes.

En primer lugar vamos a seleccionar solo las mujeres que no fueron diagnosticadas con diabetes (Outcome == 0).

# Cargar el paquete dplyr
library(dplyr)

# Cargar los datos
diabetes <- read.csv("diabetes.csv")

# Filtrar las mujeres no diagnosticadas con diabetes
diabetes_no_diag <- diabetes %>%
  filter(Outcome == 0)

Ahora vamos a filtrar los datos para eliminar los que tienen Glucose = 0, y luego vamos a crear tres grupos de datos basados en el índice de masa corporal (BMI). Vamos a crear tres grupos: bajo peso (BMI < 18.5), peso normal (18.5 <= BMI < 25) y sobrepeso (BMI >= 25).

# Filtrar los datos para eliminar los que tienen Glucose = 0 
diabetes_no_diag <- diabetes_no_diag %>%
  filter(Glucose != 0)
# Crear grupos de BMI
diabetes_no_diag <- diabetes_no_diag %>%
  mutate(BMI_group = case_when(
    BMI < 18.5 ~ "Bajo peso",
    BMI >= 18.5 & BMI < 25 ~ "Peso normal",
    BMI >= 25 ~ "Sobrepeso"
  ))

# guardar los datos en un archivo csv
write.csv(diabetes_no_diag, "diabetes_no_diag.csv", row.names = FALSE)

Estadísticas descriptivas para Glucosa

Vamos a calcular las estadísticas descriptivas para las variables Glucosa en los tres grupos de BMI que hemos creado. Vamos a utilizar la función group_by() del paquete dplyr para agrupar los datos por BMI_group y luego calcular las estadísticas descriptivas. Presentaremos los datos en una tabla gt con tres cifras significativas.

# Cargar el paquete gt
library(gt)

# Calcular estadísticas descriptivas para Glucose e Insulin
estadisticas <- diabetes_no_diag %>%
  group_by(BMI_group) %>%
  summarise(
    Glucosa_media = mean(Glucose, na.rm = TRUE),
    Glucosa_de = sd(Glucose, na.rm = TRUE)
  ) %>%
  gt() %>%
  fmt_number(columns = c(Glucosa_media, Glucosa_de), decimals = 3)

Tabla 1. Estadísticas descriptivas para Glucose en los grupos de BMI.

BMI_group Glucosa_media Glucosa_de
Bajo peso 99.077 17.139
Peso normal 105.436 20.942
Sobrepeso 112.285 25.595

Gráfico de caja para Glucosa

Vamos a crear un gráfico de caja para visualizar la distribución de la variable Glucosa en los tres grupos de BMI. Utilizaremos el paquete ggplot2 para crear el gráfico.

# Cargar el paquete ggplot2
library(ggplot2)

# Crear un gráfico de caja para Glucosa con un punto indicando la media de cada grupo y usando jitter
ggplot(diabetes_no_diag, aes(x = BMI_group, y = Glucose)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  geom_jitter(color = "steelblue", size = 1, alpha = 0.5) +
  stat_summary(fun = mean, geom = "point", color = "red", size = 3) +
  labs(x = "Grupo de BMI", y = "Glucosa, mg/dL")

Figura 3. Gráfico de caja para la variable Glucosa en los grupos de BMI. El punto rojo representa la media de cada grupo.

Prueba de ANOVA de un factor

Ahora vamos a realizar un ANOVA para comprobar si hay diferencias significativas en la variable Glucosa entre los tres grupos de BMI. Vamos a utilizar la función aov() para realizar el ANOVA y luego vamos a utilizar la función summary() para mostrar los resultados.

# Realizar ANOVA
anova_result <- aov(Glucose ~ BMI_group, data = diabetes_no_diag)

Tabla 2. Resultados del ANOVA para Glucosa por grupo de BMI.

# Mostrar resultados en una tabla
summary(anova_result)
##              Df Sum Sq Mean Sq F value Pr(>F)  
## BMI_group     2   5339  2669.3   4.408 0.0127 *
## Residuals   494 299153   605.6                 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Pruebas Post-hoc

El ANOVA nos dice si hay diferencias significativas entre los grupos, pero no nos dice cuáles grupos son diferentes. Para eso, vamos a realizar una prueba post-hoc. Vamos a utilizar la prueba de Tukey para comparar las medias de los grupos.

# Realizar prueba post-hoc de Tukey
tukey_result <- TukeyHSD(anova_result)

Tabla 3. Resultados de la prueba post-hoc de Tukey para Glucosa por grupo de BMI.

# Mostrar resultados en una tabla 
tukey_result
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = Glucose ~ BMI_group, data = diabetes_no_diag)
## 
## $BMI_group
##                            diff         lwr      upr     p adj
## Peso normal-Bajo peso  6.359247 -10.7588327 23.47733 0.6574095
## Sobrepeso-Bajo peso   13.207692  -3.1020577 29.51744 0.1386835
## Sobrepeso-Peso normal  6.848445   0.2014523 13.49544 0.0417118

Gráfico de los resultados de Tukey

Vamos a crear un gráfico de los resultados de la prueba post-hoc de Tukey. Utilizaremos el paquete ggplot2 para crear el gráfico.

# Crear un gráfico de los resultados de Tukey
plot(tukey_result, las = 1, col = "blue")

Figura 4. Gráfico de los resultados de la prueba post-hoc de Tukey para Glucosa por grupo de BMI. Las líneas horizontales representan los intervalos de confianza para las diferencias entre las medias de los grupos.

Conclusiones

  • El ANOVA nos dice que hay diferencias significativas entre los grupos de BMI en la variable Glucosa.
  • La prueba post-hoc de Tukey nos dice cuáles grupos son diferentes.
  • El gráfico de caja nos muestra la distribución de la variable Glucosa en los tres grupos de BMI.

Pruebas de supuestos

Vamos a realizar pruebas de supuestos para comprobar si se cumplen las condiciones necesarias para realizar el ANOVA. Vamos a comprobar la normalidad de los datos y la homogeneidad de varianzas.

# Prueba de normalidad de Shapiro-Wilk por grupo
library(dplyr)
shapiro_test <- diabetes_no_diag %>%
  group_by(BMI_group) %>%
  summarise(p_value = shapiro.test(Glucose)$p.value)

# Prueba de homogeneidad de varianzas de Bartlett
bartlett_test <- bartlett.test(Glucose ~ BMI_group, data = diabetes_no_diag)

Tabla 4. Resultados de las pruebas de supuestos para el ANOVA.

# Mostrar resultados en una tabla
shapiro_test
## # A tibble: 3 × 2
##   BMI_group      p_value
##   <chr>            <dbl>
## 1 Bajo peso   0.811     
## 2 Peso normal 0.0673    
## 3 Sobrepeso   0.00000465
bartlett_test
## 
##  Bartlett test of homogeneity of variances
## 
## data:  Glucose by BMI_group
## Bartlett's K-squared = 7.9714, df = 2, p-value = 0.01858

Conclusiones de las pruebas de supuestos

  • La prueba de normalidad de Shapiro-Wilk nos dice si los datos siguen una distribución normal. Si el valor p es menor que 0.05, rechazamos la hipótesis nula de normalidad.
  • La prueba de homogeneidad de varianzas de Bartlett nos dice si las varianzas son iguales entre los grupos. Si el valor p es menor que 0.05, rechazamos la hipótesis nula de homogeneidad de varianzas.

Prueba no-paramétrica de Kruskal-Wallis

Si los supuestos del ANOVA no se cumplen, podemos utilizar la prueba no-paramétrica de Kruskal-Wallis. Esta prueba no requiere que los datos sigan una distribución normal y es menos sensible a las violaciones de la homogeneidad de varianzas.

# Realizar prueba de Kruskal-Wallis
kruskal_result <- kruskal.test(Glucose ~ BMI_group, data = diabetes_no_diag)

Tabla 5. Resultados de la prueba de Kruskal-Wallis para Glucosa por grupo de BMI.

# Mostrar resultados en una tabla
kruskal_result
## 
##  Kruskal-Wallis rank sum test
## 
## data:  Glucose by BMI_group
## Kruskal-Wallis chi-squared = 8.0865, df = 2, p-value = 0.01754

Conclusiones de la prueba de Kruskal-Wallis

  • La prueba de Kruskal-Wallis nos dice si hay diferencias significativas entre los grupos de BMI en la variable Glucosa. Si el valor p es menor que 0.05, rechazamos la hipótesis nula de que las distribuciones son iguales.