Forest plot basés sur des modèles de régression

Table des matières

Introduction aux forest plots

Les graphiques en fôret, ou forest plots en anglais, sont des représentations graphiques, initialement employées pour visualiser les résultats de méta-analyses d’essais cliniques randomisés, puis de méta-analyses d’études observationnelles. Dans les deux cas, c’est-à-dire pour comparer les résultats issus de différentes études, mais portant sur le même sujet.

En voici un premier exemple :

D’après Moodie, L., Reeve, J., & Elkins, M. (2011). Inspiratory muscle training increases inspiratory muscle strength in patients weaning from mechanical ventilation: a systematic review. Journal of physiotherapy, 57(4), 213-221.

Il s’agit ici d’une méta-analyse concernant l’effet d’un entrainement des muscles respiratoires de sujets intubés, sur leur survie.

Règles de lecture des forest plots

Sur les forest plots de méta-analyse :

  • chaque ligne correspond à une étude
  • le symbole (ici carré ou losange) correspond à l’estimation du paramètre étudié (ici un risque relatif)
  • la taille du symbole est proportionnelle à la taille de l’échantillon de l’étude concernée
  • la barre verticale à la valeur du paramètre en absence d’effet (ici 1 car c’est un risque relatif)
  • les barres horizontales correspondent à l’intervalle de confiance du paramètre rapporté (ici le risque relatif)
  • si le symbole est à droite de la ligne verticale, cela signifie que le lien entre le traitement ( ici l’entrainement des muscles inspiratoires) et le critère de jugement (la survie ici) est positif
  • si le symbole est à gauche de la ligne verticale, cela signifie que le lien entre le traitement (ici l’entrainement des muscles inspiratoires) et le critère de jugement (ici la survie) est négatif
  • si la barre horizontale croise la barre verticale alors le lien n’est pas significatif
  • le losange représente le paramètre estimé à partir de l’ensemble des études.

Des versions améliorées sont aussi souvent présentées dans les publications, avec cote à cote la table de résultats et le graphique, comme ceci,  par exemple :

forest plot randomisez control trial

D’après : Shah, M. R., Hasselblad, V., Stevenson, L. W., Binanay, C., O’Connor, C. M., Sopko, G., & Califf, R. M. (2005). Impact of the pulmonary artery catheter in critically ill patients: meta-analysis of randomized clinical trials. Jama, 294(13), 1664-1670.

Il faut reconnaitre que cela est particulièrement efficace pour présenter les résultats !

Des forest plots pour les modèles de régression

À ce stade, vous allez, peut être,  penser que c’est très joli, mais que tout le monde ne fait pas de méta-analyse. C’est vrai !

Et si je vous parle de ces forest plots, c’est que depuis quelques années, ils sont aussi employés pour visualiser les résultats des modèles de régressions !

Et très récemment, j’ai découvert package incroyable qui permet justement de coupler table de résultats et forest plot, pour des modèles de régression linéaire multiple, des modèles de régression logistique multiple et modèles de Cox, et tout ça en une seule lignes de commandes !

Il s’agit du package forest model. Je vous montre un exemple avec les trois types de modèles de régression.

Forest plot basé sur un modèle de régression linéaire multiple

Pour illustrer cet exemple, j’utilise les données heart_disease du package funModeling. Pour obtenir plus d’information sur ce jeu de données,vous pouvez employer les commandes suivantes :

#install.packages("funModeling")
library(funModeling)
?heart_disease 

Je vais réaliser une régression linéaire multiple pour expliquer la variable resting_blood_pressure (pression artérielle au repos) en fonction des variables age, gender, serum_cholestoralmax_heart_rate , et has_heart_disease. Pour cela, au préalable, je réalise un subset des données heart_disease, en ne conservant que les variables citées précédemment :

library(tidyverse)

HD_short <- heart_disease %>% 
  select(resting_blood_pressure,age,gender,serum_cholestoral, max_heart_rate,has_heart_disease ) 

Puis, dans un second temps, je standardise les variables numériques explicatives, pour obtenir des coefficients (ou pentes partielles) du même ordre de grandeur (sinon cela pourrait rendre le forest plot moins lisible)

HD_short_sc <- HD_short %>% 
    mutate_at(c("age","serum_cholestoral", "max_heart_rate"), scale)

head(HD_short_sc)
##   resting_blood_pressure        age gender serum_cholestoral max_heart_rate
## 1                    145  0.9471596   male       -0.26446281     0.01716893
## 2                    160  1.3897030   male        0.75915934    -1.81889638
## 3                    120  1.3897030   male       -0.34171732    -0.90086373
## 4                    130 -1.9293722   male        0.06386882     1.63465503
## 5                    130 -1.4868288 female       -0.82455796     0.97891742
## 6                    120  0.1727088   male       -0.20652194     1.24121247
##   has_heart_disease
## 1                no
## 2               yes
## 3               yes
## 4                no
## 5                no
## 6                no 

