As micro pipetas monocanal são instrumentos de laboratório que utilizam o principio do deslocamento de ar para criar um vácuo e aspirar um volume de liquido igual ao que foi deslocado pelo pistão (muito parecido com o funcionamento de uma seringa).
Nos modelos de volume variável, é possível regular o tamanho do embolo que desloca o ar e dessa forma pipetar volumes diferentes.
Essas pipetas são rotineiramente utilizadas em laboratórios para dispensação de amostras e soluções além do preparo de diluições. Elas apresentam mais praticidade e facilidade para atividades de rotina.
Em ambientes sob normas de qualidade como a ISO 17025 é necessário que esse instrumento seja calibrado e passe por checagens de sua performance durante períodos pré definidos. Em geral, elas são calibradas anualmente e checadas entre calibrações. São escolhidos 3 volumes, o máximo, um intermediário e o volume mínimo que a pipeta alcança. Por exemplo, uma pipeta de volume máximo de 1000ul seria calibrada em 500ul e 100ul (o volume mínimo normalmente representa 10% do volume máximo, porém pode variar conforme o fabricante).
Figura 1: Pipeta monocanal de volume variável
O interesse desse trabalho é analisar a prática anual de calibração de micro pipetadores e se ela fornece dados para prever a distribuição da ocorrência de falhas e o alargamento das frequência atualmente empregadas (anual para bienal).
Os dados foram retirados dos certificados de calibração. Todos os cálculos e gráficos foram feitos em Rstudio versão 1.3.959 e R base 3.6.3.
Os dados dos certificados de calibração de 20 pipetas monocanais de volume variável foram manualmente coletadas e digitadas em planilhas Excel e em seguidas exportadas para o arquivo calib.csv.
Tabela 1: Cabeçalho dos dados referentes a 20 pipetadores, três pontos (volumes) por ano e 10 anos de dados:
library(knitr)
calib <- read.csv("/mnt/DADOS/Data Science/Calib/calib.csv", dec=",")
kable(head(calib))
| TAG | PONTO | Data | volume_ul | Erro_ul | Erro |
|---|---|---|---|---|---|
| PIPETA-05B | Baixo | 2020 | 100 | 3.59 | 3.590 |
| PIPETA-05B | Médio | 2020 | 500 | 2.32 | 0.464 |
| PIPETA-05B | Alto | 2020 | 1000 | 3.16 | 0.316 |
| PIPETA-05B | Baixo | 2019 | 100 | 1.81 | 1.810 |
| PIPETA-05B | Médio | 2019 | 500 | 1.18 | 0.236 |
| PIPETA-05B | Alto | 2019 | 1000 | 5.34 | 0.534 |
O valor do campo “Erro” se refere ao percentual de erro em relação ao ponto calibrado. Por exemplo: Uma pipeta de 1000uL e erro de 10uL terá um erro de 1%, e o valor no campo “Erro” será 1,0.
Extraímos então um resumo dos dados:
Tabela 2: Resumo dos dados presentes no estudo como quantidade de pontos para cada calibração e erros médios obtidos
library(knitr)
kable(summary(calib))
| TAG | PONTO | Data | volume_ul | Erro_ul | Erro | |
|---|---|---|---|---|---|---|
| PIPETA-05B: 30 | Alto :150 | Min. :2011 | Min. : 2 | Min. :-110.000 | Min. :-10.0000 | |
| PIPETA-09B: 29 | Baixo :150 | 1st Qu.:2013 | 1st Qu.: 100 | 1st Qu.: -1.000 | 1st Qu.: -0.4125 | |
| PIPETA-16B: 27 | Médio :148 | Median :2016 | Median : 1000 | Median : 0.640 | Median : 0.1400 | |
| PIPETA-03B: 24 | NA | Mean :2016 | Mean : 2062 | Mean : 2.093 | Mean : 0.1858 | |
| PIPETA-04B: 24 | NA | 3rd Qu.:2018 | 3rd Qu.: 2000 | 3rd Qu.: 5.310 | 3rd Qu.: 0.6763 | |
| PIPETA-07B: 24 | NA | Max. :2020 | Max. :10000 | Max. : 216.000 | Max. : 21.6000 | |
| (Other) :290 | NA | NA | NA | NA | NA |
Teremos 448 pontos de calibração para análise.
Primeiramente vamos buscar as primeiras relações entre as variaveis, neste caso, como os erros (campo Erro) estão distribuídos. Será realizada uma plotagem (um histograma de frequência) com os dados separados conforme a faixa de calibração (Alta, Média e Baixa).
library(ggplot2)
library(ggthemes)
qplot(Erro, data=calib , geom ="histogram" , fill = PONTO, binwidth=0.4)
Figura 1: Observando o histograma exploratório dos Erros, a maior parte do espalhamento se concentra nos pontos mais baixos (em verde).
Separando os histogramas conforme o ponto (faixa) de calibração:
library(ggplot2)
g= qplot(Erro, data=calib , geom ="histogram", fill = PONTO, binwidth=0.5 )
g + facet_wrap(~ PONTO, levels(c("Alto", "Médio", "Baixo" )))
Figura 2: Nitidamente se observa que os pontos mais baixos (em verde) apresentam maior achatamento e a maior dispersão dos dados.
Os mesmos dados podem ser plotados agora como Boxplot:
library(ggplot2)
library(ggthemes)
g = ggplot(calib, aes(x=PONTO, y= Erro)) + scale_x_discrete(name ="Pontos de calibração", limits=c("Alto","Médio ","Baixo"))
g + geom_boxplot() + theme_economist()
Figura 3: Boxplot dos erros conforme a faixa de medição. As caixas representam 50% dos dados e as linhas verticais os outros 50%. Os dados acima destas representam outliers. A linha central horizontal em cada caixa é a mediana.
Um resumo mais robusto dos resultados pode ser obtido plotando os erros relativos no formato absoluto(módulo)no eixo Y ao volume calibrado (como log, para facilitar a visualização) no eixo X.
library(ggplot2)
g = invisible(ggplot(calib, aes(x=volume_ul, y=abs(Erro)))+ stat_summary())
g + xlab("Volume ul em log10") + scale_x_continuous(trans="log10")
Figura 4: Gráfico de dispersão com barras de erros mostrando a relação decrescente entre erros e faixa de medição.
Não há dúvida que a partir de 100uL os erros de calibração aumentam muito, resta saber o quanto.
Considerando apenas os erros dos pontos de calibração mais baixos, vamos obter a média e desvio padrão para os pontos inferiores:
baixo <- subset(calib$Erro, calib$PONTO == "Baixo")
mean(baixo)
## [1] 0.3759667
sd(baixo)
## [1] 3.17464
Para comparação, o mesmo para os valores superiores:
alto <- subset(calib, PONTO == "Alto")
alto <- alto$Erro
mean(alto)
## [1] 0.2059
sd(alto)
## [1] 0.7100553
Se pode notar que o erro médio nas faixas inferiores é 2x maior do que na alta e a dispersão dos dados 4x maior. Esse dado é esperado já que a maioria dos ensaios analíticos sofrem considerável diminuição da precisão conforme a faixa analítica diminui.
Vamos analisar se os erros obedecem uma distribuição normal. Usaremos uma plotagem QQ dos pontos de calibração (baixo e alto) contra valores normalmente distribuidos teóricos. Ou seja, nesse grafico é visualizada a correlação entre os valores dos quantis experimentais e de uma distribuição normal com mesma média e desvio padrão.
par(mfrow = c(1,2))
qqnorm(baixo, pch = 1, frame = FALSE, main = "Normal QQ Plot (Baixos)")
qqline(baixo, col = "steelblue", lwd = 2)
qqnorm(alto, pch = 1, frame = FALSE, main= "Normal QQ Plot (Altos)")
qqline(alto, col = "steelblue", lwd = 2)
Figura 5: Apesar de boa correlação visual com os teóricos não é possível considerar as distribuições como normais. A confirmação será feita atravéz do teste Shapiro-Wilk:
shapiro.test(baixo)
##
## Shapiro-Wilk normality test
##
## data: baixo
## W = 0.82644, p-value = 4.765e-12
shapiro.test(alto)
##
## Shapiro-Wilk normality test
##
## data: alto
## W = 0.93292, p-value = 1.594e-06
Como os valores de P de significancia foram muito baixos, não há normalidade nos dados.
Vamos agora pesquisar por tendências no comportamento dos erros ao longo do tempo, essa sera a informação mais importante deste estudo pois indicará se há estabilidade no processo metrologico, exceto claro, no evento de falhas fisicas nos instrumentos.
A plotagem abaixo descreve os erros relativos conforme a data (Ano) durante um período de 10 anos. A linha Azul e a regressão linear dos valores e as linha vermelhas são as faixas aceitas pelo laboratorio (erros entre 4% e -4%).
ggplot(calib, aes(Data, Erro))+geom_point(show.legend = FALSE,alpha =1/4)+geom_smooth(method=lm, color = 'blue')+ geom_hline(yintercept=4, linetype="solid", color = "red")+ geom_hline(yintercept=-4, linetype="solid", color = "red")
Figura 6. Leve tendência positiva pode ser vista na regressão linear.
Avaliando agora o qual o impacto anual através dos coeficientes do modelo.
lm(Data~Erro,data=calib)
##
## Call:
## lm(formula = Data ~ Erro, data = calib)
##
## Coefficients:
## (Intercept) Erro
## 2015.4666 0.2279
O modelo descreve que no ano de 2015 média dos erros foi zero e que a inclinação da curva é de 0,22% ao ano. Isso por ser confirmado verificando qual a media de 2020:
mean(subset(calib$Erro,calib$Data==2020 ))
## [1] 1.102667
Muito próximo do calculado:
0.22*5
## [1] 1.1
Ou seja, penas em 2033 a média dos erros estaria em 4%, o que seria muito improvável já que as pipetas ja teriam sido substituídas devido ao final da vida útil.
(4/0.22)+2015
## [1] 2033.182
De todas as calibrações, um total de 18 (4%) ficaram fora do limite interno de aceitação do laboratorio que é de 4%. Verificamos agora se a exclusão dos dados acima de 4% de erro, retornam o conjunto a normalidade.
baixo <- subset(calib, PONTO == "Baixo")
baixo4 <- subset(baixo, Erro < 4 & Erro > -4)
shapiro.test(baixo4$Erro)
##
## Shapiro-Wilk normality test
##
## data: baixo4$Erro
## W = 0.98451, p-value = 0.1399
O P de significancia confirma que com a exclusão dos equipamentos com falhas, se obtém um P de aproximadamente 0,14 (>P 0.05). confirmando a normalidade dos dados.
Figura 6: Distribuição dos erros dos ponto inferiores das pipetas após exclusão dos erros acima de 4%. Acima histograma de frequência, abaixo gráfico QQ.
Vamos agora tentar entender a origem, distribuição e frequência dos erros nos pontos inferiores de calibração (menores volumes). Esses pontos serão considerados outliers daqui em diante.
Abaixo podemos ver a diferença entre os quartis dentro do conjundo de dados e o mesmo sem os outliers (respectivamente):
round(quantile(abs(baixo$Erro)),2)
## 0% 25% 50% 75% 100%
## 0.00 0.50 1.20 2.39 21.60
round(quantile(abs(baixo4$Erro)),2)
## 0% 25% 50% 75% 100%
## 0.00 0.47 1.00 1.92 3.96
Aqui selecionamos somente os outliers (de todo o conjunto de dados):
Tabela 3: Seleção dos erros acima de 4%.
library(knitr)
Erro4 = subset(calib, Erro >4 | Erro < -4)
kable(Erro4)
| TAG | PONTO | Data | volume_ul | Erro_ul | Erro | |
|---|---|---|---|---|---|---|
| 10 | PIPETA-05B | Baixo | 2018 | 100 | 9.00 | 9.00 |
| 13 | PIPETA-05B | Baixo | 2017 | 100 | 7.30 | 7.30 |
| 19 | PIPETA-05B | Baixo | 2015 | 100 | 7.00 | 7.00 |
| 55 | PIPETA-08B | Baixo | 2018 | 1000 | -100.00 | -10.00 |
| 58 | PIPETA-08B | Baixo | 2017 | 1000 | 216.00 | 21.60 |
| 87 | PIPETA-09B | Baixo | 2016 | 50 | 3.40 | 6.80 |
| 92 | PIPETA-09B | Baixo | 2015 | 50 | 2.40 | 4.80 |
| 101 | PIPETA-09B | Baixo | 2011 | 50 | -2.26 | -4.52 |
| 194 | PIPETA-14B | Baixo | 2018 | 1000 | 44.90 | 4.49 |
| 209 | PIPETA-14B | Baixo | 2013 | 1000 | 90.00 | 9.00 |
| 263 | PIPETA-16B | Baixo | 2012 | 1000 | 88.00 | 8.80 |
| 335 | PIPETA-19B | Baixo | 2011 | 20 | -0.90 | -4.50 |
| 347 | PIPETA-20B | Baixo | 2016 | 20 | -0.93 | -4.65 |
| 359 | PIPETA-20B | Baixo | 2011 | 20 | -1.00 | -5.00 |
| 404 | PIPETA-04B | Baixo | 2012 | 1000 | -40.10 | -4.01 |
| 440 | PIPETA-01B | Baixo | 2017 | 10 | -0.62 | -6.20 |
Pode-se observar que 100% dos outliers provém de pontos de calibração mais baixos. Aqui, sua plotagem (Valor do Erro em % contra o ano de calibração) para verificar visualmente por tendências:
Figura 7: Resumo gráfico do comportamento dos erros. A esquerda scarterplot com linha de suavização dos dados de calibração versus tempo e a direita os mesmos dados com identificação da pipeta (por cor) e Volume (tamanho do marcador) que apresentou erro acima de 4%.
Não é possível visualizar tendências claras. Nem quanto a evolução do tempo como em relação a volumes e pipetas específicas.
Conforme exigencias da ISO/IEC 17025 [4] Laboratórios de ensaio necessitam fazer verificações intermediária (checagens) de seus equipamentos. Estes dados (20 pipetas, 3 pontos, 10 anos) foram compilados aos dados já existentes no novo arquivo calib-verif.csv
Tabela 4: Os erros obtidos na verificação intermediária estão incluidos no campo “Erro_verif_ul” e os valores relativos (% do valor ensaiado) no campo “Erro_verif_ul_rel”
library(knitr)
calib_verif <- read.csv("/mnt/DADOS/Data Science/Calib/calib-verif.csv", dec=".")
kable(head(calib_verif))
| TAG | PONTO | Data | volume_ul | Erro_ul | Erro | Erro_verif_ul | Erro_verif_ul_rel |
|---|---|---|---|---|---|---|---|
| PIPETA-05B | Baixo | 2020 | 100 | 3.59 | 3.590 | 0.26 | 0.26 |
| PIPETA-05B | Médio | 2020 | 500 | 2.32 | 0.464 | 4.25 | 0.85 |
| PIPETA-05B | Alto | 2020 | 1000 | 3.16 | 0.316 | 3.25 | 0.33 |
| PIPETA-05B | Baixo | 2019 | 100 | 1.81 | 1.810 | 1.50 | 1.50 |
| PIPETA-05B | Médio | 2019 | 500 | 1.18 | 0.236 | 1.18 | 0.24 |
| PIPETA-05B | Alto | 2019 | 1000 | 5.34 | 0.534 | 5.44 | 0.54 |
Podemos agora investigar se há relação entre os valores de erros obtidos na calibração e na verificação intermediária correlacionando os dois:
library(ggplot2)
g=ggplot(calib_verif, aes(x=abs(Erro),y=abs(Erro_verif_ul_rel)))
g= g+geom_rect(data=NULL,aes(xmin=0,xmax=4,ymin=0,ymax=4), fill= "lightblue", alpha = 1/20)
g= g+geom_point(alpha =1)
g
Figura 8. Scarterplot dos dados de calibração e verificação intermediária de pipetas automáticas. Pode-se notar um forte concentração de dados dentro da faixa de 4% de erro (quadrado azul), e a existência de varios outiliers. Obs: ambos os eixos estão com valores absolutos, pois os dados mais antigos de verificação intermediária não leva em consideração se a tendência era positiva ou negativa.
Para melhorar a visualização, podemos passar ambos os eixo para Log base 10 deixar os limites do processo mais claros:
library(ggplot2)
cv = ggplot(calib_verif, aes(x=abs(Erro), y=abs(Erro_verif_ul_rel), color = PONTO ))
cv =cv +geom_rect(data=NULL,aes(xmin=0,xmax=50,ymin=0,ymax=50), fill= "yellow", alpha = 1/500)
cv = cv+geom_rect(data=NULL,aes(xmin=0,xmax=4,ymin=0,ymax=4), fill= "lightblue", alpha = 1/20)
cv= cv + geom_point() + geom_rug()
cv= cv+ scale_y_continuous(trans="log10") + scale_x_continuous(trans="log10")
cv
Figura 9: Distribuição dos erros obtidos pela calibração(Erro) contra os erros obtidos na verificação intermediária(Erro_verif_ul_rel). Eixos no formato logarítimico (base 10). Região delimitada em azul está dentro do erro aceitável de 4%, a em amarelo, fora. Traços próximos aos eixos indicam os valores individuais. Cores separam as três faixas de calibração/verificação de cada pipeta.
Há uma baixa correlação entre os dados, ou seja, não é possivel supor que o laboratório conseguiria replicar numericamente os dados de fornecedor de calibração, porém, é nitido que ele alcança faixas próximas. Para erros de calibração na região de 1% o laboratório verificou erros na faixa de 1%. Somente os pontos baixos na verificação (menores volumes de cada pipeta) ficaram acima dos 4% de erro relativo aceito no laboratório como limite. Mesmo comportamento encontrado pelo fornecedor de calibração.
Uma das abordagens recomendadas pelo ILAC (international Laboratory Accreditation Cooperation) é o uso de cartas controles para verificar a distribuição dos erros ao longo do tempo para um mesmo equipamento. Por simplificação, será construida a carta controle utilizando o pool total de dados, sem subgrupos, com todas as pipetas:
library(qcc)
qcc(calib$Erro, type="xbar.one")
Figura 10: Carta controle com os 448 valores individuais de calibração de pipetas volumétricas. Erro expressos como % do valor testado durante a calibração.
Se observa que os limites de controle do processo (UCL e LCL) ficaram em aproximadamente 4%( 3,9% de limite superior e -3,5% de limite inferior). Um valor muito próximo do já utilizado e que representa um processo controlado com distribuição normal.
É interessante notar na figura 11 que todos os pontos com calibração acima do limite máximo aceito pelo laboratório (em vermelho) são de pipetas que possuem pares ou modelos de que alcançam valores inferiores de volume trabalhando nas faixas média ou alta. Isso significa que caso uma pipeta de 1000ul tenha seu ponto inferior reprovado, existem modelos de 100 ou 200ul que atenderiam a demanda.
Figura 11: Pontos de calibração avaliados de 2010 a 2020. Escala logarítimica (base 10) para facilitar visualização. Pontos azuis indicam calibração satisfatória pontos em vermelho indicam falha (acima de 4% de erro em relação ao volume testado). O ano da reprovação esta indicado nos rótulos.
sfsdfsafs
Pode-se concluir que a utilização de um limite de 4% e calibração a cada 24 meses é válido, já que:
1- Os dados abaixo de 4% de erro relativo apresentam normalidade.
2- Estão dentro de um histórico no contexto de controle estatístico de processo.
3- Os pontos críticos do processo estão identificados (Valores inferiores de uso de cada pipeta com volume total abaixo de 1mL)
4- Das 20 pipetas, somente 5 apresentaram reincidencia no critério de exclusão do laboratório ao longo de 10 anos e poderiam ser mantidas com frequência anual. Do mesmo grupo, 10 pipetas nunca tiveram pontos reprovados em calibrações.
5- Não há registro de pipetadores de volumes médio e alto com falhas durante o período de 10 anos tanto de calibração como verificação intermediária.
6- Volumes baixos problemáticos em algumas pipetas podem ser substuidos por outras que trabalham com esse mesmo volume porém, como ponto médio ou alto. por exemplo: o ponto inferior de uma pipeta de 1000uL (neste caso 100uL) pode ter seu uso substituído por uma de 100uL de volume máximo.
[1] R Core Team (2020). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. URL https://www.R-project.org/.
[3] H. Wickham. ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York, 2016.
[2] ILAC-G24, 2007, Guidelines for the determination of calibration intervals of measuring instruments.
[4] ISO/IEC 17025:2017, General requirements for the competence of testing and calibration laboratories.