En el Anova de medidas repetidas se analizan los resultados obtenidos en un diseño experimental en donde se ha manipulado una única variable independiente (un único factor) con 2 o más niveles pero de forma intra-sujeto. Esto viene a significar, que todos los individuos (o unidades de observación), han pasado por todos los niveles del factor. A este tipo de diseños también se les conoce como diseños de medidas repetidas en el sentido de que a cada sujeto se le repite la medición de la variable dependiente de respuesta en diversas condiciones, tantas como niveles tenga el factor manipulado. También se les conoce como diseños de medidas dependientes debido a que las puntuaciones de un mismo sujeto muestran dependencia estadística entre ellas, están relacionadas.
Se trata de comprobar, por ejemplo, desde un punto de vista de contrastes paramétricos, si las medias de una medición de una variable dependiente continua, son las mismas en distintos momentos del tiempo (3 o más), por ejemplo si un tratamiento de combinación de dieta y ejercicio (las 2 cosas como un todo) tiene la correspondiente contraprestación en pérdida de peso en 4 instantes del tiempo, esto es, se trata de 4 muestras relacionadas, dependientes o pareadas, tomadas sobre los mismos 10 individuos. Es algo parecido a la prueba de la T de Student para muestras relacionadas en un antes y un después, pero esta vez con 3 o más instantes de tiempo, en lugar de 2.
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.2.3
## Warning: package 'ggplot2' was built under R version 4.2.3
## Warning: package 'tibble' was built under R version 4.2.3
## Warning: package 'tidyr' was built under R version 4.2.3
## Warning: package 'readr' was built under R version 4.2.3
## Warning: package 'purrr' was built under R version 4.2.3
## Warning: package 'dplyr' was built under R version 4.2.3
## Warning: package 'forcats' was built under R version 4.2.3
## Warning: package 'lubridate' was built under R version 4.2.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ dplyr 1.1.2 ✔ readr 2.1.4
## ✔ forcats 1.0.0 ✔ stringr 1.5.0
## ✔ ggplot2 3.4.2 ✔ tibble 3.2.1
## ✔ lubridate 1.9.2 ✔ tidyr 1.3.0
## ✔ purrr 1.0.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors
library(ggpubr)
## Warning: package 'ggpubr' was built under R version 4.2.3
library(rstatix)
## Warning: package 'rstatix' was built under R version 4.2.3
##
## Attaching package: 'rstatix'
## The following object is masked from 'package:stats':
##
## filter
library(datarium)
## Warning: package 'datarium' was built under R version 4.2.3
# Archivo de datos
#============================
data("selfesteem", package = "datarium")
selfesteem
## # A tibble: 10 × 4
## id t1 t2 t3
## <int> <dbl> <dbl> <dbl>
## 1 1 4.01 5.18 7.11
## 2 2 2.56 6.91 6.31
## 3 3 3.24 4.44 9.78
## 4 4 3.42 4.71 8.35
## 5 5 2.87 3.91 6.46
## 6 6 2.05 5.34 6.65
## 7 7 3.53 5.58 6.84
## 8 8 3.18 4.37 7.82
## 9 9 3.51 4.40 8.47
## 10 10 3.04 4.49 8.58
selfesteem <- selfesteem %>% gather(key = "time", value = "score", t1, t2, t3) %>% convert_as_factor(id, time)
selfesteem
## # A tibble: 30 × 3
## id time score
## <fct> <fct> <dbl>
## 1 1 t1 4.01
## 2 2 t1 2.56
## 3 3 t1 3.24
## 4 4 t1 3.42
## 5 5 t1 2.87
## 6 6 t1 2.05
## 7 7 t1 3.53
## 8 8 t1 3.18
## 9 9 t1 3.51
## 10 10 t1 3.04
## # ℹ 20 more rows
selfesteem %>% group_by(time) %>% get_summary_stats(score, type = "mean_sd")
## # A tibble: 3 × 5
## time variable n mean sd
## <fct> <fct> <dbl> <dbl> <dbl>
## 1 t1 score 10 3.14 0.552
## 2 t2 score 10 4.93 0.863
## 3 t3 score 10 7.64 1.14
La media de T1 es de 3.14 aumentando en T2 hasta 4.93 y subiendo a 7.63 en el T3. En cuanto a la dispersión, también aumenta con el tiempo siendo 0.55 T1, pasando a 0.86 en T2 y llegando a 1.14 en T3.
La diferencia de medias es evidente en los tres factores (periodos) y la dispersión es heterocedástica.
# Boxplot
# ==============================
ggboxplot(selfesteem, x="time", y="score", add = "point")
Se observan medias diferentes y en aumento con el paso del tiempo, al
igual que la dispersión. Por otro lado, se observan datos anómalos, que
deben analizarse para ver si son influyentes.
selfesteem %>% group_by(time) %>% identify_outliers(score)
## # A tibble: 2 × 5
## time id score is.outlier is.extreme
## <fct> <fct> <dbl> <lgl> <lgl>
## 1 t1 6 2.05 TRUE FALSE
## 2 t2 2 6.91 TRUE FALSE
Los dos puntos (6, 2) se identifican como anómalos, pero no son extremos o significativos.
No se corrigen.
selfesteem %>% group_by(time) %>% shapiro_test(score)
## # A tibble: 3 × 4
## time variable statistic p
## <fct> <chr> <dbl> <dbl>
## 1 t1 score 0.967 0.859
## 2 t2 score 0.876 0.117
## 3 t3 score 0.923 0.380
Para T1, el estadístico asciende a 0.96 con un p valor de 0.85. Permite aceptar la hipótesis de normalidad.
Para T2, el estadístico asciende a 0.87 con un p valor de 0.11. Permite aceptar la hipótesis de normalidad.
Para T3, el estadístico asciende a 0.96 con un p valor de 0.38. Permite aceptar la hipótesis de normalidad.
En los tres factores, aceptamos la normalidad.
ggqqplot(selfesteem, "score", facet.by = "time")
Para T1, T2 y T3, encontramos que los valores de los datos se ajustan
adecuadamente la mayoría a los cuantiles de la normal.
No debe ser verificada, ya que en este tipo de anovas se da por hecho el cambio de dispersión a lo largo del tiempo.
res.aov <- anova_test(data = selfesteem, dv= score, wid=id, within = time)
get_anova_table(res.aov)
## ANOVA Table (type III tests)
##
## Effect DFn DFd F p p<.05 ges
## 1 time 2 18 55.469 2.01e-08 * 0.829
El estadístico F asciende a 55.47 con p valor de 0.000 < 0.05.
Tenemos evidencia empírica suficiente para rechazar la hipótesis de igualdad de medias.
Por tanto, el tratamiento contra insomnio produce diferentes efectos en cada periodo.
El tamaño del efecto es de 82.9% es bastante elevado (>25%).
pwc <- selfesteem %>% pairwise_t_test(score ~ time, paired = TRUE, p.adjust.method = "bonferroni")
pwc
## # A tibble: 3 × 10
## .y. group1 group2 n1 n2 statistic df p p.adj p.adj.signif
## * <chr> <chr> <chr> <int> <int> <dbl> <dbl> <dbl> <dbl> <chr>
## 1 score t1 t2 10 10 -4.97 9 0.000772 2e-3 **
## 2 score t1 t3 10 10 -13.2 9 0.000000334 1e-6 ****
## 3 score t2 t3 10 10 -4.87 9 0.000886 3e-3 **
Al comparar T1 vs T2, el estadístico es -4.96 con un p valor ajustado de 0.000 < 0.05. Por tanto, la diferencia es estadísticamente significativa (medias son diferentes). La media T1 es inferior a la media en T2.
Al comparar T1 vs T3, el estadístico es -13.22 con un p valor ajustado de 0.000 < 0.05. Por tanto, la diferencia es estadísticamente significativa (medias son diferentes). La media T1 es inferior a la media en T3.
Al comparar T2 vs T3, el estadístico es -4.86 con un p valor ajustado de 0.000 < 0.05. Por tanto, la diferencia es estadísticamente significativa (medias son diferentes). La media T2 es inferior a la media en T3.
Concluyendo: La mayor media es en T3 seguida de T2 y por último la de T1. Por tanto, el efecto del fármaco es positivo, ya que el paciente duerme más horas a medida que toma el medicamento.
sesion_info <- devtools::session_info()
dplyr::select(
tibble::as_tibble(sesion_info$packages),
c(package, loadedversion, source)
)
## # A tibble: 83 × 3
## package loadedversion source
## <chr> <chr> <chr>
## 1 abind 1.4-5 CRAN (R 4.2.0)
## 2 backports 1.4.1 CRAN (R 4.2.0)
## 3 broom 1.0.5 CRAN (R 4.2.3)
## 4 bslib 0.4.2 CRAN (R 4.2.2)
## 5 cachem 1.0.6 CRAN (R 4.2.2)
## 6 callr 3.7.3 CRAN (R 4.2.3)
## 7 car 3.1-2 CRAN (R 4.2.3)
## 8 carData 3.0-5 CRAN (R 4.2.3)
## 9 cli 3.6.0 CRAN (R 4.2.2)
## 10 colorspace 2.1-0 CRAN (R 4.2.3)
## # ℹ 73 more rows