Closed viniciusbgodinho closed 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.
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
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.
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.
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
Objetivo Geral
Identificar na função pipe_infodengue o motivo de retornar casos em uma escala maior que os casos estimados.