library(pacman)
p_load("ggplot2", "dplyr", "tidyr", "vroom")
datos_relativa <- vroom("https://raw.githubusercontent.com/ManuelLaraMVZ/Metabolomica_2026_1/refs/heads/main/Amplificaci%C3%B3n-RT-qPCR-20261_G1.csv",
show_col_types = FALSE)
datos_largo <- datos_relativa %>%
pivot_longer(cols = -Cycle, names_to = "Pozo", values_to = "Fluorescencia")
colores_g1 <- c("A1" = "#1f77b4", "A2" = "#ff7f0e", "A3" = "#2ca02c",
"A4" = "#d62728", "A5" = "#9467bd", "A6" = "#8c564b")
ggplot(datos_largo, aes(x = Cycle, y = Fluorescencia, color = Pozo)) +
geom_line(size = 1.0) +
geom_point(size = 0.8, alpha = 0.6) +
scale_color_manual(values = colores_g1) +
labs(
title = "Curvas de Amplificación Relativa – Grupo 1",
subtitle = "Gen: β-actina | Tejido: Hígado",
x = "Ciclos",
y = "Fluorescencia (RFU)",
color = "Réplica",
caption = "RT-qPCR | Práctica No. 3 | Equipo A4"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
legend.position = "right"
)curva_A4 <- datos_relativa %>% select(Cycle, A4)
ggplot(curva_A4, aes(x = Cycle, y = A4)) +
geom_line(color = "#d62728", size = 1.3) +
geom_point(color = "#d62728", size = 1.5) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray50") +
labs(
title = "Curva de Amplificación Relativa – Equipo A4 (Pozo A4)",
subtitle = "Gen: β-actina | Tejido: Hígado",
x = "Ciclos",
y = "Fluorescencia (RFU)",
caption = "RT-qPCR | Práctica No. 3 | Equipo A4"
) +
theme_classic(base_size = 13) +
theme(plot.title = element_text(face = "bold"))datos_disoc <- vroom("https://raw.githubusercontent.com/ManuelLaraMVZ/Metabolomica_2026_1/refs/heads/main/Disociaci%C3%B3n_G1.csv",
show_col_types = FALSE)
disoc_largo <- datos_disoc %>%
pivot_longer(cols = -Temperature, names_to = "Pozo", values_to = "Fluorescencia")
ggplot(disoc_largo, aes(x = Temperature, y = Fluorescencia, color = Pozo)) +
geom_line(size = 1.0) +
scale_color_manual(values = colores_g1) +
labs(
title = "Curvas de Disociación – Grupo 1",
subtitle = "Gen: β-actina | Tejido: Hígado",
x = "Temperatura (°C)",
y = "Fluorescencia (RFU)",
color = "Réplica",
caption = "RT-qPCR | Práctica No. 3 | Equipo A4"
) +
theme_classic(base_size = 13) +
theme(plot.title = element_text(face = "bold"))disoc_A4 <- datos_disoc %>% select(Temperature, A4)
ggplot(disoc_A4, aes(x = Temperature, y = A4)) +
geom_line(color = "#d62728", size = 1.3) +
geom_point(color = "#d62728", size = 0.7, alpha = 0.5) +
labs(
title = "Curva de Disociación – Equipo A4 (Pozo A4)",
subtitle = "Gen: β-actina | Tejido: Hígado",
x = "Temperatura (°C)",
y = "Fluorescencia (RFU)",
caption = "RT-qPCR | Práctica No. 3 | Equipo A4"
) +
theme_classic(base_size = 13) +
theme(plot.title = element_text(face = "bold"))datos_abs <- vroom("https://raw.githubusercontent.com/ManuelLaraMVZ/Metabolomica_2026_1/refs/heads/main/Amplificacion_ambos%20grupos.csv",
show_col_types = FALSE)
# Limpiar nombres de columnas
names(datos_abs) <- trimws(names(datos_abs))
abs_largo <- datos_abs %>%
pivot_longer(cols = -Cycle, names_to = "Muestra", values_to = "Fluorescencia")
colores_abs <- c(
"50 ng" = "#d62728",
"10 ng" = "#ff7f0e",
"5 ng" = "#bcbd22",
"1 ng" = "#2ca02c",
"0.5 ng" = "#17becf",
"0.1 ng" = "#9467bd",
"G1-M" = "#1f77b4",
"G2-M" = "#8c564b"
)
ggplot(abs_largo, aes(x = Cycle, y = Fluorescencia, color = Muestra)) +
geom_line(size = 1.0) +
scale_color_manual(values = colores_abs) +
labs(
title = "Curvas de Amplificación Absoluta – Ambos Grupos",
subtitle = "Plásmido plenti-eGFP | Concentraciones 0.1–50 ng + muestras G1-M y G2-M",
x = "Ciclos",
y = "Fluorescencia (RFU)",
color = "Muestra / Concentración",
caption = "qPCR Cuantificación Absoluta | Práctica No. 4 | Equipo A4"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
legend.position = "right"
)abs_A4 <- datos_abs %>%
select(Cycle, `50 ng`, `10 ng`, `5 ng`, `1 ng`, `0.5 ng`, `0.1 ng`, `G1-M`)
abs_A4_largo <- abs_A4 %>%
pivot_longer(cols = -Cycle, names_to = "Muestra", values_to = "Fluorescencia")
ggplot(abs_A4_largo, aes(x = Cycle, y = Fluorescencia, color = Muestra)) +
geom_line(size = 1.1) +
scale_color_manual(values = colores_abs) +
labs(
title = "Curvas de Amplificación Absoluta – Equipo A4 (G1-M y estándares)",
subtitle = "Plásmido plenti-eGFP | Concentraciones 0.1–50 ng + muestra G1-M",
x = "Ciclos",
y = "Fluorescencia (RFU)",
color = "Muestra / Concentración",
caption = "qPCR Cuantificación Absoluta | Práctica No. 4 | Equipo A4"
) +
theme_classic(base_size = 13) +
theme(plot.title = element_text(face = "bold"))# Determinar Ct aproximado: primer ciclo donde fluorescencia supera umbral = 10 RFU
umbral <- 10
ct_tabla <- datos_relativa %>%
pivot_longer(cols = -Cycle, names_to = "Pozo", values_to = "Fluorescencia") %>%
filter(Fluorescencia >= umbral) %>%
group_by(Pozo) %>%
summarise(Ct = min(Cycle), .groups = "drop")
knitr::kable(ct_tabla,
col.names = c("Réplica (Pozo)", "Ct Aproximado"),
caption = "Tabla 1. Valores de Ct estimados para cada réplica del Grupo 1.",
align = "cc")| Réplica (Pozo) | Ct Aproximado |
|---|---|
| A1 | 29 |
| A2 | 16 |
| A3 | 15 |
| A5 | 16 |
| A6 | 13 |
ct_validos <- ct_tabla %>% filter(Pozo != "A4") # A4 no amplificó (control negativo o falla)
cat("Ct promedio (réplicas válidas A2, A3, A5, A6):", round(mean(ct_validos$Ct), 2), "\n")## Ct promedio (réplicas válidas A2, A3, A5, A6): 17.8
## Desviación estándar: 6.38
## Coeficiente de variación (%): 35.84
umbral_abs <- 50 # umbral ajustado para valores absolutos
ct_abs <- datos_abs %>%
pivot_longer(cols = -Cycle, names_to = "Muestra", values_to = "Fluorescencia") %>%
filter(Fluorescencia >= umbral_abs) %>%
group_by(Muestra) %>%
summarise(Ct = min(Cycle), .groups = "drop")
knitr::kable(ct_abs,
col.names = c("Muestra / Concentración", "Ct Aproximado"),
caption = "Tabla 2. Valores de Ct estimados para cada muestra y concentración en la qPCR absoluta.",
align = "cc")| Muestra / Concentración | Ct Aproximado |
|---|---|
| 0.1 ng | 20 |
| 0.5 ng | 18 |
| 1 ng | 15 |
| 10 ng | 12 |
| 5 ng | 13 |
| 50 ng | 4 |
| G1-M | 2 |
| G2-M | 14 |
# Construir curva estándar con las concentraciones conocidas
concentraciones <- c(50, 10, 5, 1, 0.5, 0.1)
nombres_std <- c("50 ng", "10 ng", "5 ng", "1 ng", "0.5 ng", "0.1 ng")
ct_std <- ct_abs %>%
filter(Muestra %in% nombres_std) %>%
mutate(Concentracion = concentraciones[match(Muestra, nombres_std)],
log_conc = log10(Concentracion))
# Regresión lineal
modelo <- lm(Ct ~ log_conc, data = ct_std)
r2 <- summary(modelo)$r.squared
pendiente <- coef(modelo)[2]
eficiencia <- (10^(-1/pendiente) - 1) * 100
ggplot(ct_std, aes(x = log_conc, y = Ct)) +
geom_point(color = "#1f77b4", size = 3) +
geom_smooth(method = "lm", se = TRUE, color = "#ff7f0e", linetype = "dashed") +
annotate("text", x = min(ct_std$log_conc) + 0.3, y = max(ct_std$Ct) - 0.5,
label = paste0("R² = ", round(r2, 4),
"\nEficiencia = ", round(eficiencia, 1), "%"),
hjust = 0, size = 4, color = "black") +
labs(
title = "Curva Estándar – Cuantificación Absoluta",
subtitle = "Plásmido plenti-eGFP | log₁₀(Concentración) vs Ct",
x = "log₁₀ [Concentración (ng)]",
y = "Ct (Ciclo Umbral)",
caption = "qPCR Cuantificación Absoluta | Práctica No. 4 | Equipo A4"
) +
theme_classic(base_size = 13) +
theme(plot.title = element_text(face = "bold"))# Estimar concentración de G1-M y G2-M
ct_muestras <- ct_abs %>% filter(Muestra %in% c("G1-M", "G2-M"))
ct_muestras <- ct_muestras %>%
mutate(
log_conc_estimada = (Ct - coef(modelo)[1]) / coef(modelo)[2],
Concentracion_estimada_ng = round(10^log_conc_estimada, 4)
) %>%
select(Muestra, Ct, Concentracion_estimada_ng)
knitr::kable(ct_muestras,
col.names = c("Muestra", "Ct", "Concentración Estimada (ng)"),
caption = "Tabla 3. Concentración estimada de las muestras G1-M y G2-M interpolada en la curva estándar.",
align = "ccc")| Muestra | Ct | Concentración Estimada (ng) |
|---|---|---|
| G1-M | 2 | 286.7348 |
| G2-M | 14 | 1.9465 |