knitr::opts_chunk$set(message = FALSE,
                      warning = FALSE)
library(readr)
library(dplyr)
## 
## Attachement du package : 'dplyr'
## Les objets suivants sont masqués depuis 'package:stats':
## 
##     filter, lag
## Les objets suivants sont masqués depuis 'package:base':
## 
##     intersect, setdiff, setequal, union
library(prettyR)

I. Introduction

Ce devoir porte sur une étude observationnelle réalisée en unité de soins intensifs. La technique de réanimation (pose d’une sonde de Swan Ganz, ou Right Heart Catheterization (RHC)) est une procédure de diagnostic dans laquelle un cathéter est inséré dans une veine centrale et avancé vers l’artère pulmonaire pour mesurer les pressions de l’oreillette droite, du ventricule droit et de l’artère pulmonaire, estimer le débit cardiaque, identifier les shunts intracardiaques et mesurer la résistance vasculaire pulmonaire. Les mesures hémodynamiques peuvent permettre une meilleure compréhension de la physiopathologie de l’insuffisance cardiaque et de l’hypertension pulmonaire, mais leur évaluation appropriée et leur utilisation optimale peuvent s’avérer difficiles en raison des différences dans les techniques pouvant conduire à des différences dans les conclusions et les stratégies de prise en charge thérapeutique. L’étude est tirée de Connors et al. (1996): The effectiveness of RHC in the initial care of critically ill patients. J American Medical Association 276:889-897

II. Objectif

La question sous-jacente est de savoir si une technique de réanimation (pose d’une sonde de Swan-Ganz, ou Right Heart Catheterization (RHC)) est réellement efficace ou pas, en d’autres termes, le gain théorique que cette technique est sensé apporté est-il supérieur aux conséquences potentiellement délétères de ce geste ?

Pour analyse le critère de jugement qui est la survenue de décès à 30 jours, nous allons utiliser un modèle à effet aléatoire sur les données appariées. Nous effectuerons une analyse de sensibilité en utilisant un modèle de régression logistique sur les données non appariées en ajustant sur le score de propension. Le score de propension sera estimé à l’aide d’une régression logistique, les variables à utiliser pour son estimation seront les facteurs pronostics de la pose de sonde de Swan-Ganz et les facteurs de confusion entre la pose de sonde de Swan-Ganz et la survenue de décès à 30 jours.

III. Analyse statistique et résultats.

1. Data management et description des données.

  • Data management

La plupart des variables catégorielles de la base de données sont très bien codées et ne présentent pas de données manquantes.Cependant la variable CAT2 contient 4535 données en moins soit 79%. Certaines variables quantitatives présentent des incohérences. On trouve des patients avec un poids nul (chez 515 patients), des scores de Glasgow allant de 0 à 100. La variable URIN1 qui représente la quantité d’urine contient 3028 données manquantes soit 52,7%, la variable ADL30 contient 75% de données manquantes. Une imputation par la moyenne ou la médiane a été effectuée pour les variables quantitatives qui présentent moins de 50% de données manquantes, celles qui ont plus de 70% de données manquantes n’ont pas été inclus dans l’analyse multivariées. Les poids nuls ont été replacés par le poids moyen.

setwd(dir="C:/Users/LP-10-ALERRT-05/Desktop/M2_MSB/Devoir_epidemio")


# Lecture de la base de données
epi_data <-read.csv2("epi_data.csv",stringsAsFactors = FALSE)

