Eurachem A5.2: OLS, WLS e diagnosticos da curva analitica

Objetivo

Esta vinheta aplica o fluxo do ValCurvaR aos dados da Tabela A5.2 do guia Eurachem/CITAC. Os dados sao mantidos no formato longo: cada uma das tres replicatas continua disponivel para avaliar a variabilidade e a falta de ajuste.

O exemplo demonstra a analise; ele nao estabelece, por si so, um criterio de aceitacao universal para uma tecnica ou matriz.

Dados e ajuste inicial

dados <- dados_eurachem_a52()
curva <- validar_curva(dados, concentracao_mg_L, absorbancia, replica)

ols <- ajustar_curva(curva, metodo = "ols")
wls <- ajustar_curva(curva, metodo = "wls", pesos = "variancia_nivel")

ols
#> ValCurvaR OLS fit
#> sinal = 0.0087 + 0.241 * concentracao
#> n = 15 | niveis = 5
wls
#> ValCurvaR WLS fit
#> sinal = 0.0034275902 + 0.25554881 * concentracao
#> n = 15 | niveis = 5

Variabilidade, ajuste e influencia

diag_ols <- diagnosticar_curva(ols)
diag_ols$resumo_niveis
#>   concentracao n media_sinal     dp_sinal cv_percentual
#> 1          0.1 3  0.02866667 0.0005773503     2.0140126
#> 2          0.3 3  0.08266667 0.0015275252     1.8478128
#> 3          0.5 3  0.13300000 0.0020000000     1.5037594
#> 4          0.7 3  0.18133333 0.0015275252     0.8423852
#> 5          0.9 3  0.22033333 0.0083864971     3.8062770
diag_ols$homocedasticidade
#> $disponivel
#> [1] TRUE
#> 
#> $estatistica
#> [1] 0.8041237
#> 
#> $gl1
#> [1] 4
#> 
#> $gl2
#> [1] 10
#> 
#> $p_valor
#> [1] 0.5497365
diag_ols$falta_ajuste
#> $disponivel
#> [1] TRUE
#> 
#> $ss_erro_puro
#> [1] 0.0001586667
#> 
#> $ss_falta_ajuste
#> [1] 0.0002325333
#> 
#> $gl_falta_ajuste
#> [1] 3
#> 
#> $gl_erro_puro
#> [1] 10
#> 
#> $estatistica
#> [1] 4.885154
#> 
#> $p_valor
#> [1] 0.02415306
diag_ols$mandel
#> $disponivel
#> [1] TRUE
#> 
#> $estatistica
#> [1] 15.32934
#> 
#> $p_valor
#> [1] 0.002052595
#> 
#> $modelo_quadratico
#> 
#> Call:
#> stats::lm(formula = .y ~ .x + I(.x^2), data = data, weights = fit$weights)
#> 
#> Coefficients:
#> (Intercept)           .x      I(.x^2)  
#>   -0.001014     0.298143    -0.057143
diag_ols$avisos
#> [1] "Breusch-Pagan indica variancia nao constante."                                              
#> [2] "Goldfeld-Quandt indica variancia nao constante ao longo da concentracao."                   
#> [3] "Cochran indica uma variancia de nivel desproporcionalmente alta."                           
#> [4] "Ha evidencia de falta de ajuste linear; investigue a faixa ou a curvatura."                 
#> [5] "O termo quadratico melhora o ajuste; nao aprove a linearidade sem investigacao."            
#> [6] "Ha observacoes influentes; investigue-as antes de excluir qualquer dado."                   
#> [7] "Ha residuos studentizados extremos; confirme a causa metrologica antes de qualquer decisao."

O teste de falta de ajuste usa a variacao entre replicatas para separar erro puro de desvio da reta. Portanto, ele deixa de estar disponivel quando os dados ja foram agregados por nivel.

Comparacao entre OLS e WLS

comparar_modelos(ols, wls)
#>              metodo           pesos intercepto inclinacao        r2  rmse_sinal
#> (Intercept)     OLS         nenhuma 0.00870000  0.2410000 0.9944185 0.005106858
#> (Intercept)1    WLS variancia_nivel 0.00342759  0.2555488 0.9990911 0.006857218
#>              vies_medio_retrocalculado erro_relativo_medio_percentual
#> (Intercept)              -3.608225e-17                       5.744319
#> (Intercept)1             -7.834109e-03                       2.538395

O maior R2 nao decide qual modelo deve ser usado. A comparacao deve incluir o padrao dos residuos, a justificativa dos pesos e o desempenho de retrocalculo na faixa de uso pretendida.

painel_calibracao(wls)

Retrocálculo

