library(readxl)
library(PerformanceAnalytics)
library(ggplot2)
library(grid)
library(dplyr)
library(RColorBrewer)
library(scales)
library(gridExtra) 
library(ggthemes)
library(ggpubr)
library(NADA)
library(factoextra)
library(scales)
library(ggpubr)
library(tidyr)
library(cluster)
library(chemCal)
library(asbio)
library(ggridges)
library(tinytex)
library(knitr)
library(performance)

Determinación de parámetros de desempeño relacionados con el modelo de regresión: linealidad,cedasticidad, Ld, Lc e incertidumbre

INTRODUCCIÓN SOBRE CÓMO SE GENERÓ LA REGRESIÓN

Para la validación de la linealidad se generan curvas de calibración con patrones de 0,1 a 0,5 mg/L, con las absorbancias obtenidas se realiza la gáfica permitiendo realizar las evluaciones de los datos correspondientes.

Por otro lado, la cedasticidad se determina con la prueba de igualdad de varianzas tomando los valores de la absorbancia para cada patrón generado.

La incertidumbre se calcula con el intervalo de confianza determina a partir de la regresión lineal calculada.

Determinación de linealidad

getwd()
## [1] "C:/Users/arcej/OneDrive/Documentos/Metdos 2024/Reporte validación"
nitlinealidad<- read_excel("datavalidacion.xlsx",sheet = "linealidad")
View(nitlinealidad)
str(nitlinealidad)
## tibble [24 × 3] (S3: tbl_df/tbl/data.frame)
##  $ Patron       : chr [1:24] "Blanco" "1" "2" "3" ...
##  $ Concentracion: num [1:24] 0 0.101 0.202 0.303 0.404 ...
##  $ Absorbancia  : num [1:24] 0 0.088 0.188 0.279 0.368 0.457 0 0.095 0.188 0.282 ...
nitlinealidad$Concentracion<-as.numeric(nitlinealidad$Concentracion)
nitlinealidad$Absorbancia<-as.numeric(nitlinealidad$Absorbancia)
nitlinealidad$Patron<-as.factor(nitlinealidad$Patron)
regresion<-lm(Absorbancia~Concentracion,nitlinealidad) ### generar el modelo de regresión

summary(regresion) #ver resultados del modelo de regresión
## 
## Call:
## lm(formula = Absorbancia ~ Concentracion, data = nitlinealidad)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -0.0096548 -0.0018887 -0.0001798  0.0015702  0.0091810 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   0.0002619  0.0015030   0.174    0.863    
## Concentracion 0.9228923  0.0049117 187.898   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.004153 on 22 degrees of freedom
## Multiple R-squared:  0.9994, Adjusted R-squared:  0.9993 
## F-statistic: 3.531e+04 on 1 and 22 DF,  p-value: < 2.2e-16
ggplotRegression <- function (regresion) { ### función para plotear la regresi?n con los valores estad?siticos
  
  require(ggplot2)
  
  ggplot(regresion$model, aes_string(x = names(regresion$model)[2], y = names(regresion$model)[1])) + 
    geom_point() +
    stat_smooth(method = "lm", col = "blue") +
    scale_y_continuous(labels = scales::number_format(accuracy = 0.001,decimal.mark = '.'))+
    scale_x_continuous(labels = scales::number_format(accuracy = 0.0001,decimal.mark = '.'))+
    labs(title = "Regresión lineal: validación del método espectrofotométrico",
         x= "Concentración (mg/L)", y="Absorbancia (UA)",
         subtitle = paste(" Pendiente =",signif(regresion$coef[[2]], 4),
                       "Intercepto =",signif(regresion$coef[[1]],4 ),
                       "r2=",signif(summary(regresion)$adj.r.squared, 4),
                         " p valor =",signif(summary(regresion)$coef[2,4], 3)))
}

plotlinealidad<-ggplotRegression(lm(Absorbancia~Concentracion, data = nitlinealidad)) ### ploteo con la funciÓn
plotlinealidad

