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:
\(H_0\): La media del resultado es la misma en todos los grupos. En notación estadística, \(\mu_1 = \mu_2 = \mu_3 = ... = \mu_k\), donde k es el número de grupos.
\(H_A\): Al menos una media es diferente.
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 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\]
\(df_{between}\) es el número de grados de libertad entre los grupos, que se calcula como \(k - 1\), donde k es el número de grupos.
\(df_{within}\) es el número de grados de libertad dentro de los grupos, que se calcula como \(N - k\), donde N es el número total de observaciones y k es el número de grupos.
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}\)).
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.
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)
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 |
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.
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
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
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.
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
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