1 Análisis estadístico en R

1.1 Introducción

En el análisis estadístico, es fundamental seleccionar la prueba adecuada para responder a una pregunta de investigación específica y asegurarse de que se cumplen los supuestos asociados a dicha prueba. A continuación, se detallan las preguntas de investigación comunes, las pruebas estadísticas correspondientes y los supuestos que deben verificarse antes de su aplicación.

de: https://www.sthda.com/

En el análisis estadístico inferencial exige (i) traducir una pregunta de investigación a un contraste estadístico bien definido, (ii) justificar el cumplimiento (o tratamiento) de los supuestos del modelo, y (iii) reportar resultados priorizando tamaños de efecto e intervalos de confianza, evitando interpretaciones dicotómicas basadas exclusivamente en valores p.

Al finalizar, se espera que se pueda:

  1. Identificar la prueba adecuada para preguntas epidemiológicas/biomédicas frecuentes.
  2. Evaluar de forma reproducible supuestos clave: normalidad (preferentemente de residuos), homocedasticidad y estructura de independencia.
  3. Ejecutar y reportar (con visualización) una prueba t y un ANOVA de una vía, con post-hoc y control del error familiar.

1.2 Preguntas de Investigación y Pruebas Estadísticas Correspondientes

  1. ¿Existe correlación entre dos variables?

    • Prueba de correlación de Pearson (paramétrica): Evalúa la relación lineal entre dos variables cuantitativas.

    • Prueba de correlación de Spearman (no paramétrica): Utilizada cuando no se cumplen los supuestos de normalidad o la relación no es lineal.

  2. ¿Existen diferencias en las medias de dos grupos independientes?

    • Prueba t de Student (paramétrica): Compara las medias de dos grupos independientes.

    • Prueba de Wilcoxon-Mann-Whitney (no paramétrica): Alternativa cuando no se cumple la normalidad.

  3. ¿Existen diferencias en las medias de más de dos grupos?

    • ANOVA (Análisis de Varianza) (paramétrica): Extensión de la prueba t para comparar más de dos grupos.

    • Prueba de Kruskal-Wallis (no paramétrica): Alternativa no paramétrica al ANOVA.

  4. ¿Las varianzas de dos o más grupos son iguales o pareados?

    • Prueba F de Fisher (paramétrica): Compara las varianzas de dos grupos.

    • Prueba de Bartlett (paramétrica): Compara las varianzas de múltiples grupos.

    • Prueba de Levene (paramétrica): Menos sensible a desviaciones de la normalidad.

1.3 Mapa operativo de decisión

Las pruebas dependen de: (a) escala de medición (continua/ordinal/nominal), (b) diseño (independiente/pareado; >2 grupos), (c) distribución y homocedasticidad, y (d) objetivo (diferencia de medias, asociación, etc.).

# NOTA TÉCNICA:
# tibble::tribble() requiere que los nombres de columnas estén en la forma ~nombre
# o ~"nombre". El uso de "/" en ~Grupos/Relación se interpreta como operación aritmética.
# Por reproducibilidad (y evitar problemas de codificación), se usan nombres ASCII en el objeto
# y etiquetas “bonitas” sólo en la impresión.

mapa_pruebas <- tibble::tribble(
  ~Pregunta, ~Variable_respuesta, ~Grupos_Relacion, ~Prueba_parametrica, ~Alternativa_no_parametrica, ~Supuestos_clave,
  "Asociación lineal entre dos variables", "Cuantitativa", "2 variables", "Correlación de Pearson", "Spearman", "Linealidad, independencia, (aprox.) normalidad bivariante",
  "Diferencia de medias (2 grupos independientes)", "Cuantitativa", "2 grupos", "t de Student / Welch", "Wilcoxon–Mann–Whitney", "Independencia; normalidad de errores; varianzas (si Student)",
  "Diferencia de medias (>2 grupos)", "Cuantitativa", ">2 grupos", "ANOVA (aov/lm)", "Kruskal–Wallis", "Independencia; normalidad de errores; homocedasticidad",
  "Comparación de proporciones", "Categórica", "2×2 o RxC", "Chi-cuadrada / test exacto", "—", "Independencia; recuentos esperados adecuados"
)

