strayMat / sndsTools

https://straymat.github.io/sndsTools/
Other
0 stars 2 forks source link

Tables prescription archivées et le mois de décembre #26

Open MarcDibling opened 1 month ago

MarcDibling commented 1 month ago

Hello 👋,

Sauf erreur de ma part, pour les tables archivées de prestation, une majeure partie des prestations exécutées en décembre d’une année A sont retrouvées dans la table de l’année A+1.

Petite représentation, longue mais flagrante, basée sur l’exemple du notebook pour confirmer la couverture partiellement exhaustive :

start_date <- as.Date("2011-11-01")
end_date <- as.Date("2015-01-01")
atc_cod_starts_with <- c("N04A")

dispenses <- extract_drug_dispenses(
    start_date = start_date,
    end_date = end_date,
    atc_cod_starts_with = atc_cod_starts_with)

dispenses %>%
  ggplot(aes(x = EXE_SOI_DTD, y = BEN_NIR_PSA)) +
  geom_point(size = 0.0001, alpha = 0.1) +
  theme(axis.text.y = element_blank())

Chaque point noir correspond à une date de délivrance et le problème concerne uniquement les transitions avec les tables archivées. Les bandes blanches indiquent donc que les prestations de décembre n'ont pas été récupérées. Screenshot 2024-08-01 at 19 29 38

Il s’agit d’un problème particulièrement embêtant parce qu’il nécessite une requête de la table de l'année A MAIS AUSSI celle de A+1 à chaque itération pour pouvoir être exhaustif sur l’année A.

Aussi, l’utilisation de “≤” dans les flux peut engendrer des doublons dans l’éventualité où FLX_DIS_DTD tombe sur 1er janv. Je ne sais pas si cela arrive fréquemment mais la modification est simple et l’impact non négligeable car peut permettre de libérer de l’espace sans stocker les doublons.

Je vais proposer des modifs de ce code pour prendre en compte ces prestations oubliées mais aussi spécifier la granularité (mois ou années) de la période de flux afin d’obtenir une barre de chargement plus dynamique.

PS : génial le travail déjà réalisé !

-Marc Dibling

abelloir-zz commented 1 month ago

Edit : L'erreur se situait au niveau du filtre sur les FLX_DIS_DTD. On a vu tous les trois ce matin avec @ThomasSoeiro que les tables archivées sont bien rangées selon FLX_DIS_DTD. J'ai donc mis à jour les filtres de la manière suivante dans #34 :

if (year == end_year) {
      dis_dtd_condition <- glue::glue(
        "FLX_DIS_DTD >= DATE '{year}-02-01'
        AND FLX_DIS_DTD <= DATE '{formatted_dis_dtd_end_date}'"
      )
    } else {
      dis_dtd_condition <- glue::glue(
        "FLX_DIS_DTD >= DATE '{year}-02-01'
      AND FLX_DIS_DTD <= DATE '{year + 1}-01-01'"
      )
    }
    soi_dtd_condition <- glue::glue(
      "EXE_SOI_DTD >= DATE '{formatted_start_date}'
      AND EXE_SOI_DTD <= DATE '{formatted_end_date}'"
    )
[...]
query <- er_prs_f |>
      dplyr::inner_join(er_pha_f, by = dcir_join_keys) |>
      dplyr::inner_join(ir_pha_r, by = c("PHA_PRS_C13" = "PHA_CIP_C13")) |>
      dplyr::filter(
        dbplyr::sql(soi_dtd_condition),
        dbplyr::sql(dis_dtd_condition)
      )

C'est à dire que j'ai rajouté le mois de janvier de l'année qui suit pour le découpage en années de FLX_DIS_DTD.

ThomasSoeiro commented 2 weeks ago

On a vu tous les trois ce matin avec @ThomasSoeiro que les tables archivées sont bien rangées selon FLX_DIS_DTD.

Les tests en question :

dbGetQuery(con, "SELECT MIN(exe_soi_dtd), MAX(exe_soi_dtd), MIN(flx_dis_dtd), MAX(flx_dis_dtd) FROM er_prs_f_2010;")
#   MIN(EXE_SOI_DTD) MAX(EXE_SOI_DTD) MIN(FLX_DIS_DTD) MAX(FLX_DIS_DTD)
# 1          1-01-01       2010-12-31       2010-02-01       2011-01-01

dbGetQuery(con, "SELECT MIN(exe_soi_dtd), MAX(exe_soi_dtd), MIN(flx_dis_dtd), MAX(flx_dis_dtd) FROM er_prs_f_2011";)
#   MIN(EXE_SOI_DTD) MAX(EXE_SOI_DTD) MIN(FLX_DIS_DTD) MAX(FLX_DIS_DTD)
# 1          1-01-01       2011-12-31       2011-02-01       2012-01-01

dbGetQuery(con, "SELECT MIN(exe_soi_dtd), MAX(exe_soi_dtd), MIN(flx_dis_dtd), MAX(flx_dis_dtd) FROM er_prs_f_2012;")
#   MIN(EXE_SOI_DTD) MAX(EXE_SOI_DTD) MIN(FLX_DIS_DTD) MAX(FLX_DIS_DTD)
# 1          1-01-01       2013-01-30       2012-02-01       2013-01-01

dbGetQuery(con, "SELECT MIN(exe_soi_dtd), MAX(exe_soi_dtd), MIN(flx_dis_dtd), MAX(flx_dis_dtd) FROM er_prs_f_2012 where exe_soi_dtd > date '1-01-01';")
#   MIN(EXE_SOI_DTD) MAX(EXE_SOI_DTD) MIN(FLX_DIS_DTD) MAX(FLX_DIS_DTD)
# 1       1912-02-15       2013-01-30       2012-02-01       2013-01-01

dbGetQuery(con, "SELECT COUNT(*) FROM er_prs_f_2012 where exe_soi_dtd < date '2012-01-01';")
#    COUNT(*)
# 1 404935662

dbGetQuery(con, "SELECT COUNT(*) FROM er_prs_f_2012 where exe_soi_dtd < date '2009-01-01';")
#   COUNT(*)
# 1  8417730

dbGetQuery(con, "SELECT COUNT(*) FROM er_prs_f_2012;")
#     COUNT(*)
# 1 5592513643
abelloir-zz commented 2 weeks ago

Mon test après les changements implémentés dans #34 :

> start_date <- as.Date("2011-11-01")
> end_date <- as.Date("2012-03-01")
> atc_cod_starts_with <- c("N04A")
> dispenses <- extract_drug_dispenses(
+     start_date = start_date,
+     end_date = end_date,
+     atc_cod_starts_with = atc_cod_starts_with)
Extracting drug dispenses with ATC codes starting with N04A...
Extracting 2012 (going from 2011 to 2012) [=============] 100% in  1m (eta:  0s)

image

Donc il n'y a plus de délivrances manquantes en décembre a priori :)