Análisis de residuales para comprobación de supuestos estadísticos

Aleatoriedad de residuales

plot(regresion$residuals) 

#gráfico de los residuales

Sumatoria cercana a cero

sum(regresion$residuals)# valor de la sumatoria de residuales
## [1] -1.192622e-18

Comprobación de la normalidad de los residuales mediante mediante prueba Shapiro-Wilk

shapiro.test(regresion$residuals) ### comprobacion de la normalidad de residuales
## 
##  Shapiro-Wilk normality test
## 
## data:  regresion$residuals
## W = 0.9732, p-value = 0.7459

Determinación de la cedasticidad

BREVE INTRODUCCIÓN SOBRE CÓMO SE GENERÓ LA PRUEBA PARA LA DETERMINACIÓN DE LA CEDASTICIDAD

La cedasticidad se determina con la prueba de igualdad de varianzas tomando los diferentes valores de la absorbancia de cada patrón generado.Se utiliza la variable patrón y se filtra aquellas que sean mayores a 0.01.

Al igual, se usa la pruebro Barlett paa analizar la homocedasiticidad de las varianzas.Al tener el p-value se observa que este no es mayor a 0.5 entonces no se acepta la hipótesis nula, por lo tanto si existe diferencia en las varianzas de los grupos.

  ### convierte al patrón como un factor
nitlinealidad$Patron<-as.factor(nitlinealidad$Patron) 
### elimina los blancos para el análisis de cedasticidad
cedasticidad<-nitlinealidad %>% filter(Absorbancia > 0.01) 
View(cedasticidad)


bartlett.test(Absorbancia~Patron,cedasticidad) ### prueba Bartlett, 
## 
##  Bartlett test of homogeneity of variances
## 
## data:  Absorbancia by Patron
## Bartlett's K-squared = 3.9633, df = 4, p-value = 0.411
plotcedasticidad<- ggplot(data = cedasticidad, aes(x = Patron, y = Absorbancia, colour = Patron)) +  ### gr?fico de cajas para observar la distribuci?n de los valores de absorbancia
  geom_jitter(width=0.20, size=3)+theme(legend.position = "none")+
  stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), 
                 geom="errorbar", width = 0.2,color="black", 
                 position = position_dodge(0.8))+
  stat_summary(fun.data="mean_sdl", fun.args = list(mult=1), 
                 geom="pointrange", width = 0.6,color="black", 
                 position = position_dodge(0.8))+
  scale_y_continuous(labels = scales::number_format(accuracy = 0.001,decimal.mark = '.'))+
  labs(title = "Dispersión de los datos de absorbancia en los niveles calibración",
        x= "Nivel de concentración para la calibración", y="Absorbancia (UA)")
## Warning in stat_summary(fun.data = "mean_sdl", fun.args = list(mult = 1), :
## Ignoring unknown parameters: `width`
plotcedasticidad

Determinación de la incertidumbre por regresión lineal

BREVE INTRODUCCIÓN DE CÓMO SE GENERÓ LA DETERMINACIÓN DE LA INCERTIDUMBRE

La incertidumbre se calcula con el intervalo de confianza determinada a partir de la regresión lineal calculada.

muestra<-c(0.345,0.348,0.351, 0.356, 0.349, 0.342, 0.342) ##asigna las absorbancias de una muestra
U<-inverse.predict(regresion,muestra,alpha = 0.05) ### determina la concentración, error
#estándar, IC y los límites de la predicción
U
## $Prediction
## [1] 0.3763272
## 
## $`Standard Error`
## [1] 0.002042165
## 
## $Confidence
## [1] 0.00423519
## 
## $`Confidence Limits`
## [1] 0.3720921 0.3805624
Ucal<-round(U$`Confidence`,digits=3)
Ucal #incertidumbre al 95% de confianza
## [1] 0.004

Determinación de los límites de detección y cuantificación

