CLASEBIOINFORMATICA

Author

Dr. Juan Fidel Osuna-Ramos

Análisis estadístico en R

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/

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.

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.

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 .

¿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.

¿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.

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 .

Instalar los paquetes R necesarios

  1. dplyr para manipulación de datos
if (!requireNamespace("dplyr", quietly = TRUE)) install.packages("dplyr")

library(dplyr)

Adjuntando el paquete: 'dplyr'
The following objects are masked from 'package:stats':

    filter, lag
The following objects are masked from 'package:base':

    intersect, setdiff, setequal, union
  1. ggpubr para una fácil visualización de datos basada en ggplot2
if (!requireNamespace("ggpubr", quietly = TRUE)) install.packages("ggpubr")
library(ggpubr)
Cargando paquete requerido: ggplot2

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

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

Verifique sus datos

Comenzamos mostrando una muestra aleatoria de 10 filas usando la función sample_n ()[en el paquete dplyr ].

Mostrar 10 filas aleatorias:

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

Evaluar la normalidad de los datos en R

Queremos probar si la variable len (longitud del diente) se distribuye normalmente.

Caso de muestras de gran tamaño

*Si el tamaño de la muestra es suficientemente grande (n > 30), podemos ignorar la distribución de los datos y utilizar pruebas paramétricas.

El teorema del límite central nos dice que no importa qué distribución tengan las cosas, la distribución de muestreo tiende a ser normal si la muestra es lo suficientemente grande (n > 30).

Sin embargo, para ser consistente, la normalidad se puede verificar mediante inspección visual [ gráficos normales (histograma) , gráfico QQ (gráfico cuantil-cuantil)] o mediante pruebas de significancia ].

Métodos visuales

El gráfico de densidad y el gráfico QQ se pueden utilizar para comprobar la normalidad visualmente.

  1. Gráfico de densidad : el gráfico de densidad proporciona un juicio visual sobre si la distribución tiene forma de campana.
library("ggpubr")
ggdensity(my_data$len, 
          main = "Density plot of tooth length",
          xlab = "Tooth length")

  1. Diagrama QQ : el diagrama QQ (o diagrama cuantil-cuantil) traza la correlación entre una muestra dada y la distribución normal. También se traza una línea de referencia de 45 grados.
library(ggpubr)
ggqqplot(my_data$len)

También es posible utilizar la función qqPlot () [en el paquete car ]:

library("car")
Cargando paquete requerido: carData

Adjuntando el paquete: 'car'
The following object is masked from 'package:dplyr':

    recode
qqPlot(my_data$len)

[1] 23  1

Como todos los puntos caen aproximadamente a lo largo de esta línea de referencia, podemos asumir la normalidad.

Prueba de normalidad

La inspección visual, descrita en la sección anterior, no suele ser fiable. Es posible utilizar una prueba de significación comparando la distribución de la muestra con una distribución normal para determinar si los datos muestran o no una desviación grave de la normalidad.

Existen varios métodos para realizar pruebas de normalidad, como la prueba de normalidad de Kolmogorov-Smirnov (KS) y la prueba de Shapiro-Wilk .

La hipótesis nula de estas pruebas es que “la distribución de la muestra es normal”.

Si la prueba es significativa , la distribución no es normal.

H0 = p > 0.05 : La distribución de la muestra es Normal

Ha = p < 0.05 : La distribución de la muestra NO es Normal

El método de Shapiro-Wilk es ampliamente recomendado para las pruebas de normalidad y ofrece mayor potencia que el de KS. Se basa en la correlación entre los datos y las puntuaciones normales correspondientes.

Tenga en cuenta que la prueba de normalidad es sensible al tamaño de la muestra. Las muestras pequeñas suelen pasar las pruebas de normalidad. Por lo tanto, es importante combinar la inspección visual y la prueba de significancia para tomar la decisión correcta.

La función R shapiro.test () se puede utilizar para realizar la prueba de normalidad Shapiro-Wilk para una variable (univariada):

shapiro.test(my_data$len)

    Shapiro-Wilk normality test

data:  my_data$len
W = 0.96743, p-value = 0.1091

A partir de los resultados, el valor p > 0,05 implica que la distribución de los datos no es significativamente diferente de la distribución normal. En otras palabras, podemos asumir la normalidad.

Podemos demostrarlo visualmente también con las figuras que se han creado arriba.

