if (!require("pacman"))
  install.packages("pacman")
## Loading required package: pacman

Llamar a la paqueteria

library("pacman")

p_load("vroom",
       "ggplot2",
       "dplyr",
       "ggrepel",
       "tidyverse",
       "scales")

llamar a la base de datos

Datos_PCR <- vroom("https://raw.githubusercontent.com/ManuelLaraMVZ/Metabolomica_2026_1/refs/heads/main/Cts")
## Rows: 20 Columns: 5
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (4): Well, Grupo, Practica, Fluor
## dbl (1): Cq
## 
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
Datos_PCR
## # A tibble: 20 Ă— 5
##    Well       Grupo      Practica Fluor    Cq
##    <chr>      <chr>      <chr>    <chr> <dbl>
##  1 50         Curva      Absoluta SYBR   5.15
##  2 10         Curva      Absoluta SYBR  10.8 
##  3 5          Curva      Absoluta SYBR  13.9 
##  4 1          Curva      Absoluta SYBR  15.7 
##  5 0.5        Curva      Absoluta SYBR  16.5 
##  6 0.1        Curva      Absoluta SYBR  18.3 
##  7 Muestra    G1         Absoluta SYBR  11.5 
##  8 Muestra    G2         Absoluta SYBR  13.1 
##  9 A01        G1         Relativa SYBR  28.6 
## 10 A02        G1         Relativa SYBR  15.0 
## 11 A03        G1         Relativa SYBR  14.0 
## 12 A04        G1         Relativa SYBR  50   
## 13 A05        G1         Relativa SYBR  15.5 
## 14 A06        G1         Relativa SYBR  12.6 
## 15 A01        G2         Relativa SYBR  12.7 
## 16 A02        G2         Relativa SYBR  16.3 
## 17 A03        G2         Relativa SYBR  13.1 
## 18 Referencia Referencia Relativa SYBR  18.4 
## 19 Profesor   G1         Relativa SYBR  20.0 
## 20 Profesor   G2         Relativa SYBR  20.0

Filtrado de datos

Datos_curva <- Datos_PCR %>% 
  filter(Practica=="Absoluta",
         Grupo == "Curva") %>% 
  select("Well","Cq") %>% 
  mutate(Well= as.numeric(Well),
         Curva= Well, 
         LogConc= log10(Curva)) %>% 
  select (3,4,2)


Datos_curva
## # A tibble: 6 Ă— 3
##   Curva LogConc    Cq
##   <dbl>   <dbl> <dbl>
## 1  50     1.70   5.15
## 2  10     1     10.8 
## 3   5     0.699 13.9 
## 4   1     0     15.7 
## 5   0.5  -0.301 16.5 
## 6   0.1  -1     18.3

Grafica de datos

Grafica <- ggplot(Datos_curva,
                  aes(x=LogConc,
                      y= Cq))+
  geom_point(color= "#900C3F",size = 4)+ 
  theme_classic()

Grafica

Realizar el ajuste linear

modelo_lineal <- lm (data = Datos_curva, Cq ~LogConc)

modelo_lineal
## 
## Call:
## lm(formula = Cq ~ LogConc, data = Datos_curva)
## 
## Coefficients:
## (Intercept)      LogConc  
##      14.991       -4.655

Obtencion de los coeficientes

coeficientes <- coef(modelo_lineal)

coeficientes
## (Intercept)     LogConc 
##   14.990632   -4.654892

Pendiente

m <- round (coeficientes [2],2)

m
## LogConc 
##   -4.65

IntersecciĂ³n

y0 <- round(coeficientes[1],2)

y0
## (Intercept) 
##       14.99

PredicciĂ³n modelo

prediccion <- data.frame(LogConc = seq(min(Datos_curva$LogConc),
                                         max(Datos_curva$LogConc),
                                         lenght.out = 100))
## Warning: In seq.default(min(Datos_curva$LogConc), max(Datos_curva$LogConc), 
##     lenght.out = 100) :
##  extra argument 'lenght.out' will be disregarded
prediccion$Cq <- predict(modelo_lineal,newdata = prediccion)
head(prediccion)
##   LogConc       Cq
## 1      -1 19.64552
## 2       0 14.99063
## 3       1 10.33574

Obtenemos el valor de R2

resumen_modelo <- summary(modelo_lineal)

resumen_modelo
## 
## Call:
## lm(formula = Cq ~ LogConc, data = Datos_curva)
## 
## Residuals:
##        1        2        3        4        5        6 
## -1.93651  0.43656  2.12380  0.69647  0.06971 -1.39002 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  14.9906     0.7233  20.725  3.2e-05 ***
## LogConc      -4.6549     0.7579  -6.142  0.00356 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.649 on 4 degrees of freedom
## Multiple R-squared:  0.9041, Adjusted R-squared:  0.8802 
## F-statistic: 37.73 on 1 and 4 DF,  p-value: 0.003563

Obtener el valor de R^2

R2 <- round(resumen_modelo$r.squared,4)

R2
## [1] 0.9041

Queremos la ecuaciĂ³n para publicarla en la grafica

ecuacion_recta <- paste0("y=",m,"x + ",y0,"\nR^2= ",R2)

cat("y=",m,"x + ",y0,"\nR^2= ",R2)
## y= -4.65 x +  14.99 
## R^2=  0.9041

Grafica del ajuste y de la ecuaciĂ³n

