Reporte de práctica de Bioestadistica en R

Alumno: Juan Rafael Melo Morales

Profesor: Dr. Juan Fidel Osuna-Ramos

Curso de Bioestadística en R · 2025

A) Preparar el entorno de trabajo

  1. Se descargaron y abrieron los paquetes necesarios para trabajar
#install.packages("dplyr")
#install.packages("ggplot2")
#install.packages("ggpubr")
#install.packages("dlookr")
#install.packages("car")
#install.packages("multcomp")
#install.packages("ggsignif")

library(dplyr)    # manipulación de datos
## 
## 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
library(ggplot2)  # gráficos base
library(ggpubr)   # gráficos estadísticos y anotaciones
library(dlookr)    # exploración de normalidad y diagnóstico
## Registered S3 methods overwritten by 'dlookr':
##   method          from  
##   plot.transform  scales
##   print.transform scales
## 
## Adjuntando el paquete: 'dlookr'
## The following object is masked from 'package:base':
## 
##     transform
library(car)       # prueba de Levene
## Cargando paquete requerido: carData
## 
## Adjuntando el paquete: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
library(multcomp)  # comparaciones post-hoc (Tukey, etc.)
## Cargando paquete requerido: mvtnorm
## Cargando paquete requerido: survival
## Cargando paquete requerido: TH.data
## Cargando paquete requerido: MASS
## 
## Adjuntando el paquete: 'MASS'
## The following object is masked from 'package:dplyr':
## 
##     select
## 
## Adjuntando el paquete: 'TH.data'
## The following object is masked from 'package:MASS':
## 
##     geyser
library(ggsignif)

B) Practica 1: Efecto de Metformina en la formación de complejos replicativos de ZIKV

En esta práctica se analiza el efecto del tratamiento con Metformina (9 mM) frente a vehículo (0 mM) sobre la formación de complejos replicativos durante la infección por ZIKV (virus del Zika).

Se realizaron ensayos de inmunofluorescencia y microscopía confocal marcando dos proteínas virales:

  • Proteína E (envoltura) – señal en canal verde.

  • Proteína NS4A – señal en canal rojo.

Los núcleos se marcaron con DAPI (azul). A partir de estas imágenes se cuantificó el índice de colocalización de Pearson (PearsonCC) entre las señales de E y NS4A, utilizando el software ZEN Black (Carl Zeiss).

Se analizaron en total 60 células:

  • 30 células tratadas con vehículo

  • 30 células tratadas con metformina

Objetivo: Evaluar si el tratamiento con metformina modifica significativamente la colocalización entre E y NS4A (índice de Pearson), en comparación con el vehículo.

  1. Creación del conjunto de datos en R

Los datos experimentales se agrupan dentro de una variable:

Valores de PearsonCC para vehículo (30 observaciones)

pearson_vehicle <- c(
  0.69, 0.67, 0.81, 0.78, 0.68, 0.80, 0.91, 0.88, 0.88, 0.79,
  0.76, 0.64, 0.84, 0.79, 0.74, 0.92, 0.74, 0.71, 0.87, 0.64,
  0.84, 0.79, 0.74, 0.92, 0.74, 0.71, 0.87, 0.79, 0.80, 0.78
)

length(pearson_vehicle)
## [1] 30

Valores de PearsonCC para metformina (30 observaciones)

pearson_metformin <- c(
  0.16, 0.21, 0.31, 0.47, 0.68, 0.69, 0.37, 0.48, 0.33, 0.54,
  0.43, 0.25, 0.48, 0.35, 0.43, 0.59, 0.23, 0.37, 0.20, 0.59,
  0.36, 0.27, 0.24, 0.48, 0.46, 0.09, 0.57, 0.50, 0.28, 0.39
)
length(pearson_metformin)  # debe ser 30
## [1] 30
  1. Construcción del data frame

El data frame nos permite organizar, almacenar y manipular grandes conjuntos de datos de manera eficiente, para esto:

  • data.frame: crea la tabla
  • Treatment: se crea una columna
  • rep(): replica los elementos de un vector
  • lenght(): cuenta los valores de ese objeto
  • levels(): define el orden de los factores
  • personCC: se crea una segunda columna
  • str(): muetra la estructura del objeto mett
  • head(): muestra las primeras 6 filas del data frame y que los datos se cargaron bien
  • nrow(mett): dice cuántas filas tiene tu data frame