retrocalcular_concentracao(wls, sinal = c(0.133, 0.180), k = 1)
#>   sinal concentracao  u_sinal u_padrao fator_cobertura U_expandida nivel
#> 1 0.133    0.5070358 1.528726  5.98213        2.160369    12.92361  0.95
#> 2 0.180    0.6909537 1.528726  5.98213        2.160369    12.92361  0.95
#>   gl_regressao contribuicao_sinal contribuicao_intercepto
#> 1           13           35.78587            5.986608e-06
#> 2           13           35.78587            5.986608e-06
#>   contribuicao_inclinacao contribuicao_cov_intercepto_inclinacao
#> 1            1.799000e-05                          -1.491709e-05
#> 2            3.340811e-05                          -2.032799e-05

O retrocalculo usa o modelo x = (y - a) / b e a propagacao GUM conserva o termo de covariancia entre a e b. Quando u_sinal nao e informado, o pacote usa o desvio-padrao residual dividido por sqrt(k) como estimativa derivada dos dados. A decisao metrologica final deve considerar as demais fontes de incerteza relevantes ao procedimento.

Criterios e rastreabilidade da decisao

Os limites sao definidos pelo usuario, pois nao ha um unico limite de CV ou erro relativo valido para todos os metodos e matrizes. O pacote registra tanto os criterios fornecidos como aqueles que permaneceram nao avaliados.

avaliar_adequacao(
  wls,
  criterios = list(
    cv_max_percentual = 10,
    erro_relativo_retrocalculo_max_percentual = 10
  )
)
#> $criterios
#>                                   criterio        valor limite       status
#> 1                     p de falta de ajuste 0.0014054866     NA nao avaliado
#> 2                     p do teste de Mandel 0.0007427578     NA nao avaliado
#> 3                  CV maximo por nivel (%) 3.8062770425     10       atende
#> 4 erro relativo medio maximo por nivel (%) 5.6906673757     10       atende
#> 
#> $retrocalculo_por_observacao
#>    concentracao sinal concentracao_retrocalculada erro_relativo_percentual
#> 1           0.1 0.028                  0.09615544              -3.84455568
#> 2           0.1 0.029                  0.10006859               0.06859102
#> 3           0.1 0.029                  0.10006859               0.06859102
#> 4           0.3 0.084                  0.31529166               5.09721990
#> 5           0.3 0.083                  0.31137851               3.79283767
#> 6           0.3 0.081                  0.30355222               1.18407320
#> 7           0.5 0.135                  0.51486214               2.97242832
#> 8           0.5 0.131                  0.49920955              -0.15808905
#> 9           0.5 0.133                  0.50703585               1.40716964
#> 10          0.7 0.180                  0.69095374              -1.29232239
#> 11          0.7 0.181                  0.69486689              -0.73330144
#> 12          0.7 0.183                  0.70269318               0.38474048
#> 13          0.9 0.215                  0.82791388              -8.00956913
#> 14          0.9 0.230                  0.88661108              -1.48765795
#> 15          0.9 0.216                  0.83182702              -7.57477505
#> 
#> $retrocalculo_por_nivel
#>   concentracao vies_percentual erro_absoluto_medio_percentual
#> 1          0.1      -1.2357912                      1.3272459
#> 2          0.3       3.3580436                      3.3580436
#> 3          0.5       1.4071696                      1.5125623
#> 4          0.7      -0.5469611                      0.8034548
#> 5          0.9      -5.6906674                      5.6906674
#> 
#> $conclusao
#> [1] "Atende aos criterios informados; a aprovacao final requer revisao tecnica."
#> 
#> attr(,"class")
#> [1] "valcurva_adequacao"

