Análisis de datos para extracciones de fenólicos en agraz

Andrés Felipe Beltrán Rodríguez

4/20/2022

Resumen

En este documento se presentan los resultados de la evaluación del efecto del número de extracciones consecutivas en el porcentaje relativo de compuestos fenólicos extraídos por una solución de agua:metanol:ácido acético 50:50:0.5. El seguimiento de la extracción se realiza mediante espectrofotometría a 280, 325, 355 y 515 nm.

Estructura de las tablas de datos

Para analizar los resultados, se emplean cuatro tablas. Cada tabla corresponde a las lecturas de las seis extracciones por triplicado, a cada una de las longitudes de onda. De esta manera cada tabla tendrá 18 filas, que corresponden a 18 unidades experimentales (6 extracciones consecutivas por triplicado).

Control analítico: blanco

Para esta prueba preliminar se emplea como control analítico la lectura del solvente de extracción, una solución de agua:metanol:ácido acético 50:50:0.5. Las lecturas para el blanco son:

BK280 <- 0.065
BK325 <- 0.023
BK355 <- 0.015
BK515 <- 0

Construcción de la tabla de datos

Primero creamos un vector con la identificación de cada uno de los ítems de ensayo. Ya que se realizan triplicados experimentales, cada tres elementos tendrán la misma identificación para posteriormente evaluar la distribución de los resultados, presentando de esta manera una imagen más representativa de la naturaleza de los resultados.

identidadesFruto <- c(rep('F1',3),
                      rep('F2',3),
                      rep('F3',3),
                      rep('F4',3),
                      rep('F5',3),
                      rep('F6',3)
)

Posteriormente se ingresan los resultados de absorbancia obtenidos para cada extracto, junto con los correspondientes factores de dilución.

absorbanciasFruto280 <- c(0.479,0.465,0.414,0.584,0.480,0.523,0.151,0.128,0.523,0.473,0.209,0.181,0.292,0.387,0.302,0.253,0.213,0.549)

FD<- c(100,100,100,10,10,10,10,25,10,1,10,10,1,1,1,1,1,1)

Una vez tenemos los datos experimentales podemos crear la tabla correspondiente a las lecturas a 280 nm:

df280 <- data.frame(ID = identidadesFruto,
                    AbsRaw = absorbanciasFruto280,
                    FD = FD,
                    AbsZero = absorbanciasFruto280-BK280,
                    Abs.FD = (absorbanciasFruto280-BK280)*FD,
                    PercExt = rep(1,18),
                    PercExtCum = rep(1,18))
knitr::kable(df280)
ID AbsRaw FD AbsZero Abs.FD PercExt PercExtCum
F1 0.479 100 0.414 41.400 1 1
F1 0.465 100 0.400 40.000 1 1
F1 0.414 100 0.349 34.900 1 1
F2 0.584 10 0.519 5.190 1 1
F2 0.480 10 0.415 4.150 1 1
F2 0.523 10 0.458 4.580 1 1
F3 0.151 10 0.086 0.860 1 1
F3 0.128 25 0.063 1.575 1 1
F3 0.523 10 0.458 4.580 1 1
F4 0.473 1 0.408 0.408 1 1
F4 0.209 10 0.144 1.440 1 1
F4 0.181 10 0.116 1.160 1 1
F5 0.292 1 0.227 0.227 1 1
F5 0.387 1 0.322 0.322 1 1
F5 0.302 1 0.237 0.237 1 1
F6 0.253 1 0.188 0.188 1 1
F6 0.213 1 0.148 0.148 1 1
F6 0.549 1 0.484 0.484 1 1

Ahora creamos variables para iterar a lo largo de operaciones repetitivas. Por ejemplo la primera réplica de extracción tiene seis extracciones, estas extracciones están en la primera posición de cada triada de resultados, entonces, la primera extracción de la primera réplica estará en la posición 1. La segunda extracción de la primera réplica en la posición 4. Para organizar los datos de esta manera podemos usar la serie \(3n-2\) :

e <- 1:6
a <- (3*e)-2
b <- a + 1
c <- b + 1
a
## [1]  1  4  7 10 13 16
b
## [1]  2  5  8 11 14 17
c
## [1]  3  6  9 12 15 18

En el siguiente ciclo calculamos el porcentaje de absorbancia en cada extracción respecto al total de las seis extracciones, para cada réplica:

list <- list(a,b,c)
for(j in 1:3){
  
df280$PercExt[list[[j]]] <- round((df280$Abs.FD[list[[j]]]*100)/sum(df280$Abs.FD[list[[j]]]) ,1) 
}

Tenemos entonces en las primeras tres posiciones el porcentaje de absorbancia relativa en la primera extracción para las tres réplicas:

df280$PercExt[1:3]
## [1] 85.8 84.0 76.0

En general para todos los extractos a 280nm:

df280$PercExt
##  [1] 85.8 84.0 76.0 10.8  8.7 10.0  1.8  3.3 10.0  0.8  3.0  2.5  0.5  0.7  0.5
## [16]  0.4  0.3  1.1

Una vez se calcula el porcentaje relativo de absorbancia para cada extracción, se puede calcular el acumulado en cada extracción para facilitar la interpretación de los resultados:

 for(j in 1:3){
  for(i in 1:6){
    df280$PercExtCum[list[[j]][i]] <- round(sum(df280$PercExt[list[[j]][1:i]]),1) 
  } 
}
df280$PercExtCum[a]
## [1]  85.8  96.6  98.4  99.2  99.7 100.1