Grafica_ajuste <- Grafica+
 geom_smooth(

  data = prediccion,

  aes(x = LogConc, y = Cq),

  method = "lm",      # đŸ‘ˆ ESTO ES LA CLAVE

  se = FALSE,         # đŸ‘ˆ quita la sombra

  color = "#65AD65",

  linewidth = 1.5)+
  labs (title = "Curva estandar de RT-PCR",
        subtitle = "Equipo: JPP",
        caption = "Diseño: Paulina A.",
        x= "Log10 (ConcentraciĂ³n [pg/uL]",
        y= "Cycle threshdold (Ct)")+
  theme_classic(base_size = 15)+
  scale_y_continuous(labels = number_format(accuracy = 1))+
  theme(plot.title = element_text(hjust = 0.5,face = "bold"),
        axis.title.x = element_text(face = "bold"),
        axis.title.y = element_text(face = "bold"))+
  annotate("text",
           x=max(Datos_curva$LogConc)-1.5,
           y= min(Datos_curva$Cq)+13,
           label = ecuacion_recta,
           color = "#581845",
           size = 5,
           fontface = "bold",
           hjust = 0)

Grafica_ajuste
## `geom_smooth()` using formula = 'y ~ x'

Prediccion de la concentracion de la muestra

Datos_PCR
## # A tibble: 20 Ă— 5
##    Well       Grupo      Practica Fluor    Cq
##    <chr>      <chr>      <chr>    <chr> <dbl>
##  1 50         Curva      Absoluta SYBR   5.15
##  2 10         Curva      Absoluta SYBR  10.8 
##  3 5          Curva      Absoluta SYBR  13.9 
##  4 1          Curva      Absoluta SYBR  15.7 
##  5 0.5        Curva      Absoluta SYBR  16.5 
##  6 0.1        Curva      Absoluta SYBR  18.3 
##  7 Muestra    G1         Absoluta SYBR  11.5 
##  8 Muestra    G2         Absoluta SYBR  13.1 
##  9 A01        G1         Relativa SYBR  28.6 
## 10 A02        G1         Relativa SYBR  15.0 
## 11 A03        G1         Relativa SYBR  14.0 
## 12 A04        G1         Relativa SYBR  50   
## 13 A05        G1         Relativa SYBR  15.5 
## 14 A06        G1         Relativa SYBR  12.6 
## 15 A01        G2         Relativa SYBR  12.7 
## 16 A02        G2         Relativa SYBR  16.3 
## 17 A03        G2         Relativa SYBR  13.1 
## 18 Referencia Referencia Relativa SYBR  18.4 
## 19 Profesor   G1         Relativa SYBR  20.0 
## 20 Profesor   G2         Relativa SYBR  20.0
Dato_muestra <- Datos_PCR %>% 
  filter(Practica == "Absoluta",
         Grupo == "G2") %>% 
  select("Well","Cq")

Dato_muestra
## # A tibble: 1 Ă— 2
##   Well       Cq
##   <chr>   <dbl>
## 1 Muestra  13.1

Obtener el valor de Ct

Ct_muestra <- round (Dato_muestra$Cq,2)

Ct_muestra
## [1] 13.11

Obtener el valor de x

LogConc_calculado <- (Ct_muestra-y0)/m

LogConc_calculado
## (Intercept) 
##   0.4043011

Valor real

Valor_real <- 10^LogConc_calculado

cat("La concentraciĂ³n de la muestra es",round(Valor_real,2),"pg/uL")
## La concentraciĂ³n de la muestra es 2.54 pg/uL

Construccion de Data.frame

Datos_muestra <- data.frame (Concentracion_real = round (Valor_real,2),
                             LogConc= round(LogConc_calculado,2),
                             Cq= Ct_muestra)

Datos_muestra
##             Concentracion_real LogConc    Cq
## (Intercept)               2.54     0.4 13.11

Grafica de la muestra

Grafica_muestra <- Grafica_ajuste + 

  geom_point(

    data = Datos_muestra,

    aes(x = LogConc, y = Cq),

    color = "black",

    size = 6

  ) +

  geom_segment(

    aes(x = min(Datos_curva$LogConc),

        xend = LogConc_calculado,

        y = Ct_muestra,

        yend = Ct_muestra),

    linetype = "dotted",

    color = "#2f2d2c",

    linewidth = 1.5

  ) +

  geom_segment(

    aes(x = LogConc_calculado,

        xend = LogConc_calculado,

        y = min(Datos_curva$Cq),

        yend = Ct_muestra),

    linetype = "dotted",

    color = "#2f2d2c",

    linewidth = 1.5

  ) +

  annotate(

  "text",

  x = LogConc_calculado,

  y = Ct_muestra,

  label = paste0("[ Muestra ] = ", round(Valor_real, 2), " pg/uL"),

  color = "black",

  size = 4,      # đŸ‘ˆ mĂ¡s chico

  fontface = "bold",

  hjust = -0.1,  # đŸ‘ˆ lo mueve ligeramente a la derecha

  vjust = -0.5   # đŸ‘ˆ lo sube un poquito

) 
Grafica_muestra
## Warning: Use of `Datos_curva$LogConc` is discouraged.
## ℹ Use `LogConc` instead.
## Warning in geom_segment(aes(x = min(Datos_curva$LogConc), xend = LogConc_calculado, : All aesthetics have length 1, but the data has 6 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
##   a single row.
## Warning: Use of `Datos_curva$Cq` is discouraged.
## ℹ Use `Cq` instead.
## Warning in geom_segment(aes(x = LogConc_calculado, xend = LogConc_calculado, : All aesthetics have length 1, but the data has 6 rows.
## ℹ Please consider using `annotate()` or provide this layer with data containing
##   a single row.
## `geom_smooth()` using formula = 'y ~ x'