ESCRIBA AQUÍ UNA BREVE INTRODUCCIÓN SOBRE CÓMO SE DETERMINARON LOS LÍMITES

Se utiliza el método miller-miller el cual utiliza la desviación estándar del intercepto entre la pendiente

LoD<- round(((summary(regresion)$coef[[3]])*3.3)/(signif(regresion$coef[[2]], 4)), digits=3)
LoQ <- round(((summary(regresion)$coef[[3]])*10)/(signif(regresion$coef[[2]], 4)), digits=3)

LoD
## [1] 0.005
LoQ
## [1] 0.016

Determinación de repetibilidad y presición intermedia

ESCRIBA AQUÍ UNA BREVE INTRODUCCIÓN SOBRE CÓMO SE GENERÓ LA DETERMINACIÓN DE LA REPETIBILIDAD

Para evaluar la repetibilidad de los resultados entre las dos estudiantes se realizó una comparación entre el promedio, la desviación estándar, los cuartiles, y los mínimos y máximos.

Después, para evaluar la repetibilidad individualmente de las estudiante se realizó una división

Estadísitica descriptiva de los resultados

#Preparación de los datos
nitpres<- read_excel("datavalidacion.xlsx",sheet = "presicion")
View(nitpres)
  #Convirtiendo las variables en factores
nitpres$Estudiante<-as.factor(nitpres$Estudiante)
library(RcmdrMisc)
## Warning: package 'RcmdrMisc' was built under R version 4.3.3
## Loading required package: car
## Warning: package 'car' was built under R version 4.3.3
## Loading required package: carData
## Warning: package 'carData' was built under R version 4.3.3
## 
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
## 
##     recode
## Loading required package: sandwich
## Warning: package 'sandwich' was built under R version 4.3.3
descriptiva<-numSummary(nitpres[, c("Concentracion"), drop = FALSE], 
           groups = nitpres$Estudiante, statistics = c("mean", "sd", "IQR", "quantiles"),
           quantiles = c(0, 0.25, 0.5, 0.75, 1)) ### la funci?n numSummary corresponde al paquete RcmdrMisc

descriptiva
##        mean          sd         IQR        0%       25%       50%       75%
## T 0.3474813 0.005191098 0.007043017 0.3415992 0.3432245 0.3481004 0.3502675
## V 0.3318473 0.004723046 0.003250623 0.3253461 0.3296802 0.3318473 0.3329309
##        100% Concentracion:n
## T 0.3556852               7
## V 0.3405157               7

Repetibilidad para cada estudiante

Determinación del coeficiente de variación

CV_E1<-(descriptiva$table[1,2]/descriptiva$table[1,1])*100
CV_E1
## [1] 1.493922
CV_E2<-(descriptiva$table[2,2]/descriptiva$table[2,1])*100
CV_E2
## [1] 1.423259

Presición intermedia

Determinación de igualdad de varianzas por parte de ambos estudiantes

1.Análisis visual

plotpresi<-ggplot(data = nitpres, aes(x = Estudiante, y = Concentracion, colour = Estudiante)) +
  geom_boxplot(aes(),width=0.3) +geom_jitter(aes(shape=Estudiante),width=0.1,size=2) +
  scale_y_continuous(labels = scales::number_format(accuracy = 0.001,decimal.mark = '.'))+
  labs(title = "Dispersión de los datos de concentración",
       subtitle= "Factor de evaluación de la presición intermedia: Estudiante", y="Concentración (mg/L)")+
  theme(legend.position = "none") 
plotpresi ## grÁfico de cajas para visulaizar la dispersiÓn de los datos de cada estudiante

2.Prueba de Homogeneidad de varianzas

La prueba F es muy potente para discriminar varianzas significativamente distintas, sin embargo posee la limitante que se supone que los datos deben de proveenir de una población normal.