knitr::kable(
  mapa_pruebas,
  col.names = c(
    "Pregunta",
    "Variable respuesta",
    "Grupos/Relación",
    "Prueba paramétrica",
    "Alternativa no paramétrica",
    "Supuestos clave"
  )
)
Pregunta Variable respuesta Grupos/Relación Prueba paramétrica Alternativa no paramétrica Supuestos clave
Asociación lineal entre dos variables Cuantitativa 2 variables Correlación de Pearson Spearman Linealidad, independencia, (aprox.) normalidad bivariante
Diferencia de medias (2 grupos independientes) Cuantitativa 2 grupos t de Student / Welch Wilcoxon–Mann–Whitney Independencia; normalidad de errores; varianzas (si Student)
Diferencia de medias (>2 grupos) Cuantitativa >2 grupos ANOVA (aov/lm) Kruskal–Wallis Independencia; normalidad de errores; homocedasticidad
Comparación de proporciones Categórica 2×2 o RxC Chi-cuadrada / test exacto Independencia; recuentos esperados adecuados

1.4 Supuestos paramétricos: precisión conceptual

  1. Independencia: se deriva del diseño (aleatorización; muestreo; ausencia de medidas repetidas no modeladas). No se “verifica” con un test; se argumenta y se controla con el diseño/modelo.
  2. Normalidad: en modelos lineales, la condición relevante es la normalidad aproximada de los errores/residuos, no necesariamente de la variable cruda.
  3. Homocedasticidad: varianza constante del error a través de niveles de factores o a lo largo de valores ajustados.

1.5 Supuestos de las Pruebas Paramétricas

Las pruebas paramétricas, como la prueba t y el ANOVA, asumen que:

  • Normalidad: Los datos en cada grupo siguen una distribución normal.

  • Homogeneidad de varianzas: Las varianzas entre los grupos son iguales.

Es crucial verificar estos supuestos para garantizar la validez de los resultados.

2 Requisitos de pruebas estadísticas (supuestos)

Muchos de los procedimientos estadísticos, como la correlación, la regresión, la prueba t y el análisis de varianza, presuponen ciertas características de los datos.

Antes de utilizar una prueba paramétrica, debemos realizar algunas pruebas preliminares para asegurarnos de que se cumplan los supuestos de la prueba. En las situaciones en las que se violan los supuestos, se recomiendan pruebas no paramétricas .

2.1 ¿Cómo evaluar la normalidad de los datos?

  1. Con tamaños de muestra suficientemente grandes (n > 30), la violación del supuesto de normalidad no debería causar mayores problemas (teorema del límite central). Esto implica que podemos ignorar la distribución de los datos y utilizar pruebas paramétricas.

  2. Sin embargo, para ser consistentes, podemos utilizar la prueba de significancia de Shapiro-Wilk comparando la distribución de la muestra con una normal para determinar si los datos muestran o no una desviación grave de la normalidad.

2.2 ¿Cómo evaluar la igualdad de varianzas?

La prueba t de Student estándar (que compara dos muestras independientes) y la prueba ANOVA (que compara múltiples muestras) suponen también que las muestras a comparar tienen varianzas iguales.

Si las muestras que se comparan siguen una distribución normal, entonces es posible utilizar:

  • Prueba F para comparar las varianzas de dos muestras

  • Prueba de Bartlett o prueba de Levene para comparar las varianzas de múltiples muestras.

Nota metodológica: con tamaños muestrales moderados-grandes, ciertos contrastes son relativamente robustos a desviaciones de normalidad; sin embargo, la robustez depende del equilibrio de tamaños de muestra, colas y asimetría, y de la presencia de outliers.

3 Prueba de normalidad en R

Muchas de las pruebas estadísticas, incluidas la correlación, la regresión, la prueba t y el análisis de varianza (ANOVA), suponen ciertas características de los datos. Requieren que los datos sigan una distribución normal o una distribución gaussiana . Estas pruebas se denominan pruebas paramétricas , porque su validez depende de la distribución de los datos.

La normalidad y las demás suposiciones realizadas en estas pruebas deben tomarse en serio para extraer interpretaciones y conclusiones fiables en nuestra investigación.