# Recodage de certaines variables
epi_data<-mutate(epi_data, 
                 CARDIOHX=factor(CARDIOHX,levels = c(0,1),labels = c("NON","OUI")),
                 CHFHX=factor(CHFHX,levels = c(0,1),labels = c("NON","OUI")),
                 DEMENTHX=factor(DEMENTHX,levels = c(0,1),labels = c("NON","OUI")),
                 PSYCHHX=factor(PSYCHHX,levels = c(0,1),labels = c("NON","OUI")),
                 CHRPULHX=factor(CHRPULHX,levels = c(0,1),labels = c("NON","OUI")),
                 RENALHX=factor(RENALHX,levels = c(0,1),labels = c("NON","OUI")),
                 LIVERHX=factor(LIVERHX,levels = c(0,1),labels = c("NON","OUI")),
                 GIBLEDHX=factor(GIBLEDHX,levels = c(0,1),labels = c("NON","OUI")),
                 MALIGHX=factor(MALIGHX,levels = c(0,1),labels = c("NON","OUI")),
                 IMMUNHX=factor(IMMUNHX,levels = c(0,1),labels = c("NON","OUI")),
                 TRANSHX=factor(TRANSHX,levels = c(0,1),labels = c("NON","OUI")),
                 AMIHX=factor(AMIHX,levels = c(0,1),labels = c("NON","OUI")),
                 ADLD3P= as.numeric(ADLD3P),
                 SWANG1= factor(SWANG1),
                 NEURO=factor(NEURO,levels = c("Yes","No"),labels=c("OUI","NON")),
                 RENAL=factor(RENAL,levels = c("Yes","No"),labels=c("OUI","NON")),
                 META=factor(META,levels = c("Yes","No"),labels=c("OUI","NON")),
                 HEMA=factor(HEMA,levels = c("Yes","No"),labels=c("OUI","NON")),
                 SEPS=factor(SEPS,levels = c("Yes","No"),labels=c("OUI","NON")),
                 TRAUMA=factor(TRAUMA,levels = c("Yes","No"),labels=c("OUI","NON")),
                 ORTHO=factor(ORTHO,levels = c("Yes","No"),labels=c("OUI","NON")),
                 DEATH=factor(DEATH,levels = c("Yes","No"),labels=c("OUI","NON")),
                 DTH30=factor(DTH30,levels = c("Yes","No"),labels=c("OUI","NON")),
                 RESP=factor(RESP,levels = c("Yes","No"),labels=c("OUI","NON")),
                 CARD=factor(CARD,levels = c("Yes","No"),labels=c("OUI","NON")),
                 GASTR=factor(GASTR,levels = c("Yes","No"),labels=c("OUI","NON")),
                 DNR1=factor(DNR1,levels = c("Yes","No"),labels=c("OUI","NON")))


epi_data$SWANG1 <- relevel(epi_data$SWANG1, ref = "RHC")

 
# Détection de données manquantes et aberrantes
#describe(epi_data,num.desc=c("min","max","mean","median","var","sd","valid.n"))

# Certains individus ont un poids nul (515)
#sum(epi_data$WTKILO1==0)

# Remplacement des poids nuls par la moyenne des poids.
epi_data$WTKILO1 <-ifelse(epi_data$WTKILO1==0,mean(epi_data$WTKILO1),epi_data$WTKILO1)

# Imputation des données aberrantes par la moyenne (Albumine =29).
epi_data$ALB1 <-ifelse(epi_data$ALB1 == 29,mean(epi_data$ALB1, na.rm = T),epi_data$ALB1)

# Imputation des donnees manquantes par la moyenne (Urine)
epi_data$URIN1 <-ifelse(is.na(epi_data$URIN1) == T,mean(epi_data$URIN1, na.rm = T),epi_data$URIN1)

# Imputation des donnees manquantes par la moyenne (ADLD3P)
epi_data$ADLD3P <-ifelse(is.na(epi_data$ADLD3P) == T,mean(epi_data$ADLD3P, na.rm = T),epi_data$ADLD3P)
  • Description des données

Parmi les 5735 patients inclus dans l’étude 2184 (38%) ont subi une pose de sonde de Swan-Ganz. Il y avait 3192 (56%) hommes et 2543 (44%) femmes, avec un âge médian de 64 ans [50-73]. 4460 (78%) participants étaient blancs, 920 (16 %) étaient noirs et 355 (6,2 %) appartenaient à une autre origine ethnique. Au bout de 30 jours de suivie il avait 1918 décès dont 830 (43,3%) dans le groupe traité contre 1088 (56,7%) dans le groupe contrôle(tableau 2). le tableau 1 résume quelques caractéristiques des participants à cette étude.