Paquete dlookr

El paquete dlookr, proporciona una herramientas para el diagnóstico, exploración y transformación de datos, incluyendo la función normality() que ejecuta la prueba de Shapiro-Wilk para evaluar la normalidad de variables numéricas.

Para ilustrar el uso del paquete dlookr en R, continuaremos utilizando el conjunto de datos ToothGrowth, que forma parte de los datasets incorporados en R. Este conjunto de datos registra la longitud del diente de cobayas en función del tipo de suplemento administrado (VC para vitamina C y OJ para jugo de naranja) y la dosis suministrada.

A continuación, se detallan los pasos para diagnosticar la calidad de los datos y evaluar la normalidad de las variables numéricas utilizando dlookr:

  1. Instalación y carga del paquete dlookr:

    Si aún no tienes instalado dlookr, puedes instalarlo desde CRAN:

if (!requireNamespace("dlookr", quietly = TRUE)) install.packages("dlookr")
Registered S3 methods overwritten by 'dlookr':
  method          from  
  plot.transform  scales
  print.transform scales
library(dlookr)

Adjuntando el paquete: 'dlookr'
The following object is masked from 'package:base':

    transform

Carga y exploración inicial de los datos:

Cargamos el conjunto de datos ToothGrowth y realizamos una exploración básica para comprender su estructura:

# Cargar el conjunto de datos ToothGrowth
data("ToothGrowth")

# Visualizar las primeras filas del conjunto de datos
head(ToothGrowth)
   len supp dose
1  4.2   VC  0.5
2 11.5   VC  0.5
3  7.3   VC  0.5
4  5.8   VC  0.5
5  6.4   VC  0.5
6 10.0   VC  0.5

Diagnóstico general de los datos:

Utilizamos la función diagnose() de dlookr para obtener un diagnóstico general de las variables en el conjunto de datos:

# Diagnóstico general de las variables
diagnose(ToothGrowth)
# 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  
  • Esta función proporciona información sobre el tipo de datos, conteo de valores faltantes, porcentaje de valores únicos y otros detalles relevantes para cada variable.

  • Diagnóstico específico de variables numéricas:

    Para profundizar en las variables numéricas, empleamos diagnose_numeric(), que ofrece estadísticas descriptivas detalladas:

# Diagnóstico de variables numéricas
diagnose_numeric(ToothGrowth)
  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

Esta función proporciona estadísticas como la media, mediana, desviación estándar, valores mínimos y máximos, entre otros, para cada variable numérica.

Evaluación de la normalidad de las variables numéricas:

Para evaluar si las variables numéricas siguen una distribución normal, utilizamos la función normality(), que realiza la prueba de Shapiro-Wilk:

# Evaluación de la normalidad de las variables numéricas
normality(ToothGrowth)
# A tibble: 2 × 4
  vars  statistic      p_value sample
  <chr>     <dbl>        <dbl>  <dbl>
1 len       0.967 0.109            60
2 dose      0.765 0.0000000199     60

Visualización de la distribución y normalidad de la variable len:

Para complementar el análisis, es útil visualizar la distribución de la variable len (longitud del diente) mediante un histograma y un gráfico Q-Q con :

plot_normality(ToothGrowth)

Para evaluar la normalidad de la variable len (longitud del diente) en el conjunto de datos ToothGrowth según el tipo de suplemento (supp), utilizamos las funciones normality() y plot_normality() del paquete dlookr en combinación con group_by() de dplyr.

. Evaluación de la normalidad por grupo:

El siguiente código agrupa los datos por el tipo de suplemento y luego aplica la prueba de normalidad de Shapiro-Wilk a la variable len dentro de cada grupo:

library(dplyr)
library(dlookr)

ToothGrowth %>% 
  group_by(supp) %>% 
  normality()
# A tibble: 4 × 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
3 dose     OJ        0.767 0.0000174     30
4 dose     VC        0.767 0.0000174     30

La tabla nos muesta los resultados de la prueba de Shapiro-Wilk para cada grupo de supp.

La tabla incluye las siguientes columnas:

  • supp: El tipo de suplemento (VC o OJ).

  • variable: El nombre de la variable analizada (len).

  • statistic: El valor del estadístico W de Shapiro-Wilk.

  • p_value: El valor p asociado a la prueba.

  • sample: El número de observaciones en el grupo.

