1 Resultados

1.0.1 1.1 Curvas de Amplificación Relativas – Grupo 1

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"
  )

1.0.2 1.2 Curvas de Amplificación Relativas – Equipo A4

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"))


1.1 2. Curvas de Disociación (Melting Curves)

1.1.1 2.1 Curvas de Disociación – Grupo 1 (Grupal)

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"))

1.1.2 2.2 Curvas de Disociación – Equipo A4 (Pozo A4)

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"))


1.2 3. Curvas de Amplificación de Valores Absolutos

1.2.1 3.1 Curvas de Amplificación Absoluta – Ambos Grupos (Grupal)

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"
  )

1.2.2 3.2 Curvas de Amplificación Absoluta – Equipo A4 (G1-M)

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"))


1.3 4. Análisis Relativo

# 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.
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
cat("Desviación estándar:", round(sd(ct_validos$Ct), 2), "\n")
## Desviación estándar: 6.38
cat("Coeficiente de variación (%):", round(sd(ct_validos$Ct)/mean(ct_validos$Ct)*100, 2), "\n")
## Coeficiente de variación (%): 35.84

1.4 5. Análisis Absoluto

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