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)
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
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.
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)
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 | ||||
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.
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 ")
| 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.
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")
| 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
# 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 | ||||
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 | |||
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 | |||
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é.