Antes de utilizar una prueba paramétrica, debemos realizar algunas pruebas preliminares para asegurarnos de que se cumplan los supuestos de la prueba.

En las situaciones en las que se violan los supuestos, se recomiendan pruebas no paramétricas .

4 Instalar los paquetes R necesarios

  1. dplyr para manipulación de datos (Se instala si ya instalaste el paquete Tidyverse)

    if (!requireNamespace("dplyr", quietly = TRUE)) install.packages("dplyr")
    
    library(dplyr)

Además podremos usar el paquete ggpubr para una fácil visualización de datos basada en ggplot2

if (!requireNamespace("ggpubr", quietly = TRUE)) install.packages("ggpubr")
library(ggpubr)

Trabajaremos para esta practica con unos datos integrados en R llamados ToothGrowth

#guardamos los datos en una variable objeto que se llamará my_data
data("ToothGrowth")
my_data <- ToothGrowth

5 Exploración y diagnóstico: ejemplo con ToothGrowth

Este bloque utiliza el dataset base ToothGrowth para ilustrar una ruta mínima de diagnóstico (estructura, valores faltantes, distribución y normalidad).

5.1 Paquetes

paquetes <- c("dplyr", "ggplot2", "ggpubr", "dlookr", "car", "broom")
instalar <- paquetes[!vapply(paquetes, requireNamespace, logical(1), quietly = TRUE)]
if (length(instalar) > 0) install.packages(instalar)

library(dplyr)
library(ggplot2)
library(ggpubr)
library(dlookr)
library(car)
library(broom)

5.2 Carga y vista rápida

set.seed(1234)
dplyr::sample_n(my_data, 10)
##     len supp dose
## 1  21.5   VC  2.0
## 2  17.3   VC  1.0
## 3  27.3   OJ  2.0
## 4  18.5   VC  2.0
## 5   8.2   OJ  0.5
## 6  26.4   OJ  1.0
## 7  25.8   OJ  1.0
## 8   5.2   VC  0.5
## 9   6.4   VC  0.5
## 10  9.4   OJ  0.5

5.3 Diagnóstico de calidad y descriptivos

# Diagnóstico general (tipos, faltantes, unicidad)
diagnose(my_data)
## # A tibble: 3 × 6
##   variables types   missing_count missing_percent unique_count unique_rate
##   <chr>     <chr>           <int>           <dbl>        <int>       <dbl>
## 1 len       numeric             0               0           43      0.717 
## 2 supp      factor              0               0            2      0.0333
## 3 dose      numeric             0               0            3      0.05
# Diagnóstico de variables numéricas (resumen extendido)
diagnose_numeric(my_data)
##   variables min     Q1      mean median     Q3  max zero minus outlier
## 1       len 4.2 13.075 18.813333  19.25 25.275 33.9    0     0       0
## 2      dose 0.5  0.500  1.166667   1.00  2.000  2.0    0     0       0

5.4 Normalidad: inspección visual + Shapiro–Wilk

5.4.1 Univariado (variable continua principal)

# Densidad e inspección
pp1 <- ggdensity(my_data$len, main = "Densidad de len", xlab = "len")
pp2 <- ggqqplot(my_data$len)

pp1

pp2

# Shapiro–Wilk (n total)
shapiro.test(my_data$len)
## 
##  Shapiro-Wilk normality test
## 
## data:  my_data$len
## W = 0.96743, p-value = 0.1091

5.4.2 Estratificado por grupo

# Prueba de normalidad por grupo (Shapiro–Wilk) usando dlookr
my_data %>%
  group_by(supp) %>%
  normality(len)
## # A tibble: 2 × 5
##   variable supp  statistic p_value sample
##   <chr>    <fct>     <dbl>   <dbl>  <dbl>
## 1 len      OJ        0.918  0.0236     30
## 2 len      VC        0.966  0.428      30
# Visualización por grupo
my_data %>%
  group_by(supp) %>%
  plot_normality(len)

Interpretación operativa: un p > 0.05 sugiere no rechazar normalidad; no obstante, el test es sensible a n. La decisión debe integrar inspección gráfica, plausibilidad del proceso generador y consecuencias inferenciales.

5.5 Homogeneidad de varianzas (ilustración)