Un valor p mayor que 0.05 indica que no se rechaza la hipótesis nula de normalidad para ese grupo.

Visualización de la normalidad por grupo:

Para complementar el análisis, podemos generar gráficos que visualicen la distribución de len para cada tipo de suplemento:

library(dplyr)
library(dlookr)

ToothGrowth %>% 
  group_by(supp) %>% 
  plot_normality()

Los gráficos que incluyen son:

  • Histograma de los datos originales de len.

  • Gráfico Q-Q (Quantile-Quantile) para evaluar visualmente la normalidad.

  • Histograma de los datos transformados logarítmicamente (log(len)).

  • Histograma de los datos transformados con raíz cuadrada (sqrt(len)).

Estos gráficos permiten identificar visualmente si la distribución de len se aproxima a una distribución normal en cada grupo de supp. Si los datos no siguen una distribución normal, las transformaciones logarítmica o de raíz cuadrada pueden ayudar a normalizar la distribución.

Al utilizar normality() y plot_normality() junto con group_by(), podemos evaluar y visualizar la normalidad de una variable numérica dentro de diferentes niveles de una variable categórica, facilitando así un análisis más detallado de los datos.

Practica

Vamos a realizar un análisis estadístico con datos experimentales ficticios en R, utilizando el formato de Quarto. Este análisis incluye estadísticas descriptivas, pruebas de hipótesis y representación gráfica, incorporando resultados de significancia estadística.


Instalación y Carga de Paquetes

Primero, asegurémonos de instalar y cargar los paquetes necesarios para el análisis.

# Instalar paquetes si es necesario
if (!require(tidyverse)) install.packages("tidyverse")
Cargando paquete requerido: tidyverse
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ lubridate 1.9.4     ✔ tibble    3.2.1
✔ purrr     1.0.2     ✔ tidyr     1.3.1
✔ readr     2.1.5     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ tidyr::extract() masks dlookr::extract()
✖ dplyr::filter()  masks stats::filter()
✖ dplyr::lag()     masks stats::lag()
✖ car::recode()    masks dplyr::recode()
✖ purrr::some()    masks car::some()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
if (!require(ggplot2)) install.packages("ggplot2")
if (!require(dlookr)) install.packages("dlookr")
if (!require(ggpubr)) install.packages("ggpubr")

# Cargar paquetes
library(tidyverse)
library(ggplot2)
library(dlookr)
library(ggpubr)

Prueba t

Creación del Conjunto de Datos

# Fijar semilla para reproducibilidad
set.seed(123)

# Crear el data frame para prueba t
data_t <- data.frame(
  Grupo = rep(c("control", "tratamiento"), each = 30),
  PearsonCC = c(
    rnorm(30, mean = 0.75, sd = 0.05),  # Valores para el grupo control
    rnorm(30, mean = 0.65, sd = 0.1)    # Valores para el grupo tratamiento
  )
)

# Visualizar las primeras filas
data_t %>% head()
    Grupo PearsonCC
1 control 0.7219762
2 control 0.7384911
3 control 0.8279354
4 control 0.7535254
5 control 0.7564644
6 control 0.8357532

Explicación: - data.frame: Crea un conjunto de datos con dos columnas (Grupo y PearsonCC). - rnorm: Genera datos aleatorios con una distribución normal. - rep: Repite valores para definir los grupos. - head: Muestra las primeras filas del conjunto de datos.

Análisis Exploratorio

data_t %>%
  group_by(Grupo) %>%
  summarise(
    Media = mean(PearsonCC),
    Mediana = median(PearsonCC),
    Desviacion = sd(PearsonCC),
    Minimo = min(PearsonCC),
    Maximo = max(PearsonCC)
  )
# A tibble: 2 × 6
  Grupo       Media Mediana Desviacion Minimo Maximo
  <chr>       <dbl>   <dbl>      <dbl>  <dbl>  <dbl>
1 control     0.748   0.746     0.0491  0.652  0.839
2 tratamiento 0.668   0.655     0.0835  0.495  0.867

Explicación: - group_by: Agrupa los datos por el factor Grupo. - summarise: Calcula estadísticas descriptivas como media y desviación estándar.

Prueba de Normalidad

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

Explicación: - normality: Evalúa si los datos siguen una distribución normal usando la prueba de Shapiro-Wilk.

Prueba t

# Prueba t para comparar grupos
t_test <- t.test(PearsonCC ~ Grupo, data = data_t, var.equal = TRUE)
t_test

    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 