# Description des donnes (données démographiques)
library(gtsummary)
epi_data %>%
  dplyr::select(SWANG1, AGE,SEX,RACE,EDU,INCOME,NINSCLAS,CA,RESP1,HRT1,TEMP1,SCOMA1,CREA1, MEANBP1,ALB1,PH1,
                APS1,PACO21,PAFI1,CAT1) %>%
  tbl_summary(by = SWANG1,
              label = list(AGE ~ "Age",SEX ~ "Sexe", CA ~ "Cancer",NINSCLAS~"Assurance médicale",
                           TEMP1~ "Temperature,°C",SCOMA1~"Score de glasgow",
                           CREA1~"Creatinine, µ/L (mg/dL)",MEANBP1~"Pression arterielle, mm Hg",
                           ALB1~"Albumine, g/L", EDU~"Education", PH1~"pH", 
                           INCOME~"Revenu",PACO21~"PaCo2, mm Hg",CAT1~"Disease category", 
                           PAFI1~"PaO2/FIO2 ratio, mm Hg", APS1~"Score APACHE",
                           RESP1~"Respiratory rate, breaths/min",
                           HRT1~"Heart rate, beats/mln"),
              missing = "no") %>%
  add_p() %>%
  add_overall(col_label = "Ech. total") %>%
  modify_header(label = "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Right Heart Catheterization (RHC)**") %>% 
  as_gt() %>%
  gt::tab_header( 
    title = gt::md(""),
    subtitle = gt::md("Table 1. Caracterisques des 5735 participants"))
Table 1. Caracterisques des 5735 participants
Variable Right Heart Catheterization (RHC) p-value2
Ech. total1 RHC, N = 2,1841 No RHC, N = 3,5511
Age 64 (50, 74) 64 (50, 73) 65 (50, 75) 0.003
Sexe


<0.001
    Female 2,543 (44%) 906 (41%) 1,637 (46%)
    Male 3,192 (56%) 1,278 (59%) 1,914 (54%)
RACE


0.4
    black 920 (16%) 335 (15%) 585 (16%)
    other 355 (6.2%) 142 (6.5%) 213 (6.0%)
    white 4,460 (78%) 1,707 (78%) 2,753 (78%)
Education 12.0 (10.0, 13.0) 12.0 (10.0, 14.0) 12.0 (10.0, 13.0) <0.001
Revenu


<0.001
    $11-$25k 1,165 (20%) 452 (21%) 713 (20%)
    $25-$50k 893 (16%) 393 (18%) 500 (14%)
    > $50k 451 (7.9%) 194 (8.9%) 257 (7.2%)
    Under $11k 3,226 (56%) 1,145 (52%) 2,081 (59%)
Assurance médicale


<0.001
    Medicaid 647 (11%) 193 (8.8%) 454 (13%)
    Medicare 1,458 (25%) 511 (23%) 947 (27%)
    Medicare & Medicaid 374 (6.5%) 123 (5.6%) 251 (7.1%)
    No insurance 322 (5.6%) 136 (6.2%) 186 (5.2%)
    Private 1,698 (30%) 731 (33%) 967 (27%)
    Private & Medicare 1,236 (22%) 490 (22%) 746 (21%)
Cancer


<0.001
    Metastatic 384 (6.7%) 123 (5.6%) 261 (7.4%)
    No 4,379 (76%) 1,727 (79%) 2,652 (75%)
    Yes 972 (17%) 334 (15%) 638 (18%)
