library(tidyverse)
library(ggpubr)
library(rstatix)
library(broom)
library(emmeans)
Ejemplo de Análisis de Covarianza: Control de la ansiedad mediante ejercicio físico
Introducción
Se presenta un análisis de covarianza para estudiar el efecto del ejercicio físico (bajo (grp1), medio (grp2) y alto (grp3)) sobre la ansiedad, usando como covariable la ansiedad medida antes del programa de entrenamiento físico de seis meses.
El análisis original de los datos se presenta en el enlace: https://www.datanovia.com/en/lessons/ancova-in-r/
Carga de los paquetes
Preparación de los datos
Los datos (anxiety) están disponibles en el paquete datarium.
# Carga y preparación de los datos
data("anxiety", package = "datarium")
<- anxiety %>%
anxiety select(id, group, t1, t3) %>%
rename(pretest = t1, posttest = t3)
14, "posttest"] <- 19
anxiety[# Inspección de los datos mostrando una fila aleatoria por grupo:
set.seed(123)
%>% sample_n_by(group, size = 1) anxiety
# A tibble: 3 × 4
id group pretest posttest
<fct> <fct> <dbl> <dbl>
1 15 grp1 19.8 19.4
2 30 grp2 19.3 17.7
3 33 grp3 15.5 11
Ajuste del modelo sin corregir el efecto de la covariable
Gráfico de cajas múltipes de la ansiedad según grupo
En el gráfico de cajas multiples:
boxplot(anxiety$posttest ~ anxiety$group)
Se puede observar que el nivel de ansiedad posterior al programa de entrenamiento físico pareciera disminuir a medida que aumenta la actividad física, pero no pareciera existir diferencia entre los grupos 1 y 2.
Ajuste del modelo sin la covariable
Al ajustar el modelo si la covariable:
anova(lm(anxiety$posttest ~ anxiety$group))
Analysis of Variance Table
Response: anxiety$posttest
Df Sum Sq Mean Sq F value Pr(>F)
anxiety$group 2 72.134 36.067 13.996 2.199e-05 ***
Residuals 42 108.229 2.577
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Se puede observar que existe diferencia significativa en las medias del nivel de ansiedad según los grupos (p-valor = 2,199 x 10-5).
Prueba a posteriori
En la prueba a posteriori:
# Prueba a posteriori (con el paquete emmmeans)
<- anxiety %>%
pwc emmeans_test(
~ group,
posttest p.adjust.method = "bonferroni"
) pwc
# A tibble: 3 × 9
term .y. group1 group2 df statistic p p.adj p.adj.signif
* <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
1 group posttest grp1 grp2 42 1.87 0.0691 0.207 ns
2 group posttest grp1 grp3 42 5.22 0.00000519 0.0000156 ****
3 group posttest grp2 grp3 42 3.36 0.00169 0.00507 **
Se puede observar que no existe diferencia significativa del nivel de ansiedad entre los grupos 1 y 2.
Análisis de Covarianza
Se efectúa un Análisis de Covarianza incorporando la covariable pretest (nivel de ansiedad antes del programa de entrenamiento).
Chequeo de los supuestos
Linealidad
ggscatter(
x = "pretest", y = "posttest",
anxiety, color = "group", add = "reg.line"
+
)stat_regline_equation(
aes(label = paste(..eq.label.., ..rr.label.., sep = "~~~~"), color = group)
)
Warning: The dot-dot notation (`..eq.label..`) was deprecated in ggplot2 3.4.0.
ℹ Please use `after_stat(eq.label)` instead.
ℹ The deprecated feature was likely used in the ggpubr package.
Please report the issue at <https://github.com/kassambara/ggpubr/issues>.
En el gráfico anterior se puede observar que existe una relación lineal entre la ansiedad antes y después del programa de entrenamiento físico para cada grupo.
Homogeneidad de las pendientes de las rectas de regresión
La homogeneidad de las rectas de regresión puede chequearse verificando la no significación del término de interacción entre la covariable y la variable de grupo en la tabla Anova (tipo II) del modelo saturado:
%>% anova_test(posttest ~ group*pretest) anxiety
ANOVA Table (type II tests)
Effect DFn DFd F p p<.05 ges
1 group 2 39 209.314 1.40e-21 * 0.915
2 pretest 1 39 572.828 6.36e-25 * 0.936
3 group:pretest 2 39 0.127 8.81e-01 0.006
En donde se observa que la interacción no es significativa (p-valor = 0,88), con lo que se comprueba la homogeneidad de las pendientes de las rectas de regresión.
Ajuste del modelo
Para verificar los supuestos de normalidad de los residuos, homogeneidad de las varianzas y la no presencia de datos atípicos, lo primero que hay que hacer es ajustar un modelo lineal usando la función lm y posteriormente generar las métrica mediante la función augment(model) del paquete broom:
# Ajuste del modelo (la covarianza va primero)
<- lm(posttest ~ pretest + group, data = anxiety)
modelo # Inspeccón de las métricas de diagnóstico del modelo
<- augment(modelo) %>%
metricas.modelo select(-.hat, -.sigma, -.fitted) # Remove details
# Visualización de los primeros 3 datos:
head(metricas.modelo, 3)
# A tibble: 3 × 6
posttest pretest group .resid .cooksd .std.resid
<dbl> <dbl> <fct> <dbl> <dbl> <dbl>
1 14.1 14.1 grp1 0.550 0.101 1.46
2 14.3 14.5 grp1 0.338 0.0310 0.885
3 14.9 15.7 grp1 -0.295 0.0133 -0.750
Normalidad de los residuos
La normalidad de los residuos puede verificarse a través de la prueba de Shapiro y Wilks:
# Chequeo de la normalidad dw los residuos usando el test de Shapiro y Wilks
shapiro_test(metricas.modelo$.resid)
# A tibble: 1 × 3
variable statistic p.value
<chr> <dbl> <dbl>
1 metricas.modelo$.resid 0.975 0.444
Y al ser el p-valor (0,444) mayor que 0,05, concluimos que no se viola el supuesto de normalidad de los residuos.
Homogeneidad de las varianzas (homocedasticidad)
La homogeneidad de las varianza puede verificarse mediante el test de Levene:
%>% levene_test(.resid ~ group) metricas.modelo
# A tibble: 1 × 4
df1 df2 statistic p
<int> <int> <dbl> <dbl>
1 2 42 2.27 0.116
Y al ser el p-valor (0,116) mayor 0,05 podemos concluir que no se viola el supuesto de homogeneidad de las varianzas para todos los grupos (homocedásticidad).
Detección de valores atípicos
La dectección de datos atípicos se puede hacer verificando si hay individios con residuos estandarizados con valor absoluto mayor a 3:
%>%
metricas.modelo filter(abs(.std.resid) > 3) %>%
as.data.frame()
[1] posttest pretest group .resid .cooksd .std.resid
<0 rows> (or 0-length row.names)
Y no se identifican individuos on residuos estandarizados con valor absoluto mayor a 3.
Verificación gráfica de los supuestos
La verificación de los dos supuestoa anteriores puede verse mediante el análisis de los residuos:
plot(modelo)
En el primer gráfico podemos observa que no se viola el supuesto de homogeneidad de las varianzas.
En el segundo gráfico se puede observar que no se viola el supuesto de normalidad de los residuos.
Y en el cuarto gráfico se puede observar que no existen datos atípicos.
Ajuste del modelo de Análisis de Covarianza:
La tabla Anova del Análisis de Covarianza puede ser obtenida eliminando primero el efecto de la covariable, lo cual se obtiene mediante:
<- anxiety %>% anova_test(posttest ~ pretest + group)
res.aov get_anova_table(res.aov)
ANOVA Table (type II tests)
Effect DFn DFd F p p<.05 ges
1 pretest 1 41 598.321 4.48e-26 * 0.936
2 group 2 41 218.629 1.35e-22 * 0.914
Y en la misma se puede observar que luego del ajuste para la covariable (nivel de ansiedad antes del programa de entrenamiento físico), existe diferencia significativa entre los grupos (p-valor = 1,35 x 10-22).
Prueba a posteriori
Y en la prueba a posteriori:
# Prueba a posteriori
<- anxiety %>%
pwc emmeans_test(
~ group, covariate = pretest,
posttest p.adjust.method = "bonferroni"
) pwc
# A tibble: 3 × 9
term .y. group1 group2 df statistic p p.adj p.adj.signif
* <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <chr>
1 pretest*gr… post… grp1 grp2 41 4.24 1.26e- 4 3.77e- 4 ***
2 pretest*gr… post… grp1 grp3 41 19.9 1.19e-22 3.58e-22 ****
3 pretest*gr… post… grp2 grp3 41 15.5 9.21e-19 2.76e-18 ****
Se observa diferencia significativa en la media del nivel de ansiedad luego del programa de entrenamiento, entre todos los pares de grupos.
Visualización del ajuste del modelo
Las medias ajustadas mediante el modelo de Análisis de Covarianza pueden obtenerse mediante las medias marginales estimadas:
get_emmeans(pwc)
# A tibble: 3 × 8
pretest group emmean se df conf.low conf.high method
<dbl> <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <chr>
1 16.9 grp1 16.4 0.106 41 16.2 16.7 Emmeans test
2 16.9 grp2 15.8 0.107 41 15.6 16.0 Emmeans test
3 16.9 grp3 13.5 0.106 41 13.2 13.7 Emmeans test
Con lo que podemos concluir que la media del nivel de ansiedad es significativamente más alto para el grupo 1 (16,4 +/- 0,11) comparado con el grupo 2 (15,8 +/- 0,11) y el grupo 3 (13,5 +/- 0,11), con lo que se verifica la diferencia en la media del nivel de ansiedad posterior al entrenamiento para los tres grupos de ejercicio física del programa de entrenamiento (bajo, medio o alto), aspecto que no podía ser visualizado sin eliminar el efecto de la covariable.