Explicación: - t.test: Realiza una prueba t para comparar las medias de dos grupos. - var.equal: Especifica si se asume igualdad de varianzas entre los grupos.

Representación Gráfica

ggboxplot(data_t, x = "Grupo", y = "PearsonCC", fill = "Grupo", palette = "jco") +
  stat_compare_means(method = "t.test", label = "p.signif") +
  labs(
    title = "Índices de Pearson por Grupo (Prueba t)",
    x = "Grupo",
    y = "Índice de Correlación de Pearson"
  )

Explicación: - ggboxplot: Crea un gráfico de cajas con opciones de estilo predefinidas. - stat_compare_means: Agrega valores p y niveles de significancia al gráfico usando la prueba especificada.


ANOVA

Creación del Conjunto de Datos

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

# Visualizar las primeras filas
data_anova %>% head()
    Grupo PearsonCC
1 Zika24h 0.4986790
2 Zika24h 0.5144797
3 Zika24h 0.5628442
4 Zika24h 0.5376654
5 Zika24h 0.5326229
6 Zika24h 0.5024191

Explicación: Igual que en la sección de prueba t, pero con tres grupos en lugar de dos.

Análisis Exploratorio

data_anova %>%
  group_by(Grupo) %>%
  summarise(
    Media = mean(PearsonCC),
    Mediana = median(PearsonCC),
    Desviacion = sd(PearsonCC),
    Minimo = min(PearsonCC),
    Maximo = max(PearsonCC)
  )
# A tibble: 3 × 6
  Grupo    Media Mediana Desviacion Minimo Maximo
  <chr>    <dbl>   <dbl>      <dbl>  <dbl>  <dbl>
1 NS2B3Mut 0.990   1.00      0.0626  0.871  1.07 
2 NS2B3WT  0.736   0.724     0.0602  0.678  0.879
3 Zika24h  0.520   0.523     0.0277  0.467  0.563

Prueba de Normalidad

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.959  0.776      10
2 PearsonCC NS2B3WT      0.842  0.0461     10
3 PearsonCC Zika24h      0.977  0.947      10

ANOVA y Post-hoc

# ANOVA de una vía
anova_result <- aov(PearsonCC ~ Grupo, data = data_anova)
summary(anova_result)
            Df Sum Sq Mean Sq F value Pr(>F)    
Grupo        2 1.1034  0.5517   199.2 <2e-16 ***
Residuals   27 0.0748  0.0028                   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Post-hoc con prueba de Tukey
posthoc <- TukeyHSD(anova_result)
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.2541124 -0.3124612 -0.1957636     0
Zika24h-NS2B3Mut -0.4692315 -0.5275802 -0.4108827     0
Zika24h-NS2B3WT  -0.2151191 -0.2734678 -0.1567703     0

Explicación: - aov: Realiza un análisis de varianza. - TukeyHSD: Evalúa diferencias entre pares de grupos.

Representación Gráfica

ggboxplot(data_anova, x = "Grupo", y = "PearsonCC", fill = "Grupo", palette = "jco") +
  stat_compare_means(method = "anova", label = "p.format") +
  stat_compare_means(
    comparisons = list(c("Zika24h", "NS2B3Mut"), c("Zika24h", "NS2B3WT"), c("NS2B3Mut", "NS2B3WT")),
    label = "p.signif",
    method = "t.test"
  ) +
  labs(
    title = "Índices de Pearson por Grupo (ANOVA)",
    x = "Grupo",
    y = "Índice de Correlación de Pearson"
  )

Explicación: - ggboxplot: Simplifica la creación de gráficos de cajas con ggplot2. - stat_compare_means(method = "anova"): Muestra el valor p del análisis ANOVA. - stat_compare_means(comparisons = ...): Agrega comparaciones específicas con la prueba t. - label = "p.signif": Muestra los niveles de significancia (p < 0.05, etc.).


Conclusión

En esta clase:

  1. Realizamos análisis separados para pruebas t y ANOVA.
  2. Exploramos y evaluamos la normalidad de los datos.
  3. Aplicamos pruebas estadísticas y representamos gráficamente los resultados.

Entrega: - Replicar ambos análisis y generar gráficos con anotaciones estadísticas.


Referencias - Documentación oficial de R. - Librerías tidyverse, ggplot2, dlookr.