mett <- data.frame(
  Treatment = factor(
    c(rep("vehicle", length(pearson_vehicle)),
      rep("metformin", length(pearson_metformin))),
    levels = c("vehicle", "metformin")
  ),
  PearsonCC = c(pearson_vehicle, pearson_metformin)
)

str(mett)
## 'data.frame':    60 obs. of  2 variables:
##  $ Treatment: Factor w/ 2 levels "vehicle","metformin": 1 1 1 1 1 1 1 1 1 1 ...
##  $ PearsonCC: num  0.69 0.67 0.81 0.78 0.68 0.8 0.91 0.88 0.88 0.79 ...
head(mett)
nrow(mett)
## [1] 60
  1. Análisis exploratorio descriptivo

    El análisis exploratorio descriptivo se usa para caracterizar la distribución de los datos y evaluar los supuestos de las pruebas paramétricas. Se determina:

    • Tamaño de muestra.

    • Media.

    • Desviación estándar.

    • Intervalos de confianza al 95 %.

3.1. Funciones auxiliares para intervalos de confianza

  • function(): Crea una función nueva
  • lower_ci: Calcula límite inferior del intervalo de confianza
  • upper_ci: Calcula límite superior del intervalo de confianza
  • mean: Media del grupo
  • se: Error estándar del grupo
  • n: Número de observaciones
  • conf_level: Nivel de confianza (por defecto 95%)
  • qt(): Obtiene valor crítico t para el IC
  • df = n - 1: Grados de libertad para el cálculo
  • mean - : Calcula el valor mínimo del IC
  • mean + : Calcula el valor máximo del IC
lower_ci <- function(mean, se, n, conf_level = 0.95) {
  mean - qt(1 - (1 - conf_level) / 2, df = n - 1) * se
}

upper_ci <- function(mean, se, n, conf_level = 0.95) {
  mean + qt(1 - (1 - conf_level) / 2, df = n - 1) * se
}

3.2. Resumen por tratamiento

