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

Bonjour,

  1. Entre 2005 et 2017 compris, l’APHP, l’APHM et les HCL ont transmis leurs activités PMSI hospitalières et actes et consultations externes (ACE) en double. Pour plus d’informations, la fiche « Activité en double dans les fichiers PMSI » est disponible.

Depuis 2018, vous ne devriez plus retrouver de doublons pour ces établissements que ce soit dans les hospitalisations ou dans les ACE.

2a. En effet, si on refait l’exercice dans l’ESND, on retrouve 4% des prestations liées à des actes d’échographie en ES publics qui ne sont pas supprimées par les filtres recommandés. A notre connaissance aucune justification sur ces « erreurs » de remontées n’a été communiquée. La fiche « Dépenses des établissements de santé dans le SNDS » devrait répondre à votre question. Elle présente une méthodologie différente pour repérer les prestations de l’hôpital public et les ACE dans le DCIR, notamment en utilisant les variables de secteur public/privé, de catégorie d’établissement exécutant, d’indicateur T2A et de code du mode de traitement.

En observations complémentaires, ces 4% de prestations sont associées à 100% à un PS salarié public (PSE_STJ_COD = 61) et plus de 40% ont un qualificatif de dépense à « non remboursable » (DPN_QLF = 30).

2b. La jointure DCIR et PMSI n’est pas facile. Par exemple, un ES peut remonter sur son FINESS juridique d’un côté et son FINESS géographique de l’autre. Une autre subtilité qui pourrait aider dans le cas des actes CCAM : dans le DCIR la date de début d’hospitalisation PRS_HOS_DTD semble correspondre à la date de début d’ACE (donc EXE_SOI_DTD dans la table CSTC), alors que la date de soins EXE_SOI_DTD du DCIR semble correspondre à la date d’exécution de l’acte (donc EXE_SOI_DTD de la table FMSTC). Dans les quelques cas où la date de début d’hospitalisation n’est pas renseignée ou qu’une facture d’ACE regroupe plusieurs consultations ou actes, il peut être intéressant de chaîner sur l’une ou l’autre de ces dates.

A notre connaissance, aucune information n’est disponible sur l’exhaustivité des ACE facturées directement en T2A publique dans le PMSI.

Bien cordialement,
L’équipe du Health Data Hub

Cette réponse a été rédigée en collaboration avec la société HEVA.