Ensuite,  je réalise la régression sur les données standardisées :

mod1 <- lm(resting_blood_pressure ~ age + 
                gender + serum_cholestoral + max_heart_rate + has_heart_disease, data=HD_short_sc)

coefficients(summary(mod1))
##                         Estimate Std. Error    t value      Pr(>|t|)
## (Intercept)          130.8307106   1.818066 71.9614906 5.322806e-190
## age                    5.0234937   1.084272  4.6330576  5.398767e-06
## gendermale            -2.4185816   2.229203 -1.0849533  2.788222e-01
## serum_cholestoral      0.7902874   1.015505  0.7782213  4.370581e-01
## max_heart_rate         2.2640644   1.135801  1.9933637  4.713617e-02
## has_heart_diseaseyes   5.4569964   2.251465  2.4237533  1.595826e-02 

Et enfin, nous pouvons réaliser le forest plot :

library(forestmodel)
forest_model(mod1) 

Ainsi, nous pouvons voir ici que la pression artérielle au repos (resting_blood_pressure) est :

  • significativement et positivement liée à l’âge (plus l’âge est élevé plus la pression artérielle au repos est élevée)
  • significativement et positivement liée à la fréquence cardiaque maximale (max_heart_rate) (plus la fréquence cardiaque maximale est élevée, plus la pression artérielle au repos est également élevée)
  • significativement et positivement liée à la présence d’une pathologie cardiaque.

 

Bien qu’il soit sous la forme d’une table, le forest plot est un object de type ggplot. Cela signifie que vous pouvez l’enregistrer en jpeg, par exemple. Et aussi que vous pouvez modifier son apparence. Vous trouverez dans l’aide de la fonction forest_plot, des informations pour cela, notamment par l’emploi de panels personnalisés.

Forest plot basé sur un modèle de régression logistique multiple

Pour illustrer cet exemple, je vais utiliser les mêmes données, mais il s’agit d’expliquer la variable has_heart_disease (no /yes) par les autres variables :

mod2 <- glm(has_heart_disease ~ resting_blood_pressure + age + 
                gender + serum_cholestoral + max_heart_rate, data=HD_short_sc, family="binomial")

coefficients(summary(mod2))
##                           Estimate  Std. Error    z value     Pr(>|z|)
## (Intercept)            -4.23465322 1.171296018 -3.6153570 2.999340e-04
## resting_blood_pressure  0.02116823 0.008363293  2.5310884 1.137092e-02
## age                     0.12505689 0.158984964  0.7865957 4.315186e-01
## gendermale              1.81623756 0.339229953  5.3540012 8.603031e-08
## serum_cholestoral       0.36839922 0.142739625  2.5809177 9.853808e-03
## max_heart_rate         -1.06059034 0.175233492 -6.0524408 1.426674e-09
forest_model(mod2) 
forest plot régression logistique

Ici nous pouvons voir que le risque de maladie cardiaque est :

  • positivement et significativement lié aux hommes (par rapport aux femmes)
  • négativement et significativement lié à la fréquence cardiaque maximale (plus celle-ci est élevée, plus le risque de maladie diminue).

Forest plot basé sur un modèle de Cox

Pour cette partie, je me suis contentée de reprendre en grande partie l’exemple de la page d’aide de la fonction forest_model().

Le nom des variables est modifié grâce à la fonction transmute(). Cela permet d’afficher les noms souhaités sur le forest plot :

library("survival")
library("dplyr")
pretty_lung <- lung %>%
  transmute(time,
    status,
    Age = age,
    Sex = factor(sex, labels = c("Male", "Female")),
    ECOG = factor(lung$ph.ecog),
    Meal_Cal = meal.cal
  )

mod3 <- coxph(Surv(time, status) ~ Age + Sex + ECOG + Meal_Cal , pretty_lung)

forest_model(mod3) 
forest plot modèle de survie

Les résultats nous montrent que le risque de décès par cancer du poumon est :

  • significativement et négativement lié aux femmes (le risque de décès est significativement plus faible que celui des hommes)
  • significativement et positivement lié au score de performance ECOG de niveau 2 (par rapport au niveau de référence : il s’agit d’être alité moins de 50% du temps par rapport à des patients asymptomatiques)

Conclusion

J’espère que cet article vous aidera à présenter vos résultats de manière efficace ou à réaliser les forests plot dont vous avez besoin pour vos rapports d’analyse ou projet de publications

Facebook
Twitter

Si cet article vous a plu, ou vous a été utile, vous pouvez le partager, et soutenir le blog en réalisant un don libre sur la page Tipeee.

Poursuivez votre lecture

3 Responses

  1. Pédagogie par l’exemple, sens pédagogique exemplaire ! Merci de mettre ces découvertes à portée d’utilisateur.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.