Los Chunks los obtengo con :Ctrl+Alt+I/Cmd+Opt+I, #ctrl shift m para
el simbolo %>%
if(!require("pacman"))
install.packages("pacman")
## Cargando paquete requerido: pacman
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_G2.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 2",
subtitle = "Gen: β-actina | Tejido: Cerebro",
x = "Ciclos",
y = "Fluorescencia (RFU)",
color = "Réplica",
caption = "RT-qPCR | Práctica No. 3 | Equipo A3"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
legend.position = "right"
)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once per session.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

curva_A3 <- datos_relativa %>% select(Cycle, A3)
ggplot(curva_A3, aes(x = Cycle, y = A3)) +
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 A3 (Pozo A3)",
subtitle = "Gen: β-actina | Tejido: Cerebro",
x = "Ciclos",
y = "Fluorescencia (RFU)",
caption = "RT-qPCR | Práctica No. 3 | Equipo A3"
) +
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_G2.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 2",
subtitle = "Gen: β-actina | Tejido: Cerebro",
x = "Temperatura (°C)",
y = "Fluorescencia (RFU)",
color = "Réplica",
caption = "RT-qPCR | Práctica No. 3 | Equipo A3"
) +
theme_classic(base_size = 13) +
theme(plot.title = element_text(face = "bold"))

disoc_A3 <- datos_disoc %>% select(Temperature, A3)
ggplot(disoc_A3, aes(x = Temperature, y = A3)) +
geom_line(color = "#d62728", size = 1.3) +
geom_point(color = "#d62728", size = 0.7, alpha = 0.5) +
labs(
title = "Curva de Disociación – Equipo A3 (Pozo A3)",
subtitle = "Gen: β-actina | Tejido: Hígado",
x = "Temperatura (°C)",
y = "Fluorescencia (RFU)",
caption = "RT-qPCR | Práctica No. 3 | Equipo A3"
) +
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 A3"
) +
theme_classic(base_size = 13) +
theme(
plot.title = element_text(face = "bold"),
legend.position = "right"
)

abs_A3 <- datos_abs %>%
select(Cycle, `50 ng`, `10 ng`, `5 ng`, `1 ng`, `0.5 ng`, `0.1 ng`, `G1-M`)
abs_A3_largo <- abs_A3 %>%
pivot_longer(cols = -Cycle, names_to = "Muestra", values_to = "Fluorescencia")
ggplot(abs_A3_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 A3 (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 A3"
) +
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")
Tabla 1. Valores de Ct estimados para cada réplica del Grupo
1.
| A1 |
16 |
| A2 |
19 |
| A3 |
18 |
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.67
cat("Desviación estándar:", round(sd(ct_validos$Ct), 2), "\n")
## Desviación estándar: 1.53
cat("Coeficiente de variación (%):", round(sd(ct_validos$Ct)/mean(ct_validos$Ct)*100, 2), "\n")
## Coeficiente de variación (%): 8.65
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")
Tabla 2. Valores de Ct estimados para cada muestra y
concentración en la qPCR absoluta.
| 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 A3"
) +
theme_classic(base_size = 13) +
theme(plot.title = element_text(face = "bold"))
## `geom_smooth()` using formula = 'y ~ x'

# 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")
Tabla 3. Concentración estimada de las muestras G1-M y G2-M
interpolada en la curva estándar.
| G1-M |
2 |
286.7348 |
| G2-M |
14 |
1.9465 |