
Le package {gtsummary} est devenu au fil des années l’une des références pour la production de tableaux descriptifs et de résultats statistiques sous R. Son principal développeur, Daniel D. Sjoberg, est Senior Principal Data Scientist chez Genentech (groupe Roche).Il est biostatisticien de formation, et il a notamment travaillé au Memorial Sloan Kettering Cancer Center et au Prostate Cancer Clinical Trials Consortium. Ses domaines de recherche incluent les essais cliniques adaptatifs, la médecine de précision et la modélisation prédictive.
J’utilise régulièrement {gtsummary} et plus particulièrement tbl_summary() dans mes projets d’analyse de données et mes formations.
Pourtant, en regardant récemment la présentation Mastering Clinical Data Summaries with {gtsummary} and AI , j’ai découvert plusieurs fonctionnalités que je ne connaissais pas ou que je n’avais jamais eu l’occasion d’utiliser.
Dans cet article, je vous propose de découvrir cinq fonctionnalités de {gtsummary}qui pourraient vous être utiles pour personnaliser vos tableaux et gagner du temps dans vos analyses.
1. Afficher plusieurs statistiques avec tbl_summary grâce à continuous2
Par défaut, les variables quantitatives sont généralement résumées sur une seule ligne. Avec type = “continuous2”, il est possible d’afficher plusieurs statistiques sur des lignes séparées :
library(tidyverse)
library(gtsummary)
iris |>
tbl_summary(
by = Species,
type = Sepal.Length ~ "continuous2",
statistic = Sepal.Length ~ c(
"{mean} ({sd})",
"{min}, {max}"
)
)| Characteristic | setosa N = 501 | versicolor N = 501 | virginica N = 501 |
|---|---|---|---|
| Sepal.Length | |||
| Mean (SD) | 5.01 (0.35) | 5.94 (0.52) | 6.59 (0.64) |
| Min, Max | 4.30, 5.80 | 4.90, 7.00 | 4.90, 7.90 |
| Sepal.Width | 3.40 (3.20, 3.70) | 2.80 (2.50, 3.00) | 3.00 (2.80, 3.20) |
| Petal.Length | 1.50 (1.40, 1.60) | 4.35 (4.00, 4.60) | 5.55 (5.10, 5.90) |
| Petal.Width | 0.20 (0.20, 0.30) | 1.30 (1.20, 1.50) | 2.00 (1.80, 2.30) |
| 1 Median (Q1, Q3) | |||
On obtient alors : une ligne avec la moyenne et l’écart-type ; une seconde ligne avec le minimum et le maximum.
2. Utiliser automatiquement les labels des variables dans tbl_summary
Le package {gtsummary} s’intègre parfaitement avec le package {labelled}. Lorsqu’un label est associé à une variable, celui-ci est automatiquement utilisé dans les tableaux.
library(labelled)
iris2 <- iris
# creation d'une étiquette
var_label(iris2$Species) <- "Espèce observée"iris2 |>
tbl_summary(
include = Species
)| Characteristic | N = 1501 |
|---|---|
| Espèce observée | |
| setosa | 50 (33%) |
| versicolor | 50 (33%) |
| virginica | 50 (33%) |
| 1 n (%) | |
3. Personnaliser les arrondis des statistiques dans tbl_summary
On peut spécifier une précision différente pour certaines statistiques grâce à l’argument digits.
Par exemple :
library(gtsummary)
iris |>
tbl_summary(
statistic = all_continuous() ~ "{mean} ({sd})",
digits = all_continuous() ~ c(2, 1)
)| Characteristic | N = 1501 |
|---|---|
| Sepal.Length | 5.84 (0.8) |
| Sepal.Width | 3.06 (0.4) |
| Petal.Length | 3.76 (1.8) |
| Petal.Width | 1.20 (0.8) |
| Species | |
| setosa | 50 (33%) |
| versicolor | 50 (33%) |
| virginica | 50 (33%) |
| 1 Mean (SD); n (%) | |
Ici, c(2, 1) correspond à l’ordre des statistiques dans “{mean} ({sd})” :
- mean : 2 décimales
- sd : 1 décimale
4. Ajouter des p-values ajustées avec add_q()
Lorsque plusieurs tests statistiques sont réalisés simultanément, le risque d’obtenir au moins un résultat significatif par hasard augmente. Il peut alors être pertinent d’ajuster les p-values pour tenir compte de cette multiplicité des comparaisons. La fonction add_q() permet d’ajouter automatiquement une colonne de p-values ajustées à la suite d’un add_p().
trial |>
tbl_summary(
by = trt,
include = c(age, marker, grade, stage, response),
missing = "no"
) |>
add_p() |>
add_q(method = "BH")| Characteristic | Drug A N = 981 | Drug B N = 1021 | p-value2 | q-value3 |
|---|---|---|---|---|
| Age | 46 (37, 60) | 48 (39, 56) | 0.7 | 0.9 |
| Marker Level (ng/mL) | 0.84 (0.23, 1.60) | 0.52 (0.18, 1.21) | 0.085 | 0.4 |
| Grade | 0.9 | 0.9 | ||
| I | 35 (36%) | 33 (32%) | ||
| II | 32 (33%) | 36 (35%) | ||
| III | 31 (32%) | 33 (32%) | ||
| T Stage | 0.9 | 0.9 | ||
| T1 | 28 (29%) | 25 (25%) | ||
| T2 | 25 (26%) | 29 (28%) | ||
| T3 | 22 (22%) | 21 (21%) | ||
| T4 | 23 (23%) | 27 (26%) | ||
| Tumor Response | 28 (29%) | 33 (34%) | 0.5 | 0.9 |
| 1 Median (Q1, Q3); n (%) | ||||
| 2 Wilcoxon rank sum test; Pearson’s Chi-squared test | ||||
| 3 Benjamini & Hochberg correction for multiple testing | ||||
Dans cet exemple, les p-values sont ajustées selon la méthode de Benjamini-Hochberg (“BH”), qui vise à contrôler le taux de fausses découvertes (False Discovery Rate). Attention toutefois : la correction ne s’applique pas à chaque test individuellement. Elle est calculée à partir de l’ensemble des p-values présentes dans le tableau. Ainsi, une p-value de 0,05 peut devenir non significative après ajustement si de nombreuses comparaisons sont réalisées simultanément
5. Modifier les en-têtes des tableaux avec modify_header()
Les fonctions de personnalisation permettent d’adapter facilement l’apparence des tableaux.
iris |>
tbl_summary(
by = Species
) |>
modify_header(
label ~ "Variable"
)| Variable | setosa N = 501 | versicolor N = 501 | virginica N = 501 |
|---|---|---|---|
| Sepal.Length | 5.00 (4.80, 5.20) | 5.90 (5.60, 6.30) | 6.50 (6.20, 6.90) |
| Sepal.Width | 3.40 (3.20, 3.70) | 2.80 (2.50, 3.00) | 3.00 (2.80, 3.20) |
| Petal.Length | 1.50 (1.40, 1.60) | 4.35 (4.00, 4.60) | 5.55 (5.10, 5.90) |
| Petal.Width | 0.20 (0.20, 0.30) | 1.30 (1.20, 1.50) | 2.00 (1.80, 2.30) |
| 1 Median (Q1, Q3) | |||
Les en-têtes acceptent également la syntaxe Markdown. Par exemple :
library(gtsummary)
iris |>
tbl_summary(
by = Species
) |>
modify_header(
label ~ "**Variable**",
stat_1 ~ "**Espèce Setosa**<br>N = {n}",
stat_2 ~ "**Espèce Versicolor**<br>N = {n}",
stat_3 ~ "**Espèce Virginica**<br>N = {n}"
)| Variable | Espèce Setosa N = 501 | Espèce Versicolor N = 501 | Espèce Virginica N = 501 |
|---|---|---|---|
| Sepal.Length | 5.00 (4.80, 5.20) | 5.90 (5.60, 6.30) | 6.50 (6.20, 6.90) |
| Sepal.Width | 3.40 (3.20, 3.70) | 2.80 (2.50, 3.00) | 3.00 (2.80, 3.20) |
| Petal.Length | 1.50 (1.40, 1.60) | 4.35 (4.00, 4.60) | 5.55 (5.10, 5.90) |
| Petal.Width | 0.20 (0.20, 0.30) | 1.30 (1.20, 1.50) | 2.00 (1.80, 2.30) |
| 1 Median (Q1, Q3) | |||
Les doubles astérisques permettent d’afficher le texte en gras dans le tableau final.
Pour conclure
Le package {gtsummary} est souvent associé à la fonction tbl_summary(), mais il offre en réalité bien davantage. Parmi les fonctions les plus utilisées, on peut citer tbl_regression(), qui permet de présenter élégamment les résultats de modèles statistiques (régressions linéaires, logistiques, modèles de Cox, etc.), ou encore tbl_uvregression(), très pratique pour réaliser rapidement des analyses univariées.
La présentation Mastering Clinical Data Summaries with {gtsummary} and AI m’a également permis de découvrir des fonctionnalités que je n’avais encore jamais utilisées, notamment les fonctions tbl_hierarchical() et tbl_hierarchical_count(). Ces dernières sont particulièrement adaptées à la production de tableaux hiérarchiques, par exemple pour présenter des événements indésirables en recherche clinique en tenant compte de leur structure (classe de système d’organes, terme préféré, niveau de sévérité, etc.).
Si vous souhaitez aller plus loin, je vous recommande la présentation qui a inspiré cet article : Mastering Clinical Data Summaries with {gtsummary} and AI
Vous trouverez également de nombreuses ressources, exemples et tutoriels sur le site officiel du package



