4 pmeasyr : Imports MCO
4.1 Les différents fichiers à importer
Nom | Fonction |
---|---|
irsa | ~ MCO - Import des RSA |
irum | ~ MCO - Import des RUM |
idiap | ~ MCO - Import des DIAP |
idmi_mco | ~ MCO - Import des DMI |
iium | ~ MCO - Import des donnees UM |
ileg_mco | ~ MCO - Import des erreurs Leg |
imed_mco | ~ MCO - Import des Med |
ipo | ~ MCO - Import des PO |
iano_mco | ~ MCO - Import des Anohosp |
Source : pmeasyr-book
4.2 Noyau pmeasyr
Comme les différents paramètres permettant à pmeasyr
de réaliser l’import (et en particulier de retrouver le bon fichier zipper sur le disque) sont réutilisés plusieurs fois, nous pouvons créer un objet pmeasyr
destiné à stocker toutes ces informarions, appelé, noyau :
= 'path/to/your/data/folder'
path_data
<-pmeasyr::noyau_pmeasyr(finess = 750712184,
pannee = 2021,
mois = 8,
path = path_data,
tolower_names = TRUE)
4.3 Imports des RSA
Type | Import |
---|---|
1 | Light : Partie fixe |
2 | Light+ : Partie fixe + stream en ligne (+) actes et das |
3 | Light++ : Partie fixe + stream en ligne (++) actes, das, typaut um et dpdr des um |
4 | Standard : Partie fixe + creation des tables actes, das et rsa_um |
5 | Standard+ : Partie fixe + creation des tables actes, das et rsa_um + stream (+) |
6 | Standard++ : Partie fixe + creation des tables actes, das et rsa_um + stream (++) |
Source : pmeasyr-book
::adezip(p,
pmeasyrliste = c("rsa","tra"),
type = "out")
::irsa(p,
pmeasyrtypi = 4,
tolower_names = TRUE ) -> rsa21
4.4 Import des RUM
Type | Import |
---|---|
1 | XLight : Partie fixe |
2 | Light : Partie fixe + stream en ligne des actes, das et dad |
3 | Standard : Partie fixe + table actes, das, dad |
4 | Standard+ : Partie fixe + stream + table actes, das, dad |
Source : pmeasyr-book
::adezip(p,
pmeasyrliste = c("rss"),
type = "in")
<- pmeasyr::irum(p,
rum21typi = 4,
tolower_names = TRUE )
4.5 Import des fichiers TRA et ANO
Le fichier TRA est un fichier du out qui permet de relier les données anonymes du out aux données du in.
Il comprend un lien entre :
- clé rsa,
- numéro de rss,
- numéro de sejour (nas),
- date d’entrée
- date de sortie du séjour
L’import se fait en 2 parties : import du fichier avec la fonction itra
, ajout des colonnes dans la table des rsa inner_tra
.
Le fichier ANO contient les données de l’ANOHSP, on utilise ici les ano du out auquel il faut ajouter également les élements du TRA.
::itra(p) -> tra
pmeasyr::iano_mco(p) -> rsa_ano
pmeasyr
::inner_tra(rsa15$rsa, tra) -> rsa15$rsa
pmeasyr::inner_tra(rsa_ano, tra) -> rsa_ano pmeasyr
4.6 Table pmeasyr des formats
Les fonctions d’import de pmeasyr
utilisent les formats officiels défini par l’ATIH pour constituer les fichiers qui seront mis en entrées et sortie des logiciels développés par l’agence et qui permettront l’échange de données (formats officiels des données en entrée des logiciels permettant la transmission).
C’est format sont stockés dans le package sous la forme d’un table de format accèssible aux utilisateurs
::formats
pmeasyr
::formats %>% View() pmeasyr
La fonction View()
permet d’accéder à un visionneur de code
Liste des variables pour la table RSA en 2021
::formats %>% dplyr::filter(table == rsa, an == 21) pmeasyr
Le TRA dans les différents champs et les différentes années
Remarquez l’utilisation de la fonction dplyr::n()
qui permet de compter le nombre de ligne dans un dataframe
::formats %>% dplyr::filter(table == "tra") %>%
pmeasyr::group_by(champ,an) %>% dplyr::summarise(nb = dplyr::n() ) %>% View() dplyr
Nombre d’années disponibles pour chaucn des champs avec visablisation du noms des tables importables
Pour compter le nombre d’éléments distinct dans un vecteur, on utilise les fonctions length()
et unique()
.
#exemple length(unique(x))
= c(4,4,5,5,5,5,6,6,6)
x
length(x)
unique(x)
length(unique(x))
Mise en application pour compter le nombre d’années disponibles par champ et par table
::formats %>% dplyr::group_by(champ,table) %>%
pmeasyr::summarise(nb_annee = length(unique(an))) %>% View() dplyr
NB: on voit qu’un package peut contenir à la fois des fonctions et des jeux de données. C’est le cas ici avec la table formats
qui contient des données de parmatrage.
4.6.1 Récupérer des référentiels sur referime
Le package referime maintenu par Namik Taright alimente le serveur de référentiels du DIM de l’AP-HP. Il est à la base d’un webservice utilisé par différents entités de l’institution pour accéder aux référentiels PMSI. Il contient de nombreux fichiers de références utiles pour l’analyse des données PMSI.
Plus d’information sur l’intranet de l’AP-HP : referime.aphp.frr
4.6.2 Fichier descriptif des UMA sur referime
Le fichier AMURM est maintenu par le DIM du siège et comprend de nombreuses données utiles sur les UM. Dans sa forme actuelle il comprend également les UA qui sont le niveau en dessous de l’UMA. Dans la mesure où il peut y avoir plusieurs UA par UMA, il peut contenir plusieurs lignes pour une seule UMA.
library(referime)
<- referime::get_table("amurm_2021")
amurm21
View(amurm21)
4.6.2.1 DMS de la base nationale
La colonne anseqta
contient l’information sur l’année de version du tarif. Elle comprend :
- les séjours de l’année n à partir du 1er mars
- les séjours de l’année n+1 jusqu’au 28/29 février
#dms base nationales
<- referime::get_table("ghm_dms_nationales")
dms_nationales
View(dms_nationales)
Attention, par construction le calcul des dms sur la base nationale ne peut être en cours d’année, pour l’année en cours on se contente d’utiliser les dms calculées sur l’année précédente. Pour cela on utilise la fonction dplyr::bind_rows
qui permet de concaténer des dataframes par lignes (sont équivalant par colonne est dplyr::bind_cols
).
Exemple d’utilisation de
#Exemple de fusion de 2 jeux de données qui n'ont pas les mêmes colonnes
::bind_rows(
dplyr
%>% dplyr::filter( anseqta=="2020", !is.na(ghm) ) %>%
dms_nationales ::select( anseqta, dms_n, ghm ),
dplyr
%>% dplyr::filter( anseqta=="2020", !is.na(ghs), ghs!="" ) %>%
dms_nationales ::select( anseqta, dms_n, ghs )
dplyr
-> test
)
test
%>% dplyr::filter(!is.na(ghm))
test
%>% dplyr::filter(!is.na(ghs)) test
Application pour créer une table de référentiel base nationale complète.
#2021 pas encore présente dans le fichier, on utilise 2020
<- dms_nationales %>% dplyr::filter(anseqta=="2020") %>%
dms_nationales::mutate(anseqta = "2021") %>%
dplyr::bind_rows(dms_nationales,.) dplyr
NB : les fonctions dplyr
sont plus souples que les fonctions natives de R et elles tolèrent que les 2 dataframes n’aient pas exactement le même nombre de colonnes. Dans ce cas, elles créent des colonnes vides pour les colones qui pouraient manquer dans l’un des 2 dataframe.
4.6.2.2 Autres références utiles
#Actes CCAM : icr, actes chriurgicaux
<- referime::get_table("ccam_icr") %>% filter(activite == 1)
icr <- referime::get_table("ccam_regroupement") %>% filter(activite == 1, regroupement == "ADC")
rgp <- rgp %>% select(code) %>% inner_join(icr, by = c("code"))
acte_chir <- referime::get_table("cim") %>%
cim ::distinct(code,.keep_all = TRUE) %>%
dplyr::select(code,lib_court)
dplyr#Regroupements GHM
<- referime::get_table('ghm_ghm_regroupement') regroupement
4.7 Création d’une table contenant la plus part des informations utiles
Les données du in et out GENRSA ont chacune leur utilité, mais elles sont en partie redondantes. Afin de mieux s’y retrouver nous vous proposons de créer une table pivot constutée par la jointure de plusieurs tables et qui contiendra les principales données utiles pour l’analyse de l’activité.
Quelques détails sur les foncitons de jointure
::left_join ?dplyr
Nous utilsons les fonctions de jointure pour fusionner les tables ano, rsa, rum et amurm sans déclarer les colonnes qui permettront la jointure dans le by
.
<- rsa_ano %>% dplyr::select(nas,cle_rsa,dtent,dtsort,factam, pbcmu, motnofact, typecont ) %>%
data21 ::inner_join( .,
dplyr$rsa %>% dplyr::select(cle_rsa,noseqrum,anseqta,ansor,moissor,ghm,noghs,sexe,agean,
rsa21
agejr,echpmsi,prov,schpmsi,dest,nbrum,duree)) <- data21 %>%
data21 ::left_join( .,
dplyr$rum ) rum21
Danslce fichier amurm
les UMA entité juridique sont dénommées uma_ej
alors que dans le nom de cette variable importée avec pmeasyr
est cdurm
. On change le nom de la variable avant la fusion des tables.
Par ailleurs comme on souhaite une seule ligne par UMA on procède à un déboulonnage. On utilise ici la fonction dplyr::distinct
%>% dplyr::rename(cdurm = uma_ej) %>%
amurm21 View()
Ecrite comme cela l’ensemble des colonnes de la table sont supprimées. On ajoute .keep_all = T
%>% dplyr::rename(cdurm = uma_ej) %>%
amurm21 ::distinct(cdurm,.keep_all = T) %>%
dplyrView()
On utilise cette nouvelle table dans la jointure, en ne slectionnant que les colonnes qui nous interessent
<- data21 %>%
data21 ::left_join( .,
dplyr%>% dplyr::rename(cdurm = uma_ej) %>%
amurm21 ::distinct(cdurm,.keep_all = T) %>%
dplyr::select( gh, cdurm, typaut, mode_hospit, nohop,
dplyr lib_hop,lib_cc9_uma,spe_uma,lib_spe_uma) )
Ajout des dms dans la base nationale : Attention jointure complexe car les dms de la base nationale sont préférentiellement calculées au niveau GHS mais dans certain cas également au niveau GHM (soins pallialits par exemple). Enfin les DMS ne sont pas calculées pour tous les GHM (séances par exemple). Au final on procède en 3 étapes :
- table intermédaire 1 résultat de l’appariement des rum avec la table de référence sur le GHM
- table intermédaire 2 résultat de l’appariement des rum avec la table de référence sur le GHS
- ajout des séjours n’appartenant à aucune des 2 tables ci dessus
#ajout d'une indicatrice pour repréer les lignes de la table iniatale
<- data21 %>% dplyr::mutate(id = 1:nrow(data21))
data21
#Merge rsa, dms pour les cas ou la référence dans ghm_dms_nationales = ghm
<- dplyr::inner_join(data21 %>% dplyr::rename(ghs = noghs),
data21_dms1%>% dplyr::filter(ghs!="", !is.na(ghs)) %>% dplyr::distinct(anseqta,ghs,.keep_all = T)
dms_nationales
)
#Merge rsa, dms pour les cas ou la référence dans ghm_dms_nationales = ghm
<-inner_join(data21%>%rename(ghs = noghs),
data21_dms2%>%filter(ghs=="") %>% dplyr::select(-ghs) %>% dplyr::distinct(anseqta,ghm,.keep_all = T) )
dms_nationales
<- dplyr::bind_rows(data21_dms1,data21_dms2)
data21_2 <- dplyr::bind_rows(data21_2, data21 %>% dplyr::filter(! id %in% c(data21_dms1$id,data21_dms2$id) ) )
data21
rm(data21_dms1,data21_dms2,data21_2)
Au final le dataframe data21
contient une ligne par RUM. Il comprend également des données utiles retrouvées dans la table de description des UMA, de l’ANO et des RSA. Il peut être utiliser pour réaliser de nombreux calcul utiles comme nous allons le voir dans les chapitres suivants.