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.
Réplica (Pozo) Ct Aproximado
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.
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 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.
Muestra Ct Concentración Estimada (ng)
G1-M 2 286.7348
G2-M 14 1.9465