desc_mett <- mett %>%
  group_by(Treatment) %>%
  summarise(
    n    = n(),
    mean = mean(PearsonCC, na.rm = TRUE),
    sd   = sd(PearsonCC, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    se       = sd / sqrt(n),
    lower_ci = lower_ci(mean, se, n),
    upper_ci = upper_ci(mean, se, n)
  )

desc_mett

El análisis descriptivo mostró diferencias claras entre los tratamientos. El grupo vehículo presentó un índice de Pearson promedio de 0.784 ± 0.080 (IC 95 %: 0.754–0.814), mientras que el grupo tratado con metformina mostró un valor significativamente menor de 0.393 ± 0.153 (IC 95 %: 0.336–0.450). Los intervalos de confianza al 95 % no se traslapan, lo que sugiere una disminución de la colocalización E–NS4A en presencia de metformina.

4 Verificación de supuestos para la prueba t

4.1. Supuesto de normalidad (Shapiro–Wilk)

with(mett, shapiro.test(PearsonCC[Treatment == "vehicle"]))
## 
##  Shapiro-Wilk normality test
## 
## data:  PearsonCC[Treatment == "vehicle"]
## W = 0.96534, p-value = 0.4207
with(mett, shapiro.test(PearsonCC[Treatment == "metformin"]))
## 
##  Shapiro-Wilk normality test
## 
## data:  PearsonCC[Treatment == "metformin"]
## W = 0.98343, p-value = 0.9075

En la prueba de Shapiro:

p > 0.05 → datos normales

p ≤ 0.05 → datos NO normales

Por los resultados obtenidos para mis dos grupos de datos puedo decir que estos son normales.

4.2. Evaluación gráfica de normalidad

mett %>%
  group_by(Treatment) %>%
  plot_normality(PearsonCC)
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## ℹ The deprecated feature was likely used in the dlookr package.
##   Please report the issue at <https://github.com/choonghyunryu/dlookr/issues>.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

4.3. Verificar la normalidad mediante la herramienta Dlookr

Esta nos da una normalidad general de todas las muestras

normality(mett)

Normalidad de la columna pearsonCC por la prueba Shapiro Wilk y despues para cada grupo

normality(mett, PearsonCC)
mett %>%
  group_by(Treatment) %>%
  normality(PearsonCC)

Y realizamos la gráfica de la normalidad que obtuvimos de cada grupo:

plot_normality(mett, PearsonCC)

  1. Supuesto de homogeneidad de varianzas
Se aplica la prueba F para igualdad de varianzas.

Hipótesis nula (H₀): Las varianzas de ambos grupos son similares.

Hipótesis alternativa (H₁): Las varianzas son diferentes.
res_ftest <- var.test(PearsonCC ~ Treatment, data = mett)
res_ftest
## 
##  F test to compare two variances
## 
## data:  PearsonCC by Treatment
## F = 0.2758, num df = 29, denom df = 29, p-value = 0.0008667
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.1312703 0.5794512
## sample estimates:
## ratio of variances 
##          0.2757984

La prueba F no mostró diferencias significativas entre las varianzas de los grupos (p ≥ 0.05), por lo que se asumió homogeneidad de varianzas y se aplicó la prueba t de Student clásica.

  1. Prueba estadística: t de Student para dos muestras independientes
# Ajustar var.equal según el resultado de la prueba F
res_t_mett <- t.test(
  PearsonCC ~ Treatment,
  data       = mett,
  alternative = "two.sided",
  var.equal   = TRUE
)

res_t_mett
## 
##  Two Sample t-test
## 
## data:  PearsonCC by Treatment
## t = 12.385, df = 58, p-value < 2.2e-16
## alternative hypothesis: true difference in means between group vehicle and group metformin is not equal to 0
## 95 percent confidence interval:
##  0.3275276 0.4538058
## sample estimates:
##   mean in group vehicle mean in group metformin 
##               0.7840000               0.3933333

Extracto de elementos clave:

p_value_t <- res_t_mett$p.value
means_t   <- res_t_mett$estimate
ci_t      <- res_t_mett$conf.int

p_value_t
## [1] 6.262511e-18
means_t
##   mean in group vehicle mean in group metformin 
##               0.7840000               0.3933333
ci_t
## [1] 0.3275276 0.4538058
## attr(,"conf.level")
## [1] 0.95

Mediante las pruebas de normalidad y homogeneidad de varianzas, se determino utilizar una prueba t de Student clásica, al asumirse varianzas iguales. Esta prueba mostró una diferencia estadísticamente significativa entre el grupo vehículo y el grupo tratado con metformina (t = 12.385, gl = 58, p < 2.2 × 10⁻¹⁶). Estos resultados indican que el tratamiento con metformina se asocia con una disminución significativa de la colocalización entre E y NS4A, lo que sugiere que la metformina podría afectar la interacción o proximidad espacial de estas proteínas durante la infección viral.

7. Visualización de resultados

7.1. Boxplot con puntos individuales y p-valor

max_y_mett <- max(mett$PearsonCC, na.rm = TRUE)

boxplot_mett <- ggboxplot(
  mett,
  x      = "Treatment",
  y      = "PearsonCC",
  color  = "Treatment",
  palette = c("#FFFF00", "violetred3"),
  ylab   = "Índice de colocalización de Pearson (E vs NS4A)",
  xlab   = "Tratamiento",
  add    = "jitter"
)

boxplot_mett +
  stat_compare_means(
    method  = "t.test",
    label.y = max_y_mett * 1.05
  ) +
  stat_compare_means(
    aes(label = ..p.signif..),
    method  = "t.test",
    label.y = max_y_mett * 1.10
  )

7.2. Barplot con medias y desviación estándar

barplot_mett <- ggbarplot(
  mett,
  x       = "Treatment",
  y       = "PearsonCC",
  color   = "Treatment",
  fill    = "Treatment",          # usar la variable de grupo como relleno
  palette = c("#FFFF00", "violetred3"),
  ylab    = "Índice de colocalización de Pearson (E vs NS4A)",
  xlab    = "Tratamiento",
  add     = "mean_sd"             # barras de error con media ± SD
)

barplot_mett +
  stat_compare_means(
    method  = "t.test",
    label.y = max_y_mett * 1.05
  ) +
  stat_compare_means(
    aes(label = ..p.signif..),
    method  = "t.test",
    label.y = max_y_mett * 1.10
  )

Las representaciones gráficas muestran una diferencia clara en el índice de Pearson entre los grupos vehículo y metformina.

En ambas gráficas, el grupo vehículo presenta valores de colocalización más altos y con menor dispersión, mientras que el grupo tratado con metformina muestra valores notablemente menores y una mayor variabilidad. La separación visible entre los grupos concuerda con los resultados del análisis estadístico, y la anotación del p-valor confirma que la diferencia observada es estadísticamente significativa.

Estas visualizaciones respaldan los resultados numéricos obtenidos mediante la prueba t de Student, evidenciando que el tratamiento con metformina se asocia con una disminución del índice de Pearson, es decir, una menor colocalización entre las proteínas E y NS4A.

C) Practica 2: Efecto de Metformina en la formación de complejos replicativos de ZIKV