# Bartlett (sensible a no-normalidad)
bartlett.test(len ~ supp, data = my_data)
## 
##  Bartlett test of homogeneity of variances
## 
## data:  len by supp
## Bartlett's K-squared = 1.4217, df = 1, p-value = 0.2331
# Levene (más robusto; mediana como centro por defecto recomendado)
car::leveneTest(len ~ supp, data = my_data, center = median)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  1  1.2136 0.2752
##       58

6 Práctica 1: comparación de 2 grupos (prueba t)

6.1 Contexto y simulación reproducible

El siguiente conjunto de datos es ficticio y se utiliza para estandarizar el ejercicio. La variable PearsonCC representa, por ejemplo, un índice de correlación (o métrica cuantitativa continua) derivado de mediciones experimentales en dos condiciones.

set.seed(123)

data_t <- data.frame(
  Grupo = rep(c("control", "tratamiento"), each = 30),
  PearsonCC = c(
    rnorm(30, mean = 0.75, sd = 0.05),
    rnorm(30, mean = 0.65, sd = 0.10)
  )
)

dplyr::glimpse(data_t)
## Rows: 60
## Columns: 2
## $ Grupo     <chr> "control", "control", "control", "control", "control", "cont…
## $ PearsonCC <dbl> 0.7219762, 0.7384911, 0.8279354, 0.7535254, 0.7564644, 0.835…

6.2 Descriptivos por grupo

data_t %>%
  group_by(Grupo) %>%
  summarise(
    n = dplyr::n(),
    media = mean(PearsonCC),
    mediana = median(PearsonCC),
    sd = sd(PearsonCC),
    min = min(PearsonCC),
    max = max(PearsonCC)
  )
## # A tibble: 2 × 7
##   Grupo           n media mediana     sd   min   max
##   <chr>       <int> <dbl>   <dbl>  <dbl> <dbl> <dbl>
## 1 control        30 0.748   0.746 0.0491 0.652 0.839
## 2 tratamiento    30 0.668   0.655 0.0835 0.495 0.867

6.3 Supuestos previos

# Normalidad por grupo (Shapiro–Wilk)
data_t %>%
  group_by(Grupo) %>%
  normality(PearsonCC)
## # A tibble: 2 × 5
##   variable  Grupo       statistic p_value sample
##   <chr>     <chr>           <dbl>   <dbl>  <dbl>
## 1 PearsonCC control         0.979   0.797     30
## 2 PearsonCC tratamiento     0.987   0.961     30
# Homocedasticidad (Levene)
car::leveneTest(PearsonCC ~ Grupo, data = data_t, center = median)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value  Pr(>F)  
## group  1  5.5896 0.02144 *
##       58                  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

6.4 Contraste: t de Student vs Welch

En R, t.test() utiliza por defecto la versión de Welch (var.equal = FALSE), preferible cuando no existe evidencia sólida para asumir varianzas iguales.

# Welch (por defecto)
res_welch <- t.test(PearsonCC ~ Grupo, data = data_t, var.equal = FALSE)
res_welch
## 
##  Welch Two Sample t-test
## 
## data:  PearsonCC by Grupo
## t = 4.5135, df = 46.881, p-value = 4.281e-05
## alternative hypothesis: true difference in means between group control and group tratamiento is not equal to 0
## 95 percent confidence interval:
##  0.0442354 0.1153866
## sample estimates:
##     mean in group control mean in group tratamiento 
##                 0.7476448                 0.6678338
# Student (varianzas iguales)
res_student <- t.test(PearsonCC ~ Grupo, data = data_t, var.equal = TRUE)
res_student
## 
##  Two Sample t-test
## 
## data:  PearsonCC by Grupo
## t = 4.5135, df = 58, p-value = 3.17e-05
## alternative hypothesis: true difference in means between group control and group tratamiento is not equal to 0
## 95 percent confidence interval:
##  0.04441501 0.11520694
## sample estimates:
##     mean in group control mean in group tratamiento 
##                 0.7476448                 0.6678338
# Resumen "tidy" (broom)
broom::tidy(res_welch)
## # A tibble: 1 × 10
##   estimate estimate1 estimate2 statistic   p.value parameter conf.low conf.high
##      <dbl>     <dbl>     <dbl>     <dbl>     <dbl>     <dbl>    <dbl>     <dbl>
## 1   0.0798     0.748     0.668      4.51 0.0000428      46.9   0.0442     0.115
## # ℹ 2 more variables: method <chr>, alternative <chr>