Respiratory rate, breaths/min 30 (14, 38) 28 (12, 37) 30 (20, 39) <0.001
Heart rate, beats/mln 124 (97, 141) 125 (105, 145) 120 (76, 140) <0.001
Temperature,°C 38.09 (36.09, 39.00) 38.09 (36.09, 39.00) 38.09 (36.20, 39.00) 0.8
Score de glasgow 0 (0, 41) 0 (0, 37) 0 (0, 41) <0.001
Creatinine, µ/L (mg/dL) 1.50 (1.00, 2.40) 1.80 (1.20, 3.00) 1.30 (0.90, 2.00) <0.001
Pression arterielle, mm Hg 63 (50, 115) 57 (47, 73) 68 (53, 119) <0.001
Albumine, g/L 3.50 (2.60, 3.50) 3.50 (2.40, 3.50) 3.50 (2.70, 3.50) <0.001
pH 7.40 (7.34, 7.46) 7.40 (7.32, 7.46) 7.40 (7.35, 7.46) <0.001
Score APACHE 54 (41, 67) 60 (47, 74) 50 (38, 62) <0.001
PaCo2, mm Hg 37 (31, 42) 36 (30, 40) 38 (32, 44) <0.001
PaO2/FIO2 ratio, mm Hg 203 (133, 317) 168 (110, 267) 224 (149, 333) <0.001
Disease category


<0.001
    ARF 2,490 (43%) 909 (42%) 1,581 (45%)
    CHF 456 (8.0%) 209 (9.6%) 247 (7.0%)
    MOSF 1,626 (28%) 858 (39%) 768 (22%)
    Other 1,163 (20%) 208 (9.5%) 955 (27%)
1 Median (IQR); n (%)
2 Wilcoxon rank sum test; Pearson’s Chi-squared test
# Description de la suivie à 30 jours ( Données non appariées)
library(gtsummary)
epi_data %>%
  dplyr::select(SWANG1, DTH30 ) %>%
  tbl_summary(by = SWANG1,
              label = list(DTH30 ~ "Décès à 30 jours"),
              missing = "no") %>%
  add_p() %>%
  add_overall(col_label = "Ech. total") %>%
  modify_header(label = "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Right Heart Catheterization ( RHC)**") %>% 
  as_gt() %>%
  gt::tab_header( 
    title = gt::md(""),
    subtitle = gt::md("Table 2. Survenue de décès à 30 jours (5735 participants)"))
Table 2. Survenue de décès à 30 jours (5735 participants)
Variable Right Heart Catheterization ( RHC) p-value2
Ech. total1 RHC, N = 2,1841 No RHC, N = 3,5511
Décès à 30 jours


<0.001
    OUI 1,918 (33%) 830 (38%) 1,088 (31%)
    NON 3,817 (67%) 1,354 (62%) 2,463 (69%)
1 n (%)
2 Pearson’s Chi-squared test

2. Construction du score de propension

Nous avons utilisé une régression logistique avec la pose de sonde de Swan-Ganz comme variable dépendante.

# Recherche des facteurs de confusions
#library(gtsummary)
#epi_data %>%
  #select(-DTH30) %>%
  #tbl_summary(by = SWANG1)%>%
  #add_p()

# Recherche de facteurs de confusion

#epi_data %>%
  #select(-SWANG1) %>%
  #tbl_summary(by = DTH30)%>%
  #add_p()

# Récupération des variables à inclure dans l'estimation du score de propension
list_pscore <-c("SWANG1","AGE","SEX","RACE","EDU","INCOME","NINSCLAS","CAT1","CAT2",
                "RESP","CARD","NEURO","GASTR","RENAL","HEMA","SEPS","TRAUMA","DNR1","CA",
                "ADLD3P","DAS2D3PC","SURV2MD1","APS1","SCOMA1","WTKILO1","TEMP1",
                "MEANBP1","RESP1","HRT1","PAFI1","PACO21","PH1","WBLC1","HEMA1","SOD1",
                "POT1","CREA1","BILI1","ALB1","URIN1","CARDIOHX","CHFHX","LIVERHX",
                "GIBLEDHX","MALIGHX","IMMUNHX","TRANSHX","AMIHX")

pscore_data <- epi_data[,list_pscore]

On avons effectué des analyses univariées pour mettre en évidence les facteurs de confusions potentiels entre la pose de sonde de Swan-Ganz et la survenue de décès à 30 jours. Les variables retenus pour l’estimation du score de propension sont les suivantes: l’age, le sexe, la race, le nombre d’années d’étude,le score de Glasgow, le poids, la température, la pression artérielle, le rythme cardiaque, le rapport \(Pa0_2/FI0_2\), le pH, les différentes catégories de diagnostique d’admission, les différents antécédent de comorbidité.