En esta práctica se analizan valores de intensidad relativa de señal (RBI) para la proteína NUP98 en tres condiciones experimentales:

  • Zika24h

  • NS2B3Mut

  • NS2B3WT

Cada condición tiene tres replicados. El objetivo es:

Objetivo: Determinar si existen diferencias estadísticamente significativas en la intensidad relativa de NUP98 entre las tres condiciones.

  1. Creación del data frame en R

Zika24h: 0.547, 0.52, 0.65

NS2B3Mut: 0.988, 1.09, 0.927

NS2B3WT: 0.72, 0.739, 0.82

nup98 <- data.frame(
  nup98 = factor(
    c(rep("Zika24h", 3),
      rep("NS2B3Mut", 3),
      rep("NS2B3WT", 3)),
    levels  = c("Zika24h", "NS2B3Mut", "NS2B3WT"),
    ordered = TRUE
  ),
  RBI = c(
    0.547, 0.52, 0.65,
    0.988, 1.09, 0.927,
    0.72, 0.739, 0.82
  )
)

str(nup98)
## 'data.frame':    9 obs. of  2 variables:
##  $ nup98: Ord.factor w/ 3 levels "Zika24h"<"NS2B3Mut"<..: 1 1 1 2 2 2 3 3 3
##  $ RBI  : num  0.547 0.52 0.65 0.988 1.09 0.927 0.72 0.739 0.82
nup98
  1. Análisis exploratorio descriptivo
desc_nup98 <- nup98 %>%
  group_by(nup98) %>%
  summarise(
    n    = n(),
    mean = mean(RBI, na.rm = TRUE),
    sd   = sd(RBI, na.rm = TRUE),
    .groups = "drop"
  )

desc_nup98
  1. Verificar la normalidad

Se aplica la prueba de shapiro con el fin de evaluar la normalidad dentro de cada condición.

by(nup98$RBI, nup98$nup98, shapiro.test)
## nup98$nup98: Zika24h
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.89773, p-value = 0.3783
## 
## ------------------------------------------------------------ 
## nup98$nup98: NS2B3Mut
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.97935, p-value = 0.7246
## 
## ------------------------------------------------------------ 
## nup98$nup98: NS2B3WT
## 
##  Shapiro-Wilk normality test
## 
## data:  dd[x, ]
## W = 0.88642, p-value = 0.3435

En la prueba de Shapiro:

p > 0.05 → datos normales

p ≤ 0.05 → datos NO normales

Por los resultados obtenidos para mis tres grupos de datos puedo decir que estos son normales.

  1. Verificación de supuestos para ANOVA

4.1. Ajuste inicial del modelo ANOVA

En un inicio para verificar si el ANOVA era una prueba valida, se verificaron los supuestos del modelo. Para ello, se realiza un ajuste inicial del modelo de ANOVA de una vía, a partir del cual se obtienen los residuos. Estos residuos fueron evaluados para comprobar normalidad y homogeneidad de varianzas, con el fin de asegurar la validez de las inferencias estadísticas.

resultado_anova <- aov(RBI ~ nup98, data = nup98)
summary(resultado_anova)
##             Df  Sum Sq Mean Sq F value   Pr(>F)    
## nup98        2 0.27798 0.13899   29.14 0.000813 ***
## Residuals    6 0.02862 0.00477                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
  1. Homogeneidad de varianzas

5.1. Evaluación gráfica (residuos vs valores ajustados)

plot(resultado_anova, which = 1)

5.2. Prueba de Levene

leveneTest(RBI ~ nup98, data = nup98)

5.3. Normalidad de los residuos

resid_anova <- residuals(resultado_anova)

# Q-Q plot
plot(resultado_anova, which = 2)

5.4 . Prueba de normalidad sobre los residuos