6.5 Visualización con anotación inferencial

ggboxplot(
  data_t,
  x = "Grupo", y = "PearsonCC",
  fill = "Grupo",
  add = "jitter"
) +
  stat_compare_means(method = "t.test", label = "p.format") +
  labs(
    title = "PearsonCC por grupo (t de Welch/Student)",
    x = "Grupo",
    y = "PearsonCC"
  )

7 Práctica 2: comparación de >2 grupos (ANOVA de una vía)

7.1 Simulación reproducible

set.seed(123)

data_anova <- data.frame(
  Grupo = rep(c("Zika24h", "NS2B3Mut", "NS2B3WT"), each = 10),
  PearsonCC = c(
    rnorm(10, mean = 0.55, sd = 0.05),
    rnorm(10, mean = 1.00, sd = 0.08),
    rnorm(10, mean = 0.75, sd = 0.07)
  )
)

dplyr::glimpse(data_anova)
## Rows: 30
## Columns: 2
## $ Grupo     <chr> "Zika24h", "Zika24h", "Zika24h", "Zika24h", "Zika24h", "Zika…
## $ PearsonCC <dbl> 0.5219762, 0.5384911, 0.6279354, 0.5535254, 0.5564644, 0.635…

7.2 Descriptivos y supuestos

data_anova %>%
  group_by(Grupo) %>%
  summarise(
    n = dplyr::n(),
    media = mean(PearsonCC),
    mediana = median(PearsonCC),
    sd = sd(PearsonCC)
  )
## # A tibble: 3 × 5
##   Grupo        n media mediana     sd
##   <chr>    <int> <dbl>   <dbl>  <dbl>
## 1 NS2B3Mut    10 1.02    1.03  0.0830
## 2 NS2B3WT     10 0.720   0.703 0.0652
## 3 Zika24h     10 0.554   0.546 0.0477
# Normalidad por grupo

data_anova %>%
  group_by(Grupo) %>%
  normality(PearsonCC)
## # A tibble: 3 × 5
##   variable  Grupo    statistic p_value sample
##   <chr>     <chr>        <dbl>   <dbl>  <dbl>
## 1 PearsonCC NS2B3Mut     0.953   0.702     10
## 2 PearsonCC NS2B3WT      0.936   0.514     10
## 3 PearsonCC Zika24h      0.924   0.389     10
# Homocedasticidad
car::leveneTest(PearsonCC ~ Grupo, data = data_anova, center = median)
## Levene's Test for Homogeneity of Variance (center = median)
##       Df F value Pr(>F)
## group  2  0.5628 0.5761
##       27

7.3 Modelo ANOVA y diagnóstico por residuos

anova_model <- aov(PearsonCC ~ Grupo, data = data_anova)
summary(anova_model)
##             Df Sum Sq Mean Sq F value   Pr(>F)    
## Grupo        2 1.0998  0.5499     123 2.74e-14 ***
## Residuals   27 0.1207  0.0045                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Diagnóstico gráfico estándar (residuos)
par(mfrow = c(2, 2))
plot(anova_model)

par(mfrow = c(1, 1))

7.4 Post-hoc con control del error familiar

# Tukey HSD
posthoc <- TukeyHSD(anova_model)
posthoc
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = PearsonCC ~ Grupo, data = data_anova)
## 
## $Grupo
##                        diff        lwr         upr    p adj
## NS2B3WT-NS2B3Mut -0.2964089 -0.3705604 -0.22225739 0.00e+00
## Zika24h-NS2B3Mut -0.4629585 -0.5371100 -0.38880698 0.00e+00
## Zika24h-NS2B3WT  -0.1665496 -0.2407011 -0.09239811 1.93e-05
# Alternativa cuando no se desea asumir varianzas iguales (Welch ANOVA)
# (se incluye como referencia operativa)
oneway.test(PearsonCC ~ Grupo, data = data_anova, var.equal = FALSE)
## 
##  One-way analysis of means (not assuming equal variances)
## 
## data:  PearsonCC and Grupo
## F = 114.64, num df = 2.00, denom df = 17.13, p-value = 1.21e-10