# Estimation du score de propension
ps.logit <- glm(SWANG1~.,
                family = binomial(link="logit"),data=pscore_data)


# Récupération du score de propension dans la base de donnée
epi_data$pscore <- ps.logit$fitted

# Description du score de propension avant appariement(tableau)
library(gtsummary)
epi_data %>%
  select(pscore,SWANG1) %>%
  tbl_summary(by = SWANG1,
              type = pscore ~ "continuous2",
              label = list(pscore ~ "Score de propension"),
              statistic = list(pscore ~ c("{mean} ({sd})")),
              missing = "no")  %>%
  add_p() %>%
  modify_header(label = "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Right Heart Catheterization ( RHC)**") %>% 
  as_gt() %>%
  gt::tab_header( 
    title = gt::md(""),
    subtitle = gt::md("Table 3. Description du score de propension estimé avant l'appariement"))
Table 3. Description du score de propension estimé avant l’appariement
Variable Right Heart Catheterization ( RHC) p-value1
RHC, N = 2,184 No RHC, N = 3,551
Score de propension

<0.001
    Mean (SD) 0.46 (0.22) 0.72 (0.21)
1 Wilcoxon rank sum test

Les scores de propension estimés sont significativement différents dans les deux groupes, dans le groupe traité nous avons une moyenne de 0.46 (SD 0.22) contre 0.72 (SD 0.21) dans le groupe non traité (p<0,01). Nous effectuerons un appariement sur le score de propension.

3. Appariement sur le score de propension

L’appariement a été effectué l’aide de la fonction Match de la librairie Matching. Nous avons effectué un appariement un pour un sans remise avec un capiler de 0,03.

# Appariement sur le score de propension
library(Matching)
Yr <- epi_data$DEATH30
Trai <- ifelse(epi_data$SWANG1=="No RHC",FALSE,TRUE)
# matching sans remise et appariement sur score de propension
Match.out <- Matching::Match(Y = Yr, Tr = Trai,estimand="ATT",M=1, # nombre de voisins
                   replace = FALSE, # avec remise
                   ties = TRUE, # prise en compte
                   # des voisins similaires
                   caliper = 0.03, # caliper à 0.15 écart-type
                   # du score de propension
                   ## déclaration des variables utilisées pour
                   ## l'appariement exact ou non
                   X = epi_data$pscore,exact = "FALSE")

#  Description de l'appariement.
library(cobalt)
balMatch <- bal.tab(x=Match.out,
                   formula = SWANG1 ~ pscore + AGE  + SEX +SCOMA1+RACE+EDU+INCOME,
                   data = epi_data,un = TRUE,disp.v.ratio = TRUE)

# Mise en forme des résultats de appariement
knitr::kable(balMatch$Observations, 
             caption = "Description de l'appariement ")
Description de l’appariement
RHC No RHC
All (ESS) 2184 3551
All (Unweighted) 2184 3551
Matched (ESS) 1530 1530
Matched (Unweighted) 1530 1530
Unmatched 0 2021
Discarded 654 0

L’appariement a conduit à l’obtention de 1530 paires de patients appariés, ce qui constitue un échantillon de 3064 patients.

4. Vérification de l’équilibre entre les groupe après appariement.

La plupart des variables présentent, après appariement, de faibles différences standardisées de moyennes alors qu’elles étaient beaucoup plus élevées avant appariement.

# Mise en forme des résultats de différences standardisées
knitr::kable(balMatch$Balance, 
             caption = "Différences standardisées et ratios de variance avant/après appariement")