Alternativamente, puede utilizarse la prueba de Levene la cuál presenta varias ventajas permite comparar 2 o más poblaciones,permite eligir entre diversos estadísticos (mediana, media o media truncada) y además no requiere que los datos sean normales como si lo es para el caso de la prueba F de Fisher.

est1<-nitpres %>% filter(Estudiante == "T")#filtrado de los datos por estudiante
est2<-nitpres %>% filter(Estudiante == "V")

shapiro.test(est1$Concentracion)### prueba de normalidad para los valores de concnetraci?n
## 
##  Shapiro-Wilk normality test
## 
## data:  est1$Concentracion
## W = 0.94238, p-value = 0.6603
shapiro.test(est2$Concentracion)
## 
##  Shapiro-Wilk normality test
## 
## data:  est2$Concentracion
## W = 0.94508, p-value = 0.6848
var.test(x = est1$Concentracion,y = est2$Concentracion)## prueba F para probar varianzas
## 
##  F test to compare two variances
## 
## data:  est1$Concentracion and est2$Concentracion
## F = 1.208, num df = 6, denom df = 6, p-value = 0.8244
## alternative hypothesis: true ratio of variances is not equal to 1
## 95 percent confidence interval:
##  0.2075723 7.0303826
## sample estimates:
## ratio of variances 
##            1.20802
### 
leveneTest(y = nitpres$Concentracion, group = nitpres$Estudiante, center = "mean") 
## Levene's Test for Homogeneity of Variance (center = "mean")
##       Df F value Pr(>F)
## group  1   0.395 0.5415
##       12
### esta función corresponde al paquete car

Según los resultados de cualesquiera de las dos pruebas, se observa que no existe diferencia estadísticamente significativa en las varianzas de ambos estudiantes, con esto sevalida la presición intermedia.

  1. Comprobación de igualdad de medias

El análisis puede complementarse con una prueba t student para analizar si hay diferencia significativa en el valor medio obtenido por ambos estudiantes

### Diferencia de medias
t.test(est1$Concentracion,est2$Concentracion,mu=0,paired=TRUE,var.equal=TRUE)
## 
##  Paired t-test
## 
## data:  est1$Concentracion and est2$Concentracion
## t = 5.6111, df = 6, p-value = 0.001367
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
##  0.008816245 0.022451653
## sample estimates:
## mean difference 
##      0.01563395

Determinación de la Veracidad

ESCRIBA AQUÍ UNA BREVE INTRODUCCIÓN SOBRE CÓMO SE GENERÓ LA DETERMINACIÓN

Contraste del valor medio obtenido contra el valor de referencia aportado por el MRC

t.test(est1$Concentracion,mu=0.3505,alternative = "less") 
## 
##  One Sample t-test
## 
## data:  est1$Concentracion
## t = -1.5386, df = 6, p-value = 0.08742
## alternative hypothesis: true mean is less than 0.3505
## 95 percent confidence interval:
##       -Inf 0.3512939
## sample estimates:
## mean of x 
## 0.3474813
#Se realiza una prueba de una cola, el estudiante 1 obtuvo una media de 0.369. 
#Hipótesis nula: la media del estudiantes 1 es igual a 0.3505(valor del MRC) 
#hipótesis alterna: La media del estudiante 1 es menor a 0.370

t.test(est2$Concentracion,mu=0.3505,alternative = "less") 
## 
##  One Sample t-test
## 
## data:  est2$Concentracion
## t = -10.449, df = 6, p-value = 2.253e-05
## alternative hypothesis: true mean is less than 0.3505
## 95 percent confidence interval:
##       -Inf 0.3353162
## sample estimates:
## mean of x 
## 0.3318473
#Se realiza una prueba de una cola, el estudiante 2 tuvo una media igual a 0.378
#Hipótesis nula: la media del estudiantes 1 es igual a 0.370 (valor del MRC)
#Hipótesis alterna: La media del estudiante 1 es MAYOR a 0.370.

## NOTA: probar que la media no difiere del MRC es solo una parte de la prueba de veracidad