AlertaDengue / AlertTools

GNU General Public License v3.0
1 stars 0 forks source link

Correção da contabilização dos casos no pipe_infodengue #8

Closed viniciusbgodinho closed 6 months ago

viniciusbgodinho commented 6 months ago

Objetivo Geral

Identificar na função pipe_infodengue o motivo de retornar casos em uma escala maior que os casos estimados.

viniciusbgodinho commented 6 months ago

@claudia-codeco após realizar os comentários nas linhas 341-345 da função getCases:

   #w <- (dd$dt_notific - dd$dt_sin_pri) > 60   
   #lw <- sum(w, na.rm = TRUE); plw <- round((lw / nrow(dd) * 100), digits = 2)
   #message(paste("there are", lw, "(",plw ,"%)","cases with implausible dt_sinpri. Imputed with dt_notific"))
   #dd$dt_sin_pri[which(w==TRUE)] <- dd$dt_notific[which(w==TRUE)] - 3  # median delay

Diminuiu a discrepância, mas ainda estava retornando casos superiores aos casos estimados, a exemplo das semanas 40 e 41 para o município de Ribeirão Preto, a partir da função nowcasting:

> dados <- getdelaydata(3543402, nyears= 2)  # Not run without connection
> resfitcIsT<-bayesnowcasting(dados, nowSE = 202349)
2407 registros com datas de inicio de sintomas invalidas
nowcast will be calibrated with  41682 cases
> tail(resfitcIsT, n = 13)
# A tibble: 11 × 7
   Date        Mean Median    LI     LS casos     SE
   <date>     <dbl>  <dbl> <dbl>  <dbl> <int>  <dbl>
 1 2023-09-30  201    201    201   201    201 202339
 2 2023-10-07  189.   189    189   190    189 202340
 3 2023-10-14  163.   163    163   164    163 202341
 4 2023-10-21  192.   192    192   194    192 202342
 5 2023-10-28  213.   213    212   216    212 202343
 6 2023-11-04  201.   201    200   205    200 202344
 7 2023-11-11  216.   215    213   224    213 202345
 8 2023-11-18  200.   199    194   215.   194 202346
 9 2023-11-25  218.   211    201   269.   200 202347
10 2023-12-02  219.   147    111   660.   107 202348
11 2023-12-09 3527.   172.    14 22838.    NA 202349 

A partir da função getCases :

 bb <- getCases(3543402, dataini = "sinpri")
cases aggregated by notification date
`summarise()` has grouped output by 'municipio_geocodigo'. You can override using the `.groups` argument.
> tail(bb, n = 15)
        SE  cidade CID10 casos localidade           nome    pop
714 202336 3543402   A90   163          0 Ribeirão Preto 711825
715 202337 3543402   A90   237          0 Ribeirão Preto 711825
716 202338 3543402   A90   201          0 Ribeirão Preto 711825
717 202339 3543402   A90   201          0 Ribeirão Preto 711825
718 202340 3543402   A90   190          0 Ribeirão Preto 711825
719 202341 3543402   A90   164          0 Ribeirão Preto 711825
720 202342 3543402   A90   192          0 Ribeirão Preto 711825
721 202343 3543402   A90   212          0 Ribeirão Preto 711825
722 202344 3543402   A90   200          0 Ribeirão Preto 711825
723 202345 3543402   A90   213          0 Ribeirão Preto 711825
724 202346 3543402   A90   194          0 Ribeirão Preto 711825
725 202347 3543402   A90   200          0 Ribeirão Preto 711825
726 202348 3543402   A90   107          0 Ribeirão Preto 711825
727 202349 3543402   A90     0          0 Ribeirão Preto 711825
728 202350 3543402   A90     0          0 Ribeirão Preto 711825

Desso modo, como na função nowcasting, em alguns casos, contabiliza um menor número de casos do que na função getCases, ele pode retornar casos estimados abaixo do número de casos contabilizados no pipe_infodengue.

viniciusbgodinho commented 6 months ago

Foi identificado que nas linhas 141-145 da função bayesnowcasting tem uma regra para eliminar datas de sintomas inválidas, que não existe na função getCases.

d$ininotif <- d$dt_notific - d$dt_sin_pri
 wrongdates <- which(d$ininotif > 30 | d$ininotif < 0 | is.na(d$dt_sin_pri))  
 if(length(wrongdates) > 0) {
 message(paste(length(wrongdates), "registros com datas de inicio de sintomas invalidas"))
  d <- d[-wrongdates,]
  }

Assim, uma solução proposta seria adicionar essa regra na função getCases.

Foi realizado o teste do alerta para todos os municípios, com essa alteração foi corrigido a inconsistência:

> df_check <- d |>
+     mutate(check = casos - tcasesmed) |>
+     filter(check >= 1)
> nrow(df_check)
[1] 0
claudia-codeco commented 6 months ago

Otima descoberta! concordo com a solução, mas com base nas discussoes feitas no grupo, é melhor a gente modificar wrongdates para:

wrongdates <- which(d$ininotif < 0 | is.na(d$dt_sin_pri))

justificativa é que é mais parcimonioso.

lembre de colocar um comentario em ambas as funcoes com essa memoria para que isso nao aconteça no futuro.

viniciusbgodinho commented 6 months ago

Quando retirei a condição d$ininotif > 30 da função bayesnowcasting retorna o erro abaixo. Retirando a condição parece que o modelo fica muito maior que o necessário, criando vários nós.

Error in inla.check.location(location[[r]], term = gp$random.spec[[r]]$term,  : 
  Locations are too close for f(Time, model="rw2", ...):  min(diff(sort(x)))/diff(range(x)) = 4.486e-04 < 1e-03
  You can fix this by some kind of binning, see ?inla.group
  If you want/need to bypass this check at your own risk, do
    > m = get("inla.models", inla.get.inlaEnv())
    > m$latent$rw2$min.diff = NULL
    > assign("inla.models", m, inla.get.inlaEnv())

 *** inla.core.safe:  inla.program has crashed: rerun to get better initial values. try=1/2 
Error in inla.check.location(location[[r]], term = gp$random.spec[[r]]$term,  : 
  Locations are too close for f(Time, model="rw2", ...):  min(diff(sort(x)))/diff(range(x)) = 4.486e-04 < 1e-03
  You can fix this by some kind of binning, see ?inla.group
  If you want/need to bypass this check at your own risk, do
    > m = get("inla.models", inla.get.inlaEnv())
    > m$latent$rw2$min.diff = NULL
    > assign("inla.models", m, inla.get.inlaEnv())

 *** inla.core.safe:  inla.program has crashed: rerun to get better initial values. try=2/2 
Error in inla.check.location(location[[r]], term = gp$random.spec[[r]]$term,  : 
  Locations are too close for f(Time, model="rw2", ...):  min(diff(sort(x)))/diff(range(x)) = 4.486e-04 < 1e-03
  You can fix this by some kind of binning, see ?inla.group
  If you want/need to bypass this check at your own risk, do
    > m = get("inla.models", inla.get.inlaEnv())
    > m$latent$rw2$min.diff = NULL
    > assign("inla.models", m, inla.get.inlaEnv())
nowcast failed
Here's the original error message:
Error in inla.core.safe(formula = formula, family = family, contrasts = contrasts,  : 
  *** Fail to get good enough initial values. Maybe it is due to something else.
claudia-codeco commented 6 months ago

Nesse caso, vamos colocar de volta, para fechar esse issue. Mas vamos abrir outro issue com o Leo para a gente migrar de vez para o nowcaster