En el campo de la química analítica y la metrología química, la cuantificación precisa de sustancias es esencial para garantizar la calidad y la confiabilidad de los resultados de las mediciones. Además, es crucial estimar la incertidumbre asociada a estas mediciones para proporcionar información completa sobre la confiabilidad de los datos.
En este proyecto, nos proponemos cuantificar una muestra desconocida utilizando una curva de calibración y estimar su incertidumbre. Para lograr este objetivo, utilizaremos varios métodos, que incluyen:
Mínimos Cuadrados Ordinarios (MCO): Utilizaremos este método para ajustar una línea de regresión a nuestros datos de calibración y obtener una relación funcional entre la concentración y la respuesta medida.
Mínimos Cuadrados Ponderados (MCP): Aplicaremos este enfoque para considerar la ponderación adecuada de los puntos de calibración, teniendo en cuenta la incertidumbre asociada a cada medición.
Bracketing: Dividiremos nuestros datos en intervalos y ajustaremos curvas de calibración separadas para cada intervalo, considerando la variabilidad dentro de cada rango.
Calibración por un Punto: Si tenemos un punto de calibración único, aplicaremos este enfoque para estimar la concentración desconocida.
Para esto utilizaremos los paquetes Propagate y chemCal en el entorno de R para llevar a cabo análisis rigurosos y obtener resultados confiables. A través de estos métodos, buscamos proporcionar una evaluación completa de la cuantificación y la incertidumbre en nuestras mediciones químicas.
ADVERTENCIA A SUCEPTIBILIDADES: para fines prácticos de este ejercicio, las incertidumbres asociadas a la dilución de los materiales de referencia se asumirán como cero y las del MRC como el 1%
Lo primero a realizar, será instalar y cargar los paquetes:
library(readxl)
library(propagate)
library(chemCal)
library(stargazer)
library(knitr)
library(ggplot2)
Para este ejemplo, emplearemos una curva de calibración que se encuentra compuesta con 6 puntos o niveles de calibración ( Nivel), expresados en mg/kg, los cuales fueron medidos por triplicado en el intrumento de medición (Respuesta(UA). Por otro lado, se midió el canditado a MRC (cMR) mediante tres réplicas independientes.
Para la importación de los datos desde excel se debe emplear el siguiente código:
# Importar los datos
Datos <- read_excel("~/Desktop/EjemplosCaract.xlsx",na = "")
# Mostrar la tabla
kable(Datos,
caption = "Tabla 1. Datos obtenidos durante Caracterización",
format = "markdown",
align = "c",
table.attr ='style="width:auto;"',
escape = FALSE) # Para permitir HTML en los encabezados
| Nivel | Respuesta(UA) |
|---|---|
| 10 | 2286.18 |
| 10 | 2391.48 |
| 10 | 2316.60 |
| 20 | 4899.96 |
| 20 | 4572.36 |
| 20 | 4843.80 |
| 30 | 7012.98 |
| 30 | 7090.20 |
| 30 | 7090.20 |
| 40 | 8929.44 |
| 40 | 8892.00 |
| 40 | 9182.16 |
| 50 | 11430.90 |
| 50 | 11653.20 |
| 50 | 11676.60 |
| 60 | 14152.32 |
| 60 | 13590.72 |
| 60 | 14166.36 |
Por otro lado, las réplicas de las muestras presentaron los siguientes valores:
| Réplica | Respuesta (UA) |
|---|---|
| 1 | 7654.4559 |
| 2 | 7904.232882 |
| 3 | 7872.003594 |
Lo primero que realizamos es la creación del modelo de regresión lineal para Nivel vs. Respuesta (UA)
# Modelo de regresión lineal
modelo_regresion <- lm(Datos$`Respuesta(UA)`~ Datos$Nivel, data = Datos)
# Resumen del modelo
resumen_modelo <- summary(modelo_regresion)
# Resumen del modelo con stargazer
stargazer(modelo_regresion, title = "Resumen del Modelo de Regresión Lineal", type = "text")
##
## Resumen del Modelo de Regresión Lineal
## ===============================================
## Dependent variable:
## ---------------------------
## `Respuesta(UA)`
## -----------------------------------------------
## Nivel 230.209***
## (2.852)
##
## Constant 63.648
## (111.066)
##
## -----------------------------------------------
## Observations 18
## R2 0.998
## Adjusted R2 0.997
## Residual Std. Error 206.640 (df = 16)
## F Statistic 6,515.900*** (df = 1; 16)
## ===============================================
## Note: *p<0.1; **p<0.05; ***p<0.01
Podemos revisar la gráfica correspondiente, mediante el siguiente código:
# Gráfica con ggplot2
grafica <- ggplot(Datos, aes(x = Nivel, y = `Respuesta(UA)`)) +
geom_point(size=0.5) + # Para mostrar los datos como puntos
geom_smooth(method = "lm", se = TRUE, col = "blue", size=0.5) + # Para agregar la línea de regresión y los intervalos de confianza
labs(title = "Curva de calibración mediante modelo MCO",
x = "Concentracion ( mg/kg)",
y = "Respuesta (UA)")
print(grafica)
Posteriormente, vamos a estimar el promedio de las respuestas obtenidas en la caracterización del Material de Referencia. Una vez obtenidas este promedio, vamos a estimar la concentración y su respectiva incertidumbre, empleando el modelo de regresión lineal (MCO).
# Estimación del promedio de las muestras ( en respuesta)
RespuestascMR <- c(7654.4559, 7904.232882, 7872.003594)
promedio_respuestas <- mean(RespuestascMR)
# Crear un objeto con el modelo de regresión lineal
ResultadosMCO <- inverse.predict(modelo_regresion, newdata = promedio_respuestas)
# Estimación del valor de concentración utilizando Mínimos Cuadrados Ordinarios (MCO)
ConceMCO <- ResultadosMCO$Prediction
uConcMCO <- ResultadosMCO$`Standard Error`
urelMCO <- uConcMCO/ConceMCO*100
# Imprimir el valor de concentración estimada y su incertidumbre
cat("Valor de Concentración Estimada:", sprintf("%.4f", ConceMCO), "\n","Incertidumbre de Concentración:", sprintf("%.4f", uConcMCO), "\n","Incertidumbre relativa % (MCO):", sprintf("%.2f", urelMCO), "\n")
## Valor de Concentración Estimada: 33.6502
## Incertidumbre de Concentración: 0.9224
## Incertidumbre relativa % (MCO): 2.74
Ahora, podemos observar la gráfica en la cual se muestra la interpolación respectiva:
En esta sección, utilizaremos el método de Mínimos Cuadrados Ponderados (MCP) para ajustar un modelo de regresión lineal teniendo en cuenta la desviación estándar de la respuesta en cada nivel de concentración como pesos.
# Crear un vector de pesos basado en la desviación estándar de la respuesta
pesos <- 1 / (Datos$`Respuesta(UA)` / sd(Datos$`Respuesta(UA)`))
# Modelo de regresión lineal ponderado (MCP)
modelo_regresion_ponderado <- lm(Datos$`Respuesta(UA)` ~ Datos$Nivel, data = Datos, weights = pesos)
# Resumen del modelo ponderado
resumen_modelo_ponderado <- summary(modelo_regresion_ponderado)
# Resumen del modelo ponderado con stargazer
stargazer(modelo_regresion_ponderado, title = "Resumen del Modelo de Regresión Lineal Ponderado (MCP)", type = "text")
##
## Resumen del Modelo de Regresión Lineal Ponderado (MCP)
## ===============================================
## Dependent variable:
## ---------------------------
## `Respuesta(UA)`
## -----------------------------------------------
## Nivel 230.132***
## (2.454)
##
## Constant 61.971
## (72.099)
##
## -----------------------------------------------
## Observations 18
## R2 0.998
## Adjusted R2 0.998
## Residual Std. Error 141.053 (df = 16)
## F Statistic 8,791.766*** (df = 1; 16)
## ===============================================
## Note: *p<0.1; **p<0.05; ***p<0.01
A continuación, podemos visualizar la curva de calibración ponderada:
Continuando con la estimación de la concentración y su incertidumbre utilizando MCP:
## Valor de Concentración Estimada (MCP): 33.6687 mg/kg
## Incertidumbre de Concentración (MCP): 0.7544 mg/kg
## Incertidumbre relativa (MCP): 2.24
Grafica de la curva de calibración con regresión ponderada:
Finalmente comparemos los valores obtenidos por cada una de las regresiones:
Minímos cuadrados ordinarios:
## Valor de Concentración Estimada (MCO): 33.6502 mg/kg
## Incertidumbre de Concentración (MCO): 0.9224 mg/kg
## Incertidumbre relativa (MCO): 2.74
Minímos cuadrados ponderados:
## Valor de Concentración Estimada (MCP): 33.6687 mg/kg
## Incertidumbre de Concentración (MCP): 0.7544 mg/kg
## Incertidumbre relativa (MCP): 2.24 %
Para realizar la estimación incertidumbre por caracterización, debemos considerar la incertidumbre asociada al MRC, con el cual se realiza la caracterización. Esta incertidumbre corresponde a 0.0337 mg/kg ( Incertidumbre estándar, aproximadamente el 1%).
Estas incertidumbres consideran el valor interpolado ( el cual cambia dependiendo del tipo de regresión empleada).
Por su parte, la incertidumbre de caracterización, denotada como \(u_{\text{caracterización}_n}\), se calcula utilizando la siguiente fórmula:
\[ u_{\text{caracterización}_n} = \sqrt{u_n^2 + u_{\text{MRC}}^2} \]
Donde: - \(n\) corresponde al tipo de regresión, ya sea MCO o MCP. - \(u_n\) es la incertidumbre asociada a \(n\). - \(u_{\text{MRC}}\) es la incertidumbre asociada al MRC.
Esta fórmula nos permite cuantificar la incertidumbre de caracterización para cada tipo de regresión, teniendo en cuenta las incertidumbres respectivas.
A continuación, se presentan los resultados encontrados:
uMRC<-0.0337
ucarMCO=sqrt(uConcMCO^2+uMRC^2)
ucarMCP=sqrt(uConcMCP^2+uMRC^2)
# Imprimir los resultados con etiquetas y unidades en mg/kg
cat(" Valor de u de caracterización MCO:", round(ucarMCO, 4), "mg/kg\n",
"Valor de u de caracterización MCP:", round(ucarMCP, 4), "mg/kg\n")
## Valor de u de caracterización MCO: 0.923 mg/kg
## Valor de u de caracterización MCP: 0.7552 mg/kg
En esta sección, utilizaremos el método de Bracketing para estimar la concentración y su incertidumbre. Para esto, consideraremos las concentraciones conocidas de nivel 1 (30 mg/kg) y nivel 2 (40 mg/kg).
Para calcular la concentración del candidato (\(c_{cMR}\)) utilizando el enfoque de calibración por bracketing, podemos utilizar la siguiente fórmula:
\[ C_{cMR} = \frac{{(C_2 \cdot (R_{c_{MR}} - R_{C1}) + C_1 \cdot (R_{C2} - R_{c_{MR}}))}}{{(R_{C2} - R_{C1})}} \]
Donde: - \(C_1\) y \(C_2\) son las concentraciones conocidas correspondientes a los puntos de calibración. - \(R_{C1}\) y \(R_{C2}\) son las respuestas obtenidas del instrumento para los puntos de calibración. - \(R_{c_{MR}}\) es la respuesta del instrumento para la muestra cuya concentración deseamos calcular.
Esta fórmula nos permite estimar la concentración desconocida \(c_{c_{MR}}\) a partir de las mediciones realizadas y las concentraciones conocidas en los puntos de calibración.
Mediante el paquete propagate podemos estimar la concentración y la incertidumbre:
# Cargar el paquete propagate si no está cargado
library(propagate)
# Definir las variables y sus incertidumbres
C1 <- c(30, 0.31) # Concentración y su incertidumbre
C2 <- c(40, 0.40) # Concentración y su incertidumbre
RC1 <- c(7064.46,44.58) # Respuesta y su incertidumbre
RC2 <- c(9001.2, 157.83) # Respuesta y su incertidumbre
RcMR <- c(7811.23, 78.44) # Respuesta y su incertidumbre
# Crear objetos de incertidumbre y el dataframe
DF <- cbind(C1, C2, RC1, RC2, RcMR)
# Definir la expresión del modelo
modelo <- expression((C2*(RcMR - RC1)+C1*(RC2 - RcMR))/ (RC2 - RC1))
# Realizar la propagación de incertidumbre
incertidumbre_CcMR <- propagate(expr = modelo, data = DF, type = "stat", do.sim = FALSE, verbose = TRUE, nsim = 1000000)
# Extraer e imprimir los resultados
ConceBrac<-incertidumbre_CcMR$prop["Mean.1"]
ucarBrac<-incertidumbre_CcMR$prop["sd.1"]
cat(" Concentración mediante bracketing:",incertidumbre_CcMR$prop["Mean.1"], "mg/kg\n", "Desviación Estándar:", incertidumbre_CcMR$prop["sd.1"], "mg/kg\n")
## Concentración mediante bracketing: 33.85581 mg/kg
## Desviación Estándar: 0.5855218 mg/kg
Para la calibración por un punto, se selecciona el nivel de calibración de 30 mg/kg, el cual presenta una incertidumbre de aproximadamente 0.0337 mg/kg. Por lo tanto, la concentración del Candidato a Material de Referencia (cMR) viene dada por:
\[C_{cMR} = R_{cMR} \cdot \frac{C_{MRC}}{R_{N3}}\]
Donde: - \(R_{cMR}\) corresponde a la respuesta instrumental del candidato. - \(C_{MRC}\) a la concentración del Material de Referencia Certificado (MRC). - \(R_{N3}\) a la respuesta instrumental del nivel correspondiente a 30 mg/kg.
La incertidumbre de caracterización mediante un nivel de calibración viene dada por:
\[u_{carN3} = C_{cMR} \cdot \sqrt{\left(\frac{u_{MRC}}{C_{MRC}}\right)^2 + \left(\frac{u_{RC1}}{R_{C1}}\right)^2 + \left(\frac{u_{RcMR}}{R_{cMR}}\right)^2}\]
A continuación, se presentan los valores obtenidos.
# Concentraciones conocidas y sus respectivas incertidumbres
CMRC <- 30
RN3 <- 7064.46
uRC1 <- 44.582987786823
RcMR<- promedio_respuestas # Corresponden al promerio de las respuestas
uRcMR <- 78.44115519 #. Acá se asumieron 3 mediciones independientes
# Cálculo de la concentración del cMR
CcMR <- RcMR * (CMRC / RN3)
# Cálculo de la incertidumbre de caracterización mediante un nivel de calibración
ucarN3 <- CcMR * sqrt((uMRC / CMRC)^2 + (uRC1 / RN3)^2 + (uRcMR / RcMR)^2)
# Imprimir los resultados
cat(" Concentración del cMR:", CcMR, "mg/kg\n","Incertidumbre de caracterización mediante un nivel de calibración:", ucarN3, "mg/kg\n")
## Concentración del cMR: 33.167 mg/kg
## Incertidumbre de caracterización mediante un nivel de calibración: 0.3951729 mg/kg
En la Siguiente Tabla se presentan los resultados finales para los tres métodos:
| Método | Concentración (mg/kg) | Incertidumbre (mg/kg) |
|---|---|---|
| Unidades | mg/kg | mg/kg |
| MCO | 33.650 | 0.923 |
| MCP | 33.669 | 0.755 |
| Bracketing | 33.856 | 0.586 |
| Un nivel | 33.167 | 0.395 |