Echographies des personnes enceintes (DCIR et PMSI)

Bonjour à toutes et tous,

Je suis en train de calculer le nombre d’échographies que font les personnes enceintes.

Puisqu’une échographie peut être réalisée en cabinet, en clinique ou en ACE à l’hôpital, je dois apparier le DCIR et le PMSI. Je rencontre plusieurs questions :

  1. D’abord, la fiche de la documentation des ACE indique toujours des doublons pour HCL, APHP et HPHM. Alors qu’il n’y en a plus dans les tables séjours depuis 2017, il y en a toujours dans les ACE ? J’ai effectivement requêté sans les finess géographiques de ces entités et j’ai moins de résultats qu’avec ceux-ci.

  2. Avec ma méthode d’identification (ceinture+bretelle, voir ci-dessous), je trouve tout de même des résultats qui ne devrait pas exister.

2.a D’abord, je trouve 63 700 échos dans des ES publics dans le DCIR (PRS_PPU_SEC == 1) en 2021 (87k en 2017), malgré mon code qui indique : DPN_QLF != 71 pour les ES public non -FIDES et ETE_IND_TAA != 1 pour le public FIDES dans ER_ETE_F. Est-ce que j’ai raté une mention pour enlever le public ? Je sais que je pourrais faire PRS_PPU_SEC == 2 mais j’aimerais comprendre pourquoi ma méthode ne couvre pas tout le public.

2.b. En joignant par le NIR + EXE_SOI_DTD entre mes tables d’échos PMSI et DCIR, une bonne part de ces échos réalisées dans le public sont bien dans le PMSI également. Néanmoins je trouve aussi un nombre non négligeable d’échographies dans le DCIR réalisées en ES publics qui ne sont pas dans le PMSI. Sur les 146 000 échographies de 2017 dans le DCIR, j’en ai 8 300 en public non retrouvées dans le PMSI (5%). Sur les 106 000 en 2021, j’en ai 3 500 (3%).
Est-ce que quelqu’un-e a une idée de pourquoi ?

Je vous mets ma méthode et mon code dans un message séparé. Si mon code est juste, je suis content qu’il puisse servir à d’autres.

Merci d’avance,
Baptiste

Voici ma méthode et mon code R pour retrouver les échographies de grossesse :
Tout d’abord, je retrace les accouchements, par la fiche Chaînage Mère-Enfants, pour retrouver les NIR et dates d’accouchement (je prends le mois de sortie de séjour) et crée une borne basse de début de grossesse (accouchement - 9 mois). Je fais un map (equivalent d’une boucle for) pour faire chaque année de 2017 à 2021.

acchmts<- map_dfr(
  paste0(17:21),
  ~return(
    tbl(conn,paste0("T_MCO", .x, "A")) %>% 
      filter(CDC_ACT %in% c("JQGA002",
                            "JQGA003",
                            "JQGA004",
                            "JQGA005",
                            "JQGD001",
                            "JQGD002",
                            "JQGD003",
                            "JQGD004",
                            "JQGD005",
                            "JQGD007",
                            "JQGD008",
                            "JQGD010",
                            "JQGD012",
                            "JQGD013")) %>% 
      mutate(acte_acchmt = "1") %>% 
      distinct(ETA_NUM, RSA_NUM, acte_acchmt) %>% 
      right_join(tbl(conn,paste0("T_MCO", .x, "B"))) %>% 
      filter(DGN_PAL == "Z3900" | acte_acchmt == "1") %>% 
      select(ETA_NUM, RSA_NUM, SOR_MOI, SOR_ANN) %>% 
      inner_join(tbl(conn, paste0("T_MCO", .x, "D")) %>% 
                 filter(str_sub(ASS_DGN, 1, 3) == "Z37")) %>% 
      left_join(tbl(conn, paste0("T_MCO", .x, "C")) %>% 
                  select(ETA_NUM, RSA_NUM, NIR_ANO_17, RNG_BEN)) %>% 
      collect()
  ) %>% 
    ungroup() %>% 
    distinct(NIR_ANO_17, RNG_BEN, SOR_ANN, SOR_MOI) 
)

