1.-INTRODUCCIÓN

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.

2.- EJERCICIO

2.1.- ANÁLISIS DE LOS DATOS

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

2.2.- ANÁLISIS ESTADÍSTICO EDA

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.

2.3.- SUPUESTOS

2.3.1.- OUTLIERS

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.

2.3.2.- NORMALIDAD

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.

2.3.2.- HOMOCEDASTICIDAD

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.

2.4.- ANOVA DE MEDIAS REPETIDAS.

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%).

2.4.1.- COMPARACIONES MÚLTIPLES

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.

3.- INFORME DE LA SESIÓN

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