Alumno: Juan Rafael Melo Morales
Profesor: Dr. Juan Fidel Osuna-Ramos
Curso de Bioestadística en R · 2025
- 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)
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.
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
El data frame nos permite organizar, almacenar y manipular grandes conjuntos de datos de manera eficiente, para esto:
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
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
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)
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.
# 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.
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.
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
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
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.
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
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
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.
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.