Los programas que se requieren para todo el ejercicio se muestran en el siquiente chunk:

if(!require(pacman)) install.packages("pacman", dependencies=TRUE)
## Loading required package: pacman
## Warning: package 'pacman' was built under R version 4.2.3

llamamos a la librería de pacman

library("pacman")

llamamos a los paquetes con p_load

p_load("vroom",
       "ggplot2",
       "ggrepel",
       "dplyr",
       "tidyr")

De las bases de datos que se encuentran en el repositorio general, seleccionar el que se necesita y luego llamamos al archivo Raw

Melting_curve <- vroom(file = "https://raw.githubusercontent.com/ManuelLaraMVZ/resultados_PCR_practica/refs/heads/main/Disoci_ejemplo1.csv")
## Rows: 55 Columns: 6
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (6): Temperature, A1, B1, C1, D1, E1
## 
## ℹ 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.
Melting_curve
## # A tibble: 55 × 6
##    Temperature    A1    B1    C1    D1     E1
##          <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1        65    1.96  1.98  2.11  2.11 0.0869
##  2        65.5  1.94  1.99  2.06  2.08 0.0834
##  3        66    1.89  1.93  2.03  2.07 0.0932
##  4        66.5  1.86  1.89  1.98  2.02 0.0676
##  5        67    1.82  1.89  1.94  1.98 0.0738
##  6        67.5  1.77  1.83  1.90  1.93 0.0766
##  7        68    1.74  1.78  1.86  1.87 0.0686
##  8        68.5  1.70  1.76  1.79  1.84 0.0689
##  9        69    1.65  1.71  1.79  1.80 0.0665
## 10        69.5  1.60  1.64  1.75  1.76 0.0744
## # … with 45 more rows
Melting_curve2 <- Melting_curve %>% 
  mutate(Temperatura = Temperature, MLL = A1, JRL = B1, PPOF = C1, FRAC = D1, AALE = E1) %>% 
  select(-Temperature: -E1)
Melting_curve2
## # A tibble: 55 × 6
##    Temperatura   MLL   JRL  PPOF  FRAC   AALE
##          <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1        65    1.96  1.98  2.11  2.11 0.0869
##  2        65.5  1.94  1.99  2.06  2.08 0.0834
##  3        66    1.89  1.93  2.03  2.07 0.0932
##  4        66.5  1.86  1.89  1.98  2.02 0.0676
##  5        67    1.82  1.89  1.94  1.98 0.0738
##  6        67.5  1.77  1.83  1.90  1.93 0.0766
##  7        68    1.74  1.78  1.86  1.87 0.0686
##  8        68.5  1.70  1.76  1.79  1.84 0.0689
##  9        69    1.65  1.71  1.79  1.80 0.0665
## 10        69.5  1.60  1.64  1.75  1.76 0.0744
## # … with 45 more rows
head(Melting_curve2)
## # A tibble: 6 × 6
##   Temperatura   MLL   JRL  PPOF  FRAC   AALE
##         <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
## 1        65    1.96  1.98  2.11  2.11 0.0869
## 2        65.5  1.94  1.99  2.06  2.08 0.0834
## 3        66    1.89  1.93  2.03  2.07 0.0932
## 4        66.5  1.86  1.89  1.98  2.02 0.0676
## 5        67    1.82  1.89  1.94  1.98 0.0738
## 6        67.5  1.77  1.83  1.90  1.93 0.0766
Melting_curve3 <- Melting_curve2 %>% 
  #mutate(Cambiar nombres) %>% 
  pivot_longer(cols = -Temperatura,
               names_to = "Muestra",
               values_to = "FLuorescencia")