relatorio_auditoria(wls, criterios = list(cv_max_percentual = 10))
#> $modelo
#> $modelo$metodo
#> [1] "wls"
#> 
#> $modelo$pesos
#> [1] "variancia_nivel"
#> 
#> $modelo$coeficientes
#> (Intercept)          .x 
#>  0.00342759  0.25554881 
#> 
#> $modelo$covariancia_coeficientes
#>               (Intercept)            .x
#> (Intercept)  3.909566e-07 -9.606458e-07
#> .x          -9.606458e-07  4.569847e-06
#> 
#> $modelo$graus_de_liberdade
#> [1] 13
#> 
#> 
#> $dados_por_nivel
#>   concentracao n media_sinal     dp_sinal cv_percentual
#> 1          0.1 3  0.02866667 0.0005773503     2.0140126
#> 2          0.3 3  0.08266667 0.0015275252     1.8478128
#> 3          0.5 3  0.13300000 0.0020000000     1.5037594
#> 4          0.7 3  0.18133333 0.0015275252     0.8423852
#> 5          0.9 3  0.22033333 0.0083864971     3.8062770
#> 
#> $diagnosticos
#> $diagnosticos$resumo_niveis
#>   concentracao n media_sinal     dp_sinal cv_percentual
#> 1          0.1 3  0.02866667 0.0005773503     2.0140126
#> 2          0.3 3  0.08266667 0.0015275252     1.8478128
#> 3          0.5 3  0.13300000 0.0020000000     1.5037594
#> 4          0.7 3  0.18133333 0.0015275252     0.8423852
#> 5          0.9 3  0.22033333 0.0083864971     3.8062770
#> 
#> $diagnosticos$homocedasticidade
#> $diagnosticos$homocedasticidade$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$homocedasticidade$estatistica
#> [1] 0.8041237
#> 
#> $diagnosticos$homocedasticidade$gl1
#> [1] 4
#> 
#> $diagnosticos$homocedasticidade$gl2
#> [1] 10
#> 
#> $diagnosticos$homocedasticidade$p_valor
#> [1] 0.5497365
#> 
#> 
#> $diagnosticos$breusch_pagan
#> $diagnosticos$breusch_pagan$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$breusch_pagan$estatistica
#> [1] 12364627
#> 
#> $diagnosticos$breusch_pagan$gl
#> [1] 1
#> 
#> $diagnosticos$breusch_pagan$p_valor
#> BP 
#>  0 
#> 
#> 
#> $diagnosticos$goldfeld_quandt
#> $diagnosticos$goldfeld_quandt$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$goldfeld_quandt$estatistica
#> [1] 27.25
#> 
#> $diagnosticos$goldfeld_quandt$gl
#> [1] 4 4
#> 
#> $diagnosticos$goldfeld_quandt$p_valor
#> [1] 0.003670394
#> 
#> 
#> $diagnosticos$cochran
#> $diagnosticos$cochran$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$cochran$estatistica
#> [1] 0.8865546
#> 
#> $diagnosticos$cochran$gl
#> 0.1 
#>   2 
#> 
#> $diagnosticos$cochran$p_valor_aproximado
#> [1] 0.0008574005
#> 
#> $diagnosticos$cochran$valor_critico_5_percentual
#> [1] 0.6837722
#> 
#> $diagnosticos$cochran$variancias_por_nivel
#>          0.1          0.3          0.5          0.7          0.9 
#> 3.333333e-07 2.333333e-06 4.000000e-06 2.333333e-06 7.033333e-05 
#> 
#> 
#> $diagnosticos$grubbs
#> $diagnosticos$grubbs$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$grubbs$estatistica
#> [1] 2.418672
#> 
#> $diagnosticos$grubbs$p_valor
#> [1] 0.0478073
#> 
#> $diagnosticos$grubbs$observacao
#> 13 
#> 13 
#> 
#> $diagnosticos$grubbs$residuo
#>          13 
#> -0.01842152 
#> 
#> $diagnosticos$grubbs$alternativa
#> [1] "lowest value -0.0184215230338424 is an outlier"
#> 
#> $diagnosticos$grubbs$nota
#> [1] "Resultado para investigacao; nao exclua observacoes automaticamente."
#> 
#> 
#> $diagnosticos$falta_ajuste
#> $diagnosticos$falta_ajuste$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$falta_ajuste$ss_erro_puro
#> [1] 0.0001586667
#> 
#> $diagnosticos$falta_ajuste$ss_falta_ajuste
#> [1] 0.0005466548
#> 
#> $diagnosticos$falta_ajuste$gl_falta_ajuste
#> [1] 3
#> 
#> $diagnosticos$falta_ajuste$gl_erro_puro
#> [1] 10
#> 
#> $diagnosticos$falta_ajuste$estatistica
#> [1] 11.48435
#> 
#> $diagnosticos$falta_ajuste$p_valor
#> [1] 0.001405487
#> 
#> 
#> $diagnosticos$mandel
#> $diagnosticos$mandel$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$mandel$estatistica
#> [1] 20.13689
#> 
#> $diagnosticos$mandel$p_valor
#> [1] 0.0007427578
#> 
#> $diagnosticos$mandel$modelo_quadratico
#> 
#> Call:
#> stats::lm(formula = .y ~ .x + I(.x^2), data = data, weights = fit$weights)
#> 
#> Coefficients:
#> (Intercept)           .x      I(.x^2)  
#>   0.0003944    0.2867469   -0.0412048  
#> 
#> 
#> 
#> $diagnosticos$influencia
#>    concentracao sinal       residuo residuo_padronizado residuo_studentizado
#> 1           0.1 0.028 -9.824716e-04         -1.34386706          -1.39140599
#> 2           0.1 0.029  1.752835e-05          0.02397604           0.02303594
#> 3           0.1 0.029  1.752835e-05          0.02397604           0.02303594
#> 4           0.3 0.084  3.907766e-03          1.70921205           1.86503330
#> 5           0.3 0.083  2.907766e-03          1.27182346           1.30586804
#> 6           0.3 0.081  9.077655e-04          0.39704628           0.38380394
#> 7           0.5 0.135  3.798003e-03          1.28211145           1.31795345
#> 8           0.5 0.131 -2.019973e-04         -0.06818929          -0.06552587
#> 9           0.5 0.133  1.798003e-03          0.60696108           0.59159203
#> 10          0.7 0.180 -2.311760e-03         -1.13238219          -1.14594103
#> 11          0.7 0.181 -1.311760e-03         -0.64254670          -0.62738177
#> 12          0.7 0.183  6.882398e-04          0.33712429           0.32532373
#> 13          0.9 0.215 -1.842152e-02         -1.44730544          -1.51821008
#> 14          0.9 0.230 -3.421523e-03         -0.26881539          -0.25899029
#> 15          0.9 0.216 -1.742152e-02         -1.36873944          -1.42144839
#>    alavancagem         cook      dffits dfbeta_intercepto dfbeta_inclinacao
#> 1   0.31389685 0.4131237566 -0.94113655      -0.897612603       0.448412438
#> 2   0.31389685 0.0001314990  0.01558134       0.014860760      -0.007423859
#> 3   0.31389685 0.0001314990  0.01558134       0.014860760      -0.007423859
#> 4   0.04141851 0.0631142418  0.38767637       0.134068317       0.156571837
#> 5   0.04141851 0.0349453295  0.27144511       0.093872603       0.109629226
#> 6   0.04141851 0.0034057889  0.07977966       0.027589828       0.032220812
#> 7   0.06127214 0.0536469345  0.33671444      -0.063588673       0.275612476
#> 8   0.06127214 0.0001517489 -0.01674073       0.003161495      -0.013702872
#> 9   0.06127214 0.0120230607  0.15114159      -0.028543157       0.123714646
#> 10  0.23570073 0.1977213456 -0.63637193       0.252708299      -0.587719033
#> 11  0.23570073 0.0636615031 -0.34840200       0.138353175      -0.321765429
#> 12  0.23570073 0.0175245785  0.18066104      -0.071741918       0.166848857
#> 13  0.01437843 0.0152788811 -0.18337176       0.090351722      -0.175886202
#> 14  0.01437843 0.0005270835 -0.03128125       0.015413031      -0.030004292
#> 15  0.01437843 0.0136650971 -0.17168473       0.084593240      -0.164676261
#>    flag_cook flag_alavancagem flag_dffits flag_dfbeta flag_studentizado
#> 1       TRUE             TRUE        TRUE        TRUE             FALSE
#> 2      FALSE             TRUE       FALSE       FALSE             FALSE
#> 3      FALSE             TRUE       FALSE       FALSE             FALSE
#> 4      FALSE            FALSE       FALSE       FALSE             FALSE
#> 5      FALSE            FALSE       FALSE       FALSE             FALSE
#> 6      FALSE            FALSE       FALSE       FALSE             FALSE
#> 7      FALSE            FALSE       FALSE       FALSE             FALSE
#> 8      FALSE            FALSE       FALSE       FALSE             FALSE
#> 9      FALSE            FALSE       FALSE       FALSE             FALSE
#> 10     FALSE            FALSE       FALSE        TRUE             FALSE
#> 11     FALSE            FALSE       FALSE       FALSE             FALSE
#> 12     FALSE            FALSE       FALSE       FALSE             FALSE
#> 13     FALSE            FALSE       FALSE       FALSE             FALSE
#> 14     FALSE            FALSE       FALSE       FALSE             FALSE
#> 15     FALSE            FALSE       FALSE       FALSE             FALSE
#> 
#> $diagnosticos$normalidade
#> $diagnosticos$normalidade$shapiro_wilk
#> 
#>  Shapiro-Wilk normality test
#> 
#> data:  residuals
#> W = 0.70491, p-value = 0.0002806
#> 
#> 
#> $diagnosticos$normalidade$anderson_darling
#> 
#>  Anderson-Darling normality test
#> 
#> data:  residuals
#> A = 1.8386, p-value = 5.761e-05
#> 
#> 
#> $diagnosticos$normalidade$kolmogorov_smirnov_lilliefors
#> 
#>  Lilliefors (Kolmogorov-Smirnov) normality test
#> 
#> data:  residuals
#> D = 0.28385, p-value = 0.001992
#> 
#> 
#> $diagnosticos$normalidade$ryan_joiner
#> $diagnosticos$normalidade$ryan_joiner$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$normalidade$ryan_joiner$estatistica
#> [1] 0.836419
#> 
#> $diagnosticos$normalidade$ryan_joiner$valor_critico_5_percentual
#> [1] 0.9382595
#> 
#> $diagnosticos$normalidade$ryan_joiner$p_valor
#> [1] "< 0.01"
#> 
#> $diagnosticos$normalidade$ryan_joiner$rejeita_normalidade
#> [1] TRUE
#> 
#> $diagnosticos$normalidade$ryan_joiner$metodo
#> [1] "Ryan-Joiner (aproximacao por correlacao normal)"
#> 
#> 
#> 
#> $diagnosticos$independencia
#> $diagnosticos$independencia$durbin_watson
#> $diagnosticos$independencia$durbin_watson$disponivel
#> [1] FALSE
#> 
#> $diagnosticos$independencia$durbin_watson$mensagem
#> [1] "weighted regressions are not supported"
#> 
#> 
#> $diagnosticos$independencia$breusch_godfrey
#> $diagnosticos$independencia$breusch_godfrey$disponivel
#> [1] TRUE
#> 
#> $diagnosticos$independencia$breusch_godfrey$estatistica
#> [1] 3.66454
#> 
#> $diagnosticos$independencia$breusch_godfrey$gl
#> [1] 2
#> 
#> $diagnosticos$independencia$breusch_godfrey$p_valor
#> [1] 0.1600498
#> 
#> $diagnosticos$independencia$breusch_godfrey$alternativa
#> NULL
#> 
#> 
#> 
#> $diagnosticos$avisos
#> [1] "Breusch-Pagan indica variancia nao constante."                                   
#> [2] "Goldfeld-Quandt indica variancia nao constante ao longo da concentracao."        
#> [3] "Cochran indica uma variancia de nivel desproporcionalmente alta."                
#> [4] "Grubbs indica um residuo extremo; investigue a causa antes de qualquer exclusao."
#> [5] "Ha evidencia de falta de ajuste linear; investigue a faixa ou a curvatura."      
#> [6] "O termo quadratico melhora o ajuste; nao aprove a linearidade sem investigacao." 
#> [7] "Ha observacoes influentes; investigue-as antes de excluir qualquer dado."        
#> 
#> 
#> $adequacao
#> $criterios
#>                                   criterio        valor limite       status
#> 1                     p de falta de ajuste 0.0014054866     NA nao avaliado
#> 2                     p do teste de Mandel 0.0007427578     NA nao avaliado
#> 3                  CV maximo por nivel (%) 3.8062770425     10       atende
#> 4 erro relativo medio maximo por nivel (%) 5.6906673757     NA nao avaliado
#> 
#> $retrocalculo_por_observacao
#>    concentracao sinal concentracao_retrocalculada erro_relativo_percentual
#> 1           0.1 0.028                  0.09615544              -3.84455568
#> 2           0.1 0.029                  0.10006859               0.06859102
#> 3           0.1 0.029                  0.10006859               0.06859102
#> 4           0.3 0.084                  0.31529166               5.09721990
#> 5           0.3 0.083                  0.31137851               3.79283767
#> 6           0.3 0.081                  0.30355222               1.18407320
#> 7           0.5 0.135                  0.51486214               2.97242832
#> 8           0.5 0.131                  0.49920955              -0.15808905
#> 9           0.5 0.133                  0.50703585               1.40716964
#> 10          0.7 0.180                  0.69095374              -1.29232239
#> 11          0.7 0.181                  0.69486689              -0.73330144
#> 12          0.7 0.183                  0.70269318               0.38474048
#> 13          0.9 0.215                  0.82791388              -8.00956913
#> 14          0.9 0.230                  0.88661108              -1.48765795
#> 15          0.9 0.216                  0.83182702              -7.57477505
#> 
#> $retrocalculo_por_nivel
#>   concentracao vies_percentual erro_absoluto_medio_percentual
#> 1          0.1      -1.2357912                      1.3272459
#> 2          0.3       3.3580436                      3.3580436
#> 3          0.5       1.4071696                      1.5125623
#> 4          0.7      -0.5469611                      0.8034548
#> 5          0.9      -5.6906674                      5.6906674
#> 
#> $conclusao
#> [1] "Atende aos criterios informados; a aprovacao final requer revisao tecnica."
#> 
#> attr(,"class")
#> [1] "valcurva_adequacao"