Tener la información de los triplicados nos permite evaluar tanto el efecto del número de extracciones consecutivas en el porcentaje relativo de extracción, como la dispersión de los resultados de manera simultanea.

library(ggplot2)
ggplot(df280, 
       aes(x=ID, 
           y=PercExtCum, 
           fill=ID)) + 
geom_boxplot(width=0.1,
               alpha=0.5) +
geom_hline(yintercept = 95) +
labs(title=" ",
     x="# de extracciones",
     y = expression('% Abs'[280]))+
scale_fill_brewer(palette="Blues",direction=-1)+ 
theme_light()

Una vez se tiene listo el procedimiento propuesto, se puede repetir para las otras tres longitudes de onda:

  • Para 325 nm:
absorbanciasFruto325 <- c(0.442,0.210,0.380,0.440,0.397,0.415,0.066,0.051,0.185,0.217,0.089,0.087,0.118,0.160,0.128,0.092,0.090,0.169)

df325 <- data.frame(ID = identidadesFruto,
                    AbsRaw = absorbanciasFruto325,
                    FD = FD,
                    AbsZero = absorbanciasFruto325-BK325,
                    Abs.FD = (absorbanciasFruto325-BK325)*FD,
                    PercExt = rep(1,18))

list <- list(a,b,c)
for(j in 1:3){
  
  df325$PercExt[list[[j]]] <- round((df325$Abs.FD[list[[j]]]*100)/sum(df325$Abs.FD[list[[j]]]) ,1) 
}

for(j in 1:3){
  for(i in 1:6){
    df325$PercExtCum[list[[j]][i]] <- round(sum(df325$PercExt[list[[j]][1:i]]),1) 
  } 
}
  • Para 355 nm:
absorbanciasFruto355 <- c(0.210,0.209,0.178,0.440,0.201,0.415,0.030,0.025,0.098,0.132,0.060,0.062,0.082, 0.103,0.086,0.064,0.062,0.110)

df355 <- data.frame(ID = identidadesFruto,
                    AbsRaw = absorbanciasFruto355,
                    FD = FD,
                    AbsZero = absorbanciasFruto355-BK355,
                    Abs.FD = (absorbanciasFruto355-BK355)*FD,
                    PercExt = rep(1,18))

list <- list(a,b,c)
for(j in 1:3){
  
  df355$PercExt[list[[j]]] <- round((df355$Abs.FD[list[[j]]]*100)/sum(df355$Abs.FD[list[[j]]]) ,1) 
}

for(j in 1:3){
  for(i in 1:6){
    df355$PercExtCum[list[[j]][i]] <- round(sum(df355$PercExt[list[[j]][1:i]]),1) 
  } 
}
  • Para 515 nm:
absorbanciasFruto515 <- c(0.625,0.944,0.528,0.280,0.690,0.757,0.965,0.440,0.133,0.010,0.076,0.113,0,0,0,0,0,0)

FD515 <- c(10,1.725/0.254,1.124/0.090,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1)

df515 <- data.frame(ID = identidadesFruto,
                    AbsRaw = absorbanciasFruto515,
                    FD = FD,
                    AbsZero = absorbanciasFruto515-BK515,
                    Abs.FD = (absorbanciasFruto515-BK515)*FD515,
                    PercExt = rep(1,18))

list <- list(a,b,c)
for(j in 1:3){
  
  df515$PercExt[list[[j]]] <- round((df515$Abs.FD[list[[j]]]*100)/sum(df515$Abs.FD[list[[j]]]) ,1) 
}

for(j in 1:3){
  for(i in 1:6){
    df515$PercExtCum[list[[j]][i]] <- round(sum(df515$PercExt[list[[j]][1:i]]),1) 
  } 
}

Finalmente podemos reunir los resultados en un solo gráfico:

library(ggplot2)
library(gridExtra)
dp280 <- ggplot(df280, 
                aes(x=ID, 
                    y=PercExtCum, 
                    fill=ID)) + 
  geom_boxplot(width=0.1,
               alpha=0.5) +
  geom_hline(yintercept = 95) +
  labs(title=" ",
       x="# de extracciones",
       y = expression('% Abs'[280]))+
  scale_fill_brewer(palette="Blues",direction=-1)+ 
  theme_light()


dp325 <- ggplot(df325, 
                aes(x=ID, 
                    y=PercExtCum, 
                    fill=ID)) + 
  geom_boxplot(width=0.1,
               alpha=0.5) +
  geom_hline(yintercept = 95) +
  labs(title=" ",
       x="# de extracciones",
       y = expression('% Abs'[325]))+
  scale_fill_brewer(palette="Reds",direction=-1)+ 
  theme_light()



dp355 <- ggplot(df355, 
                aes(x=ID, 
                    y=PercExtCum, 
                    fill=ID)) + 
  geom_boxplot(width=0.1,
               alpha=0.5) +
  geom_hline(yintercept = 95) +
  labs(title=" ",
       x="# de extracciones",
       y = expression('% Abs'[355]))+
  scale_fill_brewer(palette="Greens",direction=-1)+ 
  theme_light()


dp515 <- ggplot(df515, 
               aes(x=ID, 
                   y=PercExtCum, 
                   fill=ID)) + 
  geom_boxplot(width=0.1,
               alpha=0.4) +
  geom_hline(yintercept = 95) +
  labs(title=" ",
       x="# de extracciones",
       y = expression('% Abs'[515]))+
  scale_fill_brewer(palette="Purples",direction=-1)+ 
  theme_light()

grid.arrange(dp280, dp325,dp355,dp515)