shapiro.test(resid_anova)
## 
##  Shapiro-Wilk normality test
## 
## data:  resid_anova
## W = 0.88378, p-value = 0.172
  1. Prueba ANOVA de una vía y comparaciones post-hoc

6.1. ANOVA global

summary(resultado_anova)
##             Df  Sum Sq Mean Sq F value   Pr(>F)    
## nup98        2 0.27798 0.13899   29.14 0.000813 ***
## Residuals    6 0.02862 0.00477                     
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

6.2. Prueba de Tukey (post-hoc)

TukeyHSD(resultado_anova)
##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = RBI ~ nup98, data = nup98)
## 
## $nup98
##                        diff         lwr         upr     p adj
## NS2B3Mut-Zika24h  0.4293333  0.25631482  0.60235185 0.0006545
## NS2B3WT-Zika24h   0.1873333  0.01431482  0.36035185 0.0367107
## NS2B3WT-NS2B3Mut -0.2420000 -0.41501852 -0.06898148 0.0121671

El ANOVA de una vía reveló diferencias significativas en la intensidad relativa de NUP98 entre las condiciones experimentales (F(2, 6) = 29.14, p = 0.000813). El análisis post-hoc de Tukey mostró que tanto NS2B3Mut como NS2B3WT presentan valores de RBI significativamente mayores que Zika24h. Además, NS2B3Mut mostró una intensidad significativamente mayor que NS2B3WT.

Estos resultados indican que la condición NS2B3Mut induce un aumento marcado en la intensidad relativa de NUP98 en comparación con Zika24h y NS2B3WT, mientras que NS2B3WT presenta un incremento intermedio.

  1. Visualización de resultados

7.1.Boxplot por grupo

max_y_nup <- max(nup98$RBI, na.rm = TRUE)

boxplot_nup <- ggboxplot(
  nup98,
  x      = "nup98",
  y      = "RBI",
  color  = "nup98",                         
  fill   = "nup98",                         
  palette = c("#EEEE00", "#CD8500", "#7AC5CD"),
  order  = c("Zika24h", "NS2B3Mut", "NS2B3WT"),
  ylab   = "Intensidad relativa (unidades arbitrarias)",
  xlab   = "Condiciones",
  add    = "jitter"
)

boxplot_nup +
  stat_compare_means(
    method  = "anova",
    label.y = max_y_nup * 1.05
  )

7.2. Anotaciones de comparaciones específicas

my_comparisons <- list(
  c("Zika24h",  "NS2B3Mut"),
  c("Zika24h",  "NS2B3WT"),
  c("NS2B3Mut", "NS2B3WT")
)
ggplot(nup98, aes(x = nup98, y = RBI)) +
  geom_boxplot() +
  geom_signif(
    comparisons      = my_comparisons,
    map_signif_level = TRUE,
    step_increase    = 0.1
  ) +
  ylab("Intensidad relativa (unidades arbitrarias)") +
  xlab("Condiciones")

7.3. Barplot con medias y desviación estándar

barplot_nup <- ggbarplot(
  nup98,
  x       = "nup98",
  y       = "RBI",
  color   = "nup98",                         # contorno por grupo
  fill    = "nup98",                         # relleno por grupo
  palette = c("#EEEE00", "#CD8500", "#7AC5CD"),
  order   = c("Zika24h", "NS2B3Mut", "NS2B3WT"),
  ylab    = "Intensidad relativa (unidades arbitrarias)",
  xlab    = "Condiciones",
  add     = "mean_sd"
)

max_y_nup <- max(nup98$RBI, na.rm = TRUE)

barplot_nup +
  stat_compare_means(
    method  = "anova",
    label.y = max_y_nup * 1.05
  )

7.4.Gráfico de líneas de medias

ggline(
  nup98,
  x     = "nup98",
  y     = "RBI",
  add   = c("mean_sd", "jitter"),
  order = c("Zika24h", "NS2B3Mut", "NS2B3WT"),
  ylab  = "Intensidad relativa (unidades arbitrarias)",
  xlab  = "Condiciones"
)

En conjunto, las gráficas permiten visualizar de forma clara el efecto de la condición experimental sobre la intensidad relativa de NUP98. El patrón observado es consistente con los resultados estadísticos, mostrando un aumento significativo de RBI en NS2B3Mut, un valor intermedio en NS2B3WT y los niveles más bajos en Zika24h.