acchmts <-  acchmts %>% 
  mutate(debut_grossesse = dmy(paste("01", SOR_MOI, SOR_ANN, sep = "-")) - months(9))

A côté, je récupère les codes CCAM correspondant à de l’échographie foetale/de grossesse/d’utérus gravide, qui me servira tant pour la requête DCIR que PMSI.


ccam_echos <- c('JNQM001',
                'JNQK001',
                'JNQD001',
                'JQQP001',
                'JQQM010',
                'JQQM015',
                'JQQM018',
                'JQQM016',
                'JQQM019',
                'JQQM017',
                'JQQM002',
                'JQQM007',
                'JQQM001',
                'JQQM003',
                'JQQM008' )

Je requête le DCIR pour n’avoir que les consultations avec ces codes CCAM, récupère les consultations, en filtrant out les établissements publics en FIDES, les consultations en public non-FIDES (et les lignes dédoublées pour les suppléments).

################
################ Echos ds DCIR : Part One
################
#Table des Actes CCAM : 1 ligne = 1 'séjour' * Nb d'actes

echos  <-  tbl(conn, "ER_CAM_F") %>% 
  filter(CAM_PRS_IDE %in% ccam_echos,
         FLX_DIS_DTD > TO_DATE('31/12/16', 'DD/MM/RR')) %>% 
  distinct(FLX_DIS_DTD,
         FLX_TRT_DTD,
         FLX_EMT_TYP,
         FLX_EMT_NUM,
         FLX_EMT_ORD,
         ORG_CLE_NUM,
         DCT_ORD_NUM,
         PRS_ORD_NUM,
         REM_TYP_AFF) %>% 
  collect()

dbWriteTable(conn, "ECHOS", echos, overwrite = TRUE)

###########
########### Echos ds DCIR : Part Two
########### Requêtage des consults pour échographie
########### Attention, met environ 6 heures à tourner
###########

for (annee in paste0(17:22)) {
  
  print(annee)
  
#Mensualisation de la requête (dataframe avec une ligne = 1er du mois en début, 1er du mois suivant en fin
  debut_fin <- expand_grid(jourmois = paste0("01/", c(paste0("0", seq(1:9)), "10", "11", "12"), "/"), 
                           ann = annee) %>%
    transmute(debut = paste0(jourmois, ann)) %>%
    mutate(fin = as.character(dmy(debut)+months(1)),
           fin = paste(str_sub(fin, 9), str_sub(fin, 6, 7), str_sub(fin, 3, 4), sep = "/")) %>% 
    arrange(dmy(debut))
  
  tmp <- map2_dfr(
    debut_fin$debut,
    debut_fin$fin,
    ~return(tbl(conn, "ECHOS") %>% #Table créée ci-dessus
              filter(FLX_DIS_DTD >= TO_DATE(.x, 'DD/MM/RR'), #Mensualisation
                     FLX_DIS_DTD < TO_DATE(.y, 'DD/MM/RR')) %>% 
              distinct(FLX_DIS_DTD,
                       FLX_TRT_DTD,
                       FLX_EMT_TYP,
                       FLX_EMT_NUM,
                       FLX_EMT_ORD,
                       ORG_CLE_NUM,
                       DCT_ORD_NUM,
                       PRS_ORD_NUM,
                       REM_TYP_AFF) %>% 
              left_join(tbl(conn, "ER_ETE_F")) %>% #Jointure référentiel établissement pour...
              filter(ETE_IND_TAA != 1) %>% #...enlever le public en FIDES
              left_join(
                tbl(conn, "ER_PRS_F") %>% 
                  filter(FLX_DIS_DTD >= TO_DATE(.x, 'DD/MM/RR'), #Mensualisation
                         FLX_DIS_DTD < TO_DATE(.y, 'DD/MM/RR'),
                         EXE_SOI_DTD > TO_DATE('31/12/16', 'DD/MM/RR'), #Bornes temporelles de mon analyse
                         EXE_SOI_DTD < TO_DATE('01/01/22', 'DD/MM/RR'),
                         CPL_MAJ_TOP < 2, #Enlève les compléments d'actes qui dédoublent des lignes
                         DPN_QLF != 71) #Enlève les ACE du public non-FIDES
              ) %>%
              distinct(EXE_SOI_DTD, #Récupère les infos pertinentes pour mon analyse
                       BEN_CDI_NIR,
                       BEN_NIR_PSA,
                       BEN_RNG_GEM,
                       BEN_RES_DPT,
                       PRS_PPU_SEC) %>% 
              collect() 
  ))
  
 # Je crée une table sur ORAUSER directement 
  if (annee == "17") {
    
    dbWriteTable(conn, "ECHOSDCIR", tmp, overwrite = TRUE) #
    
  } else {
    
    dbWriteTable(conn, "ECHOSDCIR", tmp, append = TRUE)
    
  }
  
  rm(tmp)
}

