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.
Sur les forest plots de méta-analyse :
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 :
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 !
À 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.
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_cholestoral
, max_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 :
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.
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)
Ici nous pouvons voir que le risque de maladie cardiaque est :
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)
Les résultats nous montrent que le risque de décès par cancer du poumon est :
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
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.
3 Responses
Très bonne présentation, didactique et incitative !
Pédagogie par l’exemple, sens pédagogique exemplaire ! Merci de mettre ces découvertes à portée d’utilisateur.
Très bonne présentation 👍, sa m’a été d’une grande utilité.
Merci