7.5 Visualización con comparaciones

comparaciones <- list(
  c("Zika24h", "NS2B3Mut"),
  c("Zika24h", "NS2B3WT"),
  c("NS2B3Mut", "NS2B3WT")
)

ggboxplot(
  data_anova,
  x = "Grupo", y = "PearsonCC",
  fill = "Grupo",
  add = "jitter"
) +
  stat_compare_means(method = "anova", label = "p.format") +
  stat_compare_means(
    comparisons = comparaciones,
    method = "t.test",
    label = "p.signif"
  ) +
  labs(
    title = "PearsonCC por grupo (ANOVA + comparaciones)",
    x = "Grupo",
    y = "PearsonCC"
  )

8 Lineamientos mínimos de reporte

  1. Describir el diseño (independencia/pareamiento; número de réplicas biológicas y técnicas; criterios de exclusión).
  2. Reportar estimadores + IC 95%: diferencia de medias (t) y magnitud del efecto (ANOVA) cuando aplique.
  3. Justificar supuestos: (a) diagnóstico de residuos, (b) Levene/Bartlett como apoyo, no como sustituto de inspección.
  4. Controlar comparaciones múltiples cuando se realizan múltiples contrastes (Tukey, Holm, BH, etc.).
  5. Interpretar el valor p como evidencia relativa a un modelo nulo, evitando conclusiones binarias.

9 Actividad de entrega (para evaluación)

  1. Replicar Práctica 1 y Práctica 2.
  2. Sustituir la variable PearsonCC por una variable cuantitativa de interés (real o simulada con fundamento) y re-ejecutar el flujo.
  3. Incluir en el reporte:
    • Tabla de descriptivos por grupo.
    • Diagnóstico de normalidad (gráfico + Shapiro) y homocedasticidad (Levene).
    • Resultado del contraste principal (t o ANOVA), con interpretación formal.
    • Gráfico final con anotación inferencial.

10 Referencias y recursos (enlaces completos)

10.1 Documentación oficial de R (funciones base)

  1. t.test() (prueba t; Student/Welch): https://stat.ethz.ch/R-manual/R-devel/library/stats/html/t.test.html
  2. aov() (ANOVA; wrapper de modelos lineales): https://stat.ethz.ch/R-manual/R-devel/library/stats/help/aov.html
  3. TukeyHSD() (comparaciones múltiples con control familiar): https://stat.ethz.ch/R-manual/R-devel/library/stats/help/TukeyHSD.html
  4. shapiro.test() (Shapiro–Wilk): https://stat.ethz.ch/R-manual/R-devel/library/stats/help/shapiro.test.html
  5. bartlett.test() (Bartlett): https://stat.ethz.ch/R-manual/R-devel/library/stats/html/bartlett.test.html
  6. var.test() (F para comparación de dos varianzas): https://stat.ethz.ch/R-manual/R-devel/library/stats/help/var.test.html
  7. oneway.test() (ANOVA de Welch): https://stat.ethz.ch/R-manual/R-devel/library/stats/help/oneway.test.html

10.2 Paquetes utilizados

  1. dlookr (diagnóstico/EDA; normalidad por grupo): https://cran.r-project.org/package=dlookr
  2. ggpubr (gráficas “publication-ready” sobre ggplot2): https://cran.r-project.org/package=ggpubr
  3. car (incluye leveneTest): https://cran.r-project.org/package=car
  4. broom (tidiado de resultados inferenciales): https://cran.r-project.org/package=broom

10.3 Fundamentación metodológica (selección)

  1. Shapiro SS, Wilk MB. An analysis of variance test for normality (complete samples). Biometrika. 1965;52(3–4):591–611. DOI: https://doi.org/10.1093/biomet/52.3-4.591
  2. Wasserstein RL, Lazar NA. The ASA Statement on p-Values: Context, Process, and Purpose. The American Statistician. 2016. DOI: https://doi.org/10.1080/00031305.2016.1154108
  3. R for Data Science (2e; recurso abierto): https://r4ds.hadley.nz