head(Melting_curve3)
## # A tibble: 6 × 3
##   Temperatura Muestra FLuorescencia
##         <dbl> <chr>           <dbl>
## 1        65   MLL            1.96  
## 2        65   JRL            1.98  
## 3        65   PPOF           2.11  
## 4        65   FRAC           2.11  
## 5        65   AALE           0.0869
## 6        65.5 MLL            1.94
Grafica_melting <- ggplot(mapping = aes(x = Melting_curve3$Temperatura,
                                        y = Melting_curve3$FLuorescencia,
                                        color = Melting_curve3$Muestra))+
  geom_line(size = 1)+
  labs(title = "Curvas de Amplificación qPCR",
       x = "Ciclos",
       y = "Fluorescencia",
       color = "Muestra") +
  theme_classic(base_size = 14) + 
  scale_x_continuous(breaks = seq(min(Melting_curve3$Temperatura), max(Melting_curve3$Temperatura), by = 1.5)) +  # Eje X cada 1°C
  scale_y_continuous(labels = scales::number_format(accuracy = 0.01),) +  # Redondeo de 3 dígitos en Y
  theme_classic(base_size = 14) + 
  theme(
    axis.line = element_line(color = "black", size = 1.5),  # Líneas de los ejes en negrita
    axis.text = element_text(size = 12),  # Tamaño de texto para los ejes
    axis.title = element_text(size = 14),  # Tamaño de los títulos de los ejes
    axis.ticks = element_line(color = "black", size = 1.5),  # Ticks de los ejes en negrita
    panel.border = element_blank(),  # Eliminar la caja de la gráfica
    axis.text.x = element_text(angle = 45, hjust = 1) ) # Rotar los valores del eje X si es necesario
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Grafica_melting 

Derivación

Melting_curve
## # A tibble: 55 × 6
##    Temperature    A1    B1    C1    D1     E1
##          <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>
##  1        65    1.96  1.98  2.11  2.11 0.0869
##  2        65.5  1.94  1.99  2.06  2.08 0.0834
##  3        66    1.89  1.93  2.03  2.07 0.0932
##  4        66.5  1.86  1.89  1.98  2.02 0.0676
##  5        67    1.82  1.89  1.94  1.98 0.0738
##  6        67.5  1.77  1.83  1.90  1.93 0.0766
##  7        68    1.74  1.78  1.86  1.87 0.0686
##  8        68.5  1.70  1.76  1.79  1.84 0.0689
##  9        69    1.65  1.71  1.79  1.80 0.0665
## 10        69.5  1.60  1.64  1.75  1.76 0.0744
## # … with 45 more rows
Derivadas <- Melting_curve %>%
  mutate(across(A1:E1, ~ -c(NA, diff(.x) / diff(Melting_curve$Temperature)), .names = "d_{.col}")) %>% 
  select(-A1:-E1)%>%
  slice(-1)  # Elimina la primera fila

# Mostrar resultados
print(Derivadas)
## # A tibble: 54 × 6
##    Temperature   d_A1     d_B1     d_C1   d_D1      d_E1
##          <dbl>  <dbl>    <dbl>    <dbl>  <dbl>     <dbl>
##  1        65.5 0.0365 -0.0147   0.0940  0.0711  0.00703 
##  2        66   0.102   0.108    0.0614  0.0146 -0.0197  
##  3        66.5 0.0695  0.0883   0.112   0.108   0.0512  
##  4        67   0.0652  0.00898  0.0646  0.0772 -0.0123  
##  5        67.5 0.109   0.114    0.0903  0.0923 -0.00567 
##  6        68   0.0666  0.0994   0.0707  0.122   0.0162  
##  7        68.5 0.0774  0.0335   0.139   0.0558 -0.000754
##  8        69   0.0860  0.0979  -0.00165 0.0850  0.00488 
##  9        69.5 0.111   0.146    0.0908  0.0844 -0.0159  
## 10        70   0.0582  0.0279   0.130   0.0864  0.00967 
## # … with 44 more rows
Derivadas2 <- Derivadas %>% 
  pivot_longer(cols = -Temperature,
               names_to = "Muestras",
               values_to = "dF/dT")