Différences standardisées et ratios de variance avant/après appariement
Type Diff.Un V.Ratio.Un Diff.Adj V.Ratio.Adj
pscore Contin. 1.2421870 0.8839094 -0.0001513 1.000947
AGE Contin. 0.0584862 1.2232533 0.0023437 1.190566
SEX_Male Binary -0.0461617 NA -0.0058824 NA
SCOMA1 Contin. 0.1045378 1.2320857 0.0076247 1.007265
RACE_black Binary 0.0113540 NA 0.0019608 NA
RACE_other Binary -0.0050352 NA -0.0032680 NA
RACE_white Binary -0.0063188 NA 0.0013072 NA
EDU Contin. -0.0917043 0.9854906 0.0113714 1.004576
INCOME_$11-$25k Binary -0.0061712 NA 0.0084967 NA
INCOME_$25-$50k Binary -0.0391396 NA -0.0098039 NA
INCOME_> $50k Binary -0.0164539 NA 0.0045752 NA
INCOME_Under $11k Binary 0.0617647 NA -0.0032680 NA
# Graphique des différences de moyennes (standardisées) et de proportions

#love.plot(x = balMatch,stat = "mean.diffs",abs = TRUE,
## options graphiques
##var.order = "unadjusted",
##threshold = 0.2,
##shape = 23)

Le Graphique (Figure 1) représente les distributions du score de propension estimé avant et après appariement (respectivement à gauche et à droite). Avant appariement, le support commun semble assez large, mais le graphique fait apparaître que des unités traitées ayant un fort score de propension peuvent ne pas être appariées à cause du faible nombre d’unités du groupe de contrôle proches. En effet, l’utilisation du caliper conduit ainsi à ne pas conserver toutes les unités traitées après l’appariement, comme nous l’avons d’ailleurs constaté précédemment lors de la présentation des résultats de la fonction bal.tab. Après appariement, la distribution du score de propension dans le groupe traité et non traité est similaire, ce qui reflète que les unités traitées ont effectivement été appariées avec des unités non traitées présentant un score de propension proche.

# Densité du score de propension avant et après appariement
# Les deux variables utilisées pour l'appariement sont déclarées dans formule
bal.plot(x = Match.out,formula = SWANG1~ pscore+AGE+ SEX, data = epi_data,
         var.name = "pscore",which = "both")
Distributions du score de propension estimé avant et après appariement

Distributions du score de propension estimé avant et après appariement

5. Analyse du critère de jugement

# Récupération des données après appariement
match.gn.data <- rbind(epi_data[Match.out$index.treated,],epi_data[Match.out$index.control,])
match.gn.data <- cbind(match.gn.data, weights=c(Match.out$weights, Match.out$weights))

match.gn.data <- cbind(match.gn.data, matchid=c(1:length(Match.out$index.treated),
                                                1:length(Match.out$index.control)))

# Récodage du score de propension en décile
match.gn.data$pscore_decile <-ifelse(match.gn.data$pscore<0.1,1,
                                     ifelse(match.gn.data$pscore<0.2,2,
                                            ifelse(match.gn.data$pscore<0.3,3,
                                            ifelse(match.gn.data$pscore<0.4,4,
                                            ifelse(match.gn.data$pscore<0.5,5,
                                            ifelse(match.gn.data$pscore<0.6,6,
                                            ifelse(match.gn.data$pscore<0.7,7,
                                            ifelse(match.gn.data$pscore<0.8,8,
                                            ifelse(match.gn.data$pscore<0.9,9,10)))))))))

# Récodage du score de propension en classe décile
# match.gn.data$pscore_decile_cat <-cut(match.gn.data$pscore,0:0.1:0.1)





# Caractéristiques des participants après appariement (3060 participants)
library(gtsummary)
match.gn.data%>%
  dplyr::select(SWANG1,pscore, AGE,SEX,RACE,EDU,INCOME,NINSCLAS,CA,TEMP1,SCOMA1,CREA1, MEANBP1,
                ALB1,PH1,PACO21,PAFI1) %>%
  tbl_summary(by = SWANG1,
              label = list(AGE ~ "Age",SEX ~ "Sexe", CA ~"Cancer",NINSCLAS~"Medical insurance",
                           TEMP1~ "Temperature,°C",SCOMA1~"Score de glasgow",CREA1~"Creatinine, µ/L (mg/dL)",
                           MEANBP1~"Pression arterielle, mm Hg",ALB1~"Albumine, g/L",EDU~"Education",
                           PH1~"pH",PACO21~"PaCo2, mmHg", PAFI1~"PaO2/FIO2 ratio, mm Hg", pscore~"Score de propension"),
              missing = "no") %>%
  add_p() %>%
  add_overall(col_label = "Ech. total") %>%
  modify_header(label = "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Right Heart Catheterization (RHC)**") %>% 
  as_gt() %>%
  gt::tab_header( 
    title = gt::md(""),
    subtitle = gt::md("Table 6. Caracterisques des 3060 patients appariés (données appariées)"))