Puis pareil pour le PMSI : ACE avec un acte CCAM d’échographie. J’ai aussi une version de T_FINESS pour avoir le statut juridique de l’établissement (au delà du ex-OQN/ex-DG donné dans le référentiel établissement).

#######################################################
####################################################### Echos ds PMSI
#######################################################
#Les échos étant des consultations externes
# On n'a que le public dans le PMSI (activité libérale dans le privé)
# Donc on retirera le public du DCIR plus bas


list_doublons <- c('130780521', '130783236', '130783293', '130784234', '130804297','600100101', '750041543', 
                   '750100018', '750100042', '750100075', '750100083', '750100091', '750100109', '750100125', 
                   '750100166', '750100208', '750100216', '750100232', '750100273', '750100299' , '750801441', 
                   '750803447', '750803454', '910100015', '910100023', '920100013', '920100021', '920100039', 
                   '920100047', '920100054', '920100062', '930100011', '930100037', '930100045', '940100027', 
                   '940100035', '940100043', '940100050', '940100068', '950100016', '690783154', '690784137', 
                   '690784152', '690784178', '690787478', '830100558')


# Utilise le vecteur ccam_echos créé en début de script

echos_PMSI <- map_dfr(paste0(17:21), #Pour les années 2017 à 2021
                      ~return(tbl(conn, paste0("T_MCO", .x, "FMSTC")) %>% #Table actes CCAM
                                filter(CCAM_COD %in% ccam_echos,
                                       !ETA_NUM %in% list_doublons) %>% 
                                distinct(ETA_NUM,
                                         ETA_NUM_GEO, 
                                         SEQ_NUM) %>%
                                left_join(tbl(conn, paste0("T_MCO", .x, "FASTC")) %>% 
                                                distinct(ETA_NUM,
                                                         ETA_NUM_GEO, 
                                                         SEQ_NUM,
                                                         BDI_DEP)) %>% 
                                left_join(tbl(conn, "T_FINESS") %>% #Version de t-finess que j'ai mise sur mon ORAUSER
                                            rename(ETA_NUM = FINESS) %>% 
                                            select(ETA_NUM, CATEG_LIB, STATUT_JUR_NIV2_LIB)) %>% 
                                left_join(tbl(conn, paste0("T_MCO", .x, "CSTC")) %>% #Table patients : 1 ligne = 1 séjour (par ETA_NUM)
                                            select(ETA_NUM, SEQ_NUM, NIR_ANO_17, EXE_SOI_DTD)) %>% 
                                collect()))

Ma jointure pour voir les doublons entre PMSI et DCIR, et les DCIR qui sont du public :

echos_total <- echos_dcir %>% 
  group_by(NIR_ANO_17 = BEN_NIR_PSA, EXE_SOI_DTD) %>% 
  summarise(PRS_PPU_SEC = first(PRS_PPU_SEC)) %>% 
  ungroup() %>% 
  mutate(dcir = 1) %>% 
  full_join(echos_PMSI %>% 
              distinct(NIR_ANO_17, EXE_SOI_DTD) %>% 
              mutate(pmsi = 1))

echos_total %>% count(dcir, pmsi, PRS_PPU_SEC) 

Si tout cela est juste, voici comme je compte faire, je compte faire une jointure totale entre mes accouchements et ma table echos_total, et filtrer pour n’avoir que les échographies ayant lieu entre la borne basse de début de grossesse et l’accouchement.

Je pourrais poster le reste de mon code si il est juste et que ça en intéresse certain-e-s.

Bonne journée !
Baptiste