head(Derivadas2)
## # A tibble: 6 × 3
##   Temperature Muestras  `dF/dT`
##         <dbl> <chr>       <dbl>
## 1        65.5 d_A1      0.0365 
## 2        65.5 d_B1     -0.0147 
## 3        65.5 d_C1      0.0940 
## 4        65.5 d_D1      0.0711 
## 5        65.5 d_E1      0.00703
## 6        66   d_A1      0.102
Grafica_derivada<- ggplot(mapping = aes(x = Derivadas2$Temperature,
                                        y = Derivadas2$`dF/dT`,
                                        color = Derivadas2$Muestras))+
  geom_line(size = 1)+
  labs(title = "Curvas de Amplificación qPCR",
       x = "Temperatura (°C)",
       y = expression(Delta * "F" / Delta * "T"),  # Usamos expression para "Delta F / Delta T"
       color = "Muestra") +
  theme_classic(base_size = 14)+  # Estilo limpio y legible
  scale_color_viridis_d() + # Mejor paleta para varias muestras
  scale_x_continuous(breaks = seq(min(Derivadas2$Temperature), max(Derivadas2$Temperature), by = 1.5)) +  # Eje X cada 1°C
  scale_y_continuous(labels = scales::number_format(accuracy = 0.1),
                     breaks = seq(min(Derivadas2$`dF/dT`), max(Derivadas2$`dF/dT`+1), by = 0.1))+  # Redondeo de 1 dígito en Y
  theme_classic(base_size = 14) + 
  theme(
    axis.line = element_line(color = "black", size = 1.5),  # Líneas de los ejes en negrita
    axis.text = element_text(size = 12),  # Tamaño de texto para los ejes
    axis.title = element_text(size = 14),  # Tamaño de los títulos de los ejes
    axis.ticks = element_line(color = "black", size = 1.5),  # Ticks de los ejes en negrita
    panel.border = element_blank(),  # Eliminar la caja de la gráfica
    axis.text.x = element_text(angle = 45, hjust = 1) ) # Rotar los valores del eje X si es necesario
 
Grafica_derivada 

Gráfica equipo

Peak <- max(Derivadas$d_A1)
  
Peak
## [1] 0.4913234
Tm <- Derivadas %>% 
  filter(d_A1 == Peak) %>% 
  select(1, d_A1)
Tm
## # A tibble: 1 × 2
##   Temperature  d_A1
##         <dbl> <dbl>
## 1          82 0.491
Grafica_int_equipo <- ggplot(Derivadas, aes(x = Temperature, y = d_A1)) +
  geom_line(size = 1, color = "#0b2778") +  # Línea original
  #geom_smooth(method = "loess", span = 0.1, color = "red", se = FALSE) +  # Línea suavizada
  geom_vline(xintercept = Tm$Temperature, color = "#747986", linetype = "dashed", size = 1) +  # Línea punteada
  labs(title = "Curvas de Amplificación qPCR",
       x = "Temperatura (°C)",
       y = expression(-Delta * "F" / Delta * "T")) +
  scale_x_continuous(breaks = seq(min(Derivadas$Temperature), max(Derivadas$Temperature), by = 2)) +  # Eje X cada 1°C
  scale_y_continuous(labels = scales::number_format(accuracy = 0.01),) +  # Redondeo de 3 dígitos en Y
  theme_classic(base_size = 14) + 
  theme(
    axis.line = element_line(color = "black", size = 1.5),  # Líneas de los ejes en negrita
    axis.text = element_text(size = 12),  # Tamaño de texto para los ejes
    axis.title = element_text(size = 14),  # Tamaño de los títulos de los ejes
    axis.ticks = element_line(color = "black", size = 1.5),  # Ticks de los ejes en negrita
    panel.border = element_blank(),  # Eliminar la caja de la gráfica
    axis.text.x = element_text(angle = 45, hjust = 1) )+ # Rotar los valores del eje X si es necesario
  geom_label_repel(data = Tm,
                   aes(x = Temperature, y = d_A1,  label = paste("Tm = ", round(Temperature, 2), "°C")),
                   nudge_x = 3,  # Mueve el texto a la izquierda
                   max.overlaps = 100,
                   fill = "lightblue",  # Color del cuadro de texto
                   color = "black")  # Color del texto
# Imprimir la gráfica
print(Grafica_int_equipo)