Table 6. Caracterisques des 3060 patients appariés (données appariées)
Variable Right Heart Catheterization (RHC) p-value2
Ech. total1 RHC, N = 1,5301 No RHC, N = 1,5301
Score de propension 0.55 (0.42, 0.69) 0.55 (0.42, 0.69) 0.55 (0.42, 0.69) >0.9
Age 63 (49, 73) 63 (50, 73) 63 (49, 74) 0.7
Sexe


0.7
    Female 1,347 (44%) 669 (44%) 678 (44%)
    Male 1,713 (56%) 861 (56%) 852 (56%)
RACE


>0.9
    black 483 (16%) 240 (16%) 243 (16%)
    other 191 (6.2%) 98 (6.4%) 93 (6.1%)
    white 2,386 (78%) 1,192 (78%) 1,194 (78%)
Education 12.00 (10.00, 13.61) 12.00 (10.00, 14.00) 12.00 (10.00, 13.61) 0.7
INCOME


0.8
    $11-$25k 641 (21%) 314 (21%) 327 (21%)
    $25-$50k 487 (16%) 251 (16%) 236 (15%)
    > $50k 257 (8.4%) 125 (8.2%) 132 (8.6%)
    Under $11k 1,675 (55%) 840 (55%) 835 (55%)
Medical insurance


>0.9
    Medicaid 308 (10%) 151 (9.9%) 157 (10%)
    Medicare 722 (24%) 362 (24%) 360 (24%)
    Medicare & Medicaid 192 (6.3%) 96 (6.3%) 96 (6.3%)
    No insurance 183 (6.0%) 86 (5.6%) 97 (6.3%)
    Private 960 (31%) 482 (32%) 478 (31%)
    Private & Medicare 695 (23%) 353 (23%) 342 (22%)
Cancer


0.7
    Metastatic 190 (6.2%) 94 (6.1%) 96 (6.3%)
    No 2,354 (77%) 1,169 (76%) 1,185 (77%)
    Yes 516 (17%) 267 (17%) 249 (16%)
Temperature,°C 38.20 (36.09, 39.00) 38.09 (36.09, 39.00) 38.20 (36.09, 39.09) 0.4
Score de glasgow 0 (0, 37) 0 (0, 37) 0 (0, 37) 0.5
Creatinine, µ/L (mg/dL) 1.60 (1.10, 2.60) 1.70 (1.10, 2.60) 1.50 (1.00, 2.40) 0.001
Pression arterielle, mm Hg 60 (48, 105) 60 (49, 103) 60 (48, 108) 0.4
Albumine, g/L 3.50 (2.50, 3.50) 3.50 (2.50, 3.50) 3.40 (2.50, 3.50) 0.4
pH 7.40 (7.34, 7.46) 7.40 (7.34, 7.46) 7.40 (7.34, 7.46) 0.8
PaCo2, mmHg 36 (31, 41) 36 (31, 41) 37 (31, 41) 0.2
PaO2/FIO2 ratio, mm Hg 191 (127, 300) 194 (127, 303) 188 (127, 296) 0.6
1 Median (IQR); n (%)
2 Wilcoxon rank sum test; Pearson’s Chi-squared test

Apres l’appariement sur le score de propension certaines variables qui étaient associée à l’usage de la pose de sonde de Swna-Ganz ne le sont plus, ainsi on pourra mieux contrôler les biais de sélection inhérents à cette étude.

les scores de propension sont égaux (en moyenne) dans les deux groupes.

# Description de la suivie des participants à 30 jours sur les données appariées (3246 participants)
library(gtsummary)
match.gn.data %>%
  dplyr::select(SWANG1, DTH30 )%>%
  tbl_summary(by = SWANG1,
              label = list(DTH30 ~ "Décès à 30 jours"),
              missing = "no") %>%
  add_p() %>%
  add_overall(col_label = "Ech. total") %>%
  modify_header(label = "**Variable**") %>%
  modify_spanning_header(all_stat_cols() ~ "**Right Heart Catheterization ( RHC)**") %>% 
  as_gt() %>%
  gt::tab_header( 
    title = gt::md(""),
    subtitle = gt::md("Table 7. Survenue de décès à 30 jours (3060 patients appariés)"))
Table 7. Survenue de décès à 30 jours (3060 patients appariés)
Variable Right Heart Catheterization ( RHC) p-value2
Ech. total1 RHC, N = 1,5301 No RHC, N = 1,5301
Décès à 30 jours


<0.001
    OUI 1,032 (34%) 571 (37%) 461 (30%)
    NON 2,028 (66%) 959 (63%) 1,069 (70%)
1 n (%)
2 Pearson’s Chi-squared test
  • Analyse de l’échantillon apparies

L’appariement sur le score de propension peut induire un certain degré de corrélation entre les sujets appartenant à la même paire, ce qui peut influencer l’estimation de la variance de l’effet du traitement.(Gayat and Porcher 2012). Pour analyser le critère de jugement nous avons utilisé un modèle à effet aléatoire.

Dans la base de données, après appariement, nous avons la variable matched qui représente le numéro de chaque paire d’individus appariés, l’effet aléatoire a été portée sur cette variable.

# Mise en oeuvre du modèle à effet aléatoire
library(lme4)
mglmm <- glmer(DTH30 ~ SWANG1 + pscore_decile + (1|matchid),
               data = match.gn.data, family = binomial)

# Mise en forme des résultats du modèle
mglmm %>%
  tbl_regression(exponentiate = TRUE, 
                 label = list(pscore_decile ~ "Score de propension",
                              SWANG1 ~ "Right Heart Catheterization (RHC)" )) %>%
  modify_header(label = "**Variable**") %>%
  as_gt() %>%
  gt::tab_header( 
    title = gt::md(""),
    subtitle = gt::md("Table 8. Estimation du modèle à effet aleatoire"))
Table 8. Estimation du modèle à effet aleatoire
Variable OR1 95% CI1 p-value
Right Heart Catheterization (RHC)


    RHC
    No RHC 1.38 1.19, 1.61 <0.001
Score de propension 1.05 1.01, 1.09 0.017
1 OR = Odds Ratio, CI = Confidence Interval
  • Analyse de sensibilité

L’analyse de sensibilité a portée sur les données non appariées, nous avons utilisé un modèle de régression logistique multivariée. Nous avons ajuste sur le score de propension, il faut cependant s’assurer de la linéarité du score de propension avec les logit de la survenue de décès à 30 jours.

# Modèle de régression logistique sur données originale
mod.reg <- glm(DTH30 ~ SWANG1+ pscore ,data =epi_data ,family = binomial)


# Mise en forme des résultats du modèle  
mod.reg%>%
  tbl_regression(exponentiate = TRUE,
                 label = list(pscore ~ "Score de propension",
                              SWANG1 ~ "Right Heart Catheterization (RHC)" ))%>%
  modify_header(label = "**Variable**")%>%
  as_gt() %>%
  gt::tab_header( 
    title = gt::md(" "),
    subtitle = gt::md("Table 9. Estimation du modèle de régression logistique"))
Table 9. Estimation du modèle de régression logistique
Variable OR1 95% CI1 p-value
Right Heart Catheterization (RHC)


    RHC
    No RHC 1.31 1.15, 1.50 <0.001
Score de propension 1.23 0.95, 1.60 0.11
1 OR = Odds Ratio, CI = Confidence Interval

IV. Conclusion

L’analyse du critère de jugement montre que la pose de sonde de Swan-Ganz est significativement associé à une réduction du nombre de décès à 30 jours de 34% ( OR=1.34, IC95%[1.16 - 1.56], ce résultat est confirmé par l’analyse de sensibilité.