ℹ As a usage guide, the code below re-creates the current column headers.
modify_header(
label = "**Caractéristique**",
stat_0 = "**Total**, N = 200",
stat_1 = "**Drug A**, N = 98",
stat_2 = "**Drug B**, N = 102",
p.value = "**p-valeur**"
Column Name Column Header
------------ --------------------
label **Caractéristique**
stat_0 **Total**, N = 200
stat_1 **Drug A**, N = 98
stat_2 **Drug B**, N = 102
p.value **p-valeur**
label est la colonne affichant le nom des variables, stat_0 la colonne totale crée par add_overall
(ou la colonne unique de statistiques en l’absence de paramètre by
) et p.value la colonne crée par add_p
. Lorsqu’il y a un paramètre by
, des colonnes nommées stat_1, stat_2, etc. sont crées pour chaque valeur de by
. La fonction all_stat_cols
permets de sélectionner toutes les colonnes dont le nom commence par stat_. On peut également utiliser all_stat_cols(stat_0 = FALSE)
sélectionner toutes les colonnes associées à by
mais pas celle crée par add_overall
.
Dans les étiquettes, on peut utiliser des doubles étoiles (**
) pour indiquer du gras et des tirets simples (_
) pour de l’italique (il s’agit de codes markdown). On peut utliser {N}
pour afficher le nombre total d’observations. Pour les colonnes associées à by
, {level}
, {n}
et {p}
correspondent respectivement au niveau du facteur, au nombre d’observations et à la proportion de ce facteur dans l’échantillon total. La valeur NA
peut être utilisée pour supprimer les notes associées aux colonnes concernées.
Par défaut, pour les variables continues, un test de Kruskal-Wallis calculé avec la fonction kruskal.test
est utilisé lorsqu’il y a trois groupes ou plus, et un test de Wilcoxon-Mann-Whitney calculé avec wilcox.test
(test de comparaison des rangs) lorsqu’il n’y a que deux groupes.
Si l’on affiche des moyennes, il serait plus juste d’utiliser un test t de Student (test de compairaison des moyennes) calculé avec t.test
.
Pour les variables catégorielles, un test du Chi² calculé avec chisq.test
est utilisé par défaut lorsque les effectifs théoriques sont supérieurs à 5, sinon un test de Fosher calculé avec fisher.test
est utilisé.
D’autres tests sont disponibles et sont détaillés dans le fichier d’aide add_p.tbl_summary
.
Le paramètre test
permets de spécifier pour chaque variable le type de tests à utiliser. La fonction separate_p_footnotes
peut être utilisée pour créer une note de tableau différente pour chaque test. Le paramètre pvalue_fun
permet d’indiquer une fonction personnalisée pour la mise en forme des p-valeurs.
La fonction tbl_svysummary
est similaire à tbl_summary
à l’exception qu’elle prend en entrée un objet de type survey
défini avec l’extension homonyme. Cela permet de définir une pondération des observations et un plan d’échantillonnage complexe. Les options de tbl_svysummary
sont similaires et il est possible d’utiliser les autres fonctions de gtsummary
telles que add_overall
, add_p
, add_n
, add_stat_label
, etc.
Il faut noter que les tests statistiques disponibles ne sont pas les mêmes et sont détaillés dans le fichier d’aide de add_p.tbl_svysummary
.
trial %>%
tbl_continuous(
variable = age,
statistic = ~"{mean}",
include = c(stage, grade),
by = trt,
digits = ~1
La fonction tbl_custom_summary
permets encore plus de personnalisation que tbl_continuous
.
Comme précédemment, un tableau va être créé avec les paramètres include
et by
. On doit également fournir via stat_fns
une fonction personnalisée qui va recevoir un sous tableau de données (obtenu en croisant include
et by
), contenant toutes les variables du fichier, et qui renverra des statistiques personnalisées que l’on affichera avec statistic
. La fonction peut-être différente pour chaque variable.
Il est également possible d’utiliser quelques fonctions dédiées fournies directement par gtsummary
.
À noter que l’option overall_raw
permets d’afficher une ligne total, overall_raw_label
de personnaliser l’étiquette de cette ligne et overall_raw_last
de choisir si on souhaite l’afficher en début ou en fin de tableau.
La fonction continuous_summary
permet de reproduire avec tbl_custom_summary
le fonctionnement de tbl_continuous
. continuous_summary
prend un seul argument (le nom d’une variable du fichier). Les statistiques à afficher sont directement précisées avec statistic
.
Ainsi, pour afficher l’âge moyen (avec l’écart-type) en fonction des variables trt, grade et stage :
trial %>%
tbl_custom_summary(
include = c("grade", "stage"),
by = "trt",
stat_fns = ~ continuous_summary("age"),
statistic = ~"{mean} ({sd})",
overall_row = TRUE,
digits = ~1
) %>%
add_overall() %>%
modify_footnote(
update = all_stat_cols() ~ "Âge moyen (ET)"
Astuce : la fonction modify_footnote
peut être utilisée pour mettre à jour la note de tableau.
La fonction proportion_summary
permets de calculer une proportion (et son intervalle de confiance). Elle prends en entrée la variable à partir de laquelle calculer la proportion et le ou les valeurs à inclure dans cette proportion. Il faut préciser l’affichage souhaité avec statistic
et la mise enforme avec digits
.
Par exemple, pour afficher la proportion de personnes étant à l’étape “T3” ou “T4” (variable stage) :
trial %>%
tbl_custom_summary(
include = c("grade", "trt"),
stat_fns = ~ proportion_summary(variable = "stage", value = c("T3", "T4")),
statistic = ~"{prop}% [{conf.low}-{conf.high}]",
digits = ~ scales::label_percent(accuracy = .1, decimal.mark = ",", suffix = "")
La fonction ratio_summary
calcule le ratio entre deux variables. Elle peut ainsi être utilisée pour produire un tableau d’incidence (nombre de cas / exposition exprimée en personnes-années). On lui indique le nom de la variable à prendre en compte pour le numérateur et celui de la variable pour le dénominateur. Pour chaque sous-groupe, la fonction renvoie {num}
(somme de la variable définie pour le numérateur), {denom}
(somme de la variable définie pour le dénominateur) et {ratio}
(i.e. {num}
/{denom}
). Si {num}
est un nombre entier, l’intervalle de confiance de {ratio}
est calculé à l’aide de la fonction poisson.test
et accessible via {conf.high}
et {conf.high}
.
trial %>%
tbl_custom_summary(
include = c("stage", "grade"),
by = "trt",
stat_fns = ~ ratio_summary("response", "ttdeath"),
statistic = ~"{ratio} [{conf.low}; {conf.high}] ({num}/{denom})",
digits = ~ c(3, 2, 2, 0, 0),
overall_row = TRUE,
overall_row_label = "Total"
) %>%
bold_labels() %>%
modify_footnote(
update = all_stat_cols() ~ "Ratio [95% CI] (n/N)"
Il est également possible, et c’est là toute la puissance de tbl_custom_summary
, de définir une fonction personnelle et de la passer via stat_fns
.
Cette fonction sera appellée pour chaque cellule du tableau, chaque cellule étant calculée indépendamment.
Une telle fonction recevra les arguments suivants :
data
est un tableau de données contenant un sous-ensemble des données transmises à tbl_custom_summary
, plus précisément le sous-ensemble défini par la valeur courante de variable
et de by
. Il faut noter que les valeurs manquantes (NA
) de variable
sont également exclues de data
.
full_data
est le tableau de données complet transmis à tbl_custom_summary
.
variable
est une valeur textuelle contenant le nom de la variable sur laquelle porte le calcul en cours.
by
est une valeur textuelle contenant le nom de la variable by
s’il y en a une, NULL
sinon.
type
est une valeur textuelle indiquant le type de variable (continuous, categorical, …).
stat_display
est une valeur textuelle indiquant les statistiques qui seront affichées (i.e. la valeur indiquée dans l’argument statistic
de tbl_custom_summary
).
La plupart du temps, une fonction personnalisée n’aura pas besoin de tous ces éléments. C’est pourquoi il est recommandé d’inclure ...
dans la définition de la fonction, par exemple ma_fonction <- function(data, ...){}
.
La fonction devra impérativement renvoyé un tibble
composé d’une seule ligne et avec une colonne par statistique calculée, le nom de la colonne correspondant avec la statistique demandée dans statistic
.
Voyons un premier exemple, avec une fonction calculant la somme de marker et l’âge moyen.
Construisons un tableau à partir de cette dernière.
Dans notre second exemple, nous souhaitons calculer la moyenne et l’intervalle de confiance de la variable affichée en ligne. Cette fois-ci, la variable en cours n’est pas connue à l’avance mais son nom est accessible via l’argument variable
. On peut donc y accéder avec la syntaxe data[[variable]]
.
mean_ci <- function(data, variable, ...) {
test <- t.test(data[[variable]])
dplyr::tibble(
mean = test$estimate,
conf.low = test$conf.int[1],
conf.high = test$conf.int[2]
trial %>%
tbl_custom_summary(
include = c("marker", "ttdeath"),
by = "trt",
stat_fns = ~mean_ci,
statistic = ~"{mean} [{conf.low}; {conf.high}]"
) %>%
add_overall(last = TRUE) %>%
modify_footnote(
update = all_stat_cols() ~ "moyenne [IC 95%"
Allons un peu plus loin avec notre troisième exemple. Nous nous intéressons non seulement à la moyenne de la variable marker pour une sous-catégorie donnée, mais également si cette moyenne est supérieure ou inférieuree à la grande moyenne (toutes catégories confondues). Nous aurons donc besoin de l’ensemble du jeu de données avec full_data
. Cet exemple nous permets également de voir qu’il est possible de renvoyer une statistique textuelle.
diff_to_great_mean <- function(data, full_data, ...) {
mean <- mean(data$marker, na.rm = TRUE)
great_mean <- mean(full_data$marker, na.rm = TRUE)
diff <- mean - great_mean
dplyr::tibble(
mean = mean,
great_mean = great_mean,
diff = diff,
level = ifelse(diff > 0, "haut", "bas")
trial %>%
tbl_custom_summary(
include = c("grade", "stage"),
by = "trt",
stat_fns = ~diff_to_great_mean,
statistic = ~"{mean} ({level}, diff: {diff})",
digits = ~ list(1, as.character, 1),
overall_row = TRUE
) %>%
bold_labels()
D’un usage plus avancé, add_stat
permets de rajouter une colonne de statistiques personnalisées à un objet gtsummary
existant. Le calcul ne se fait pas ici cellule par cellule mais variable par variable.
On pourra se référer à l’aide la fonction pour des exemples d’utilisation.
Déjà abordé dans le chapitre sur la régression logistique, tbl_regression
permets d’afficher les coefficients d’un modèle statistique, avec les intervalles de confiance et les p-valeurs.
tbl_regression
utilise de manière sous-jacente l’extension broom.helpers
et est donc compatible avec tous les types de modèles compatibles.
Le paramètre include
permets de choisir les variables / termes à afficher.
On peut personnaliser les étiquettes des variables avec label
.
mod %>%
tbl_regression(label = list(
trt ~ "Traitement",
"grade:age" ~ "Interaction entre grade et âge"
Pour une régression logistique, il est d’usage d’afficher l’exponentiel des coefficients, ce que l’on peut faire en indiquant exponentiate = TRUE
.
Comme pour tout tableau gtsummary
, l’intitulé des colonnes peut être modifié avec modify_header
. On pourra avoir recours à show_header_names
pour connaître le nom de chaque colonne.
ℹ As a usage guide, the code below re-creates the current column headers.
modify_header(
label = "**Caractéristique**",
estimate = "**OR**",
ci = "**95% IC**",
p.value = "**p-valeur**"
Column Name Column Header
------------ --------------------
label **Caractéristique**
estimate **OR**
ci **95% IC**
p.value **p-valeur**
La fonction add_significance_stars
ajoute des étoiles de significativité à côté des coefficients. Les options hide_ci
, hide_p
et hide_se
permettent de masquer/afficher les intervalles de confiance, les p-valeurs et les écarts-types.
lm(time ~ ph.ecog + sex, survival::lung) %>%
tbl_regression() %>%
add_significance_stars(
hide_ci = FALSE,
hide_p = FALSE,
hide_se = TRUE
L’argument show_single_row
permet d’indiquer une liste de variables dichotomiques que l’on souhaite afficher sur une seule ligne (la modalité de référence étant alors masquée). Il est possible d’indiquer all_dichotomous
()
pour appliquer cette option à toutes les variables dichotomiques.
Par défaut, l’intercept n’est pas affiché. Mais on peut forcer son affichage avec intercept = TRUE
.
L’argument estimate_fun
permet de fournir une fonction qui sera utilisée pour mettre en forme les coefficients (et les intervalles de confiance) et pvalue_fun
pour une fonction utilisée pour les p-valeurs. Voir le chapitre dédié à la mise en forme des nombres.
mod %>%
tbl_regression(
estimate_fun = scales::label_number(accuracy = .001, decimal.mark = ","),
pvalue_fun = scales::label_pvalue(accuracy = .001, decimal.mark = ",", add_p = TRUE)
L’option add_estimate_to_reference_rows = TRUE
ajoute la valeur du coefficient pour les modalités de références.
La fonction add_global_p
calcule une p-valeur globale pour chaque variable. On ajoutera keep = TRUE
pour conserver les p-valeurs individuelles de chaque coefficient.
Note : par défaut, les p-valeurs globales calculées sont du type III. Voir la note dédiée aux p-valeurs globales dans le chapitre sur la régression logistique.
Dans le chapitre sur la multicolinéarité, nous avons abordé les facteurs d’inflation de la variance (FIV) ou variance inflation factor (VIF) en anglais. Ils peuvent être facilement calculés avec add_vif
.
there are higher-order terms (interactions) in this model
consider setting type = 'predictor'; see ?vif
OR = rapport de cotes, IC = intervalle de confiance, GVIF = Generalized Variance Inflation Factor
GVIF^[1/(2*df)]
Nous avons déjà abordé dans d’autres chapitres la fonction ggcoef_model
de GGally
pour la représentation graphiques des coefficients. Pour un graphique rapide, on peut appliquer plot()
à un tableau généré avec tbl_regression
pour produire rapidement un graphique des coefficients.
Cependant, si l’on souhaite plus d’options de personnalisation, on utilisera directement ggcoef_model
de GGally
.
Registered S3 method overwritten by 'GGally':
method from
+.gg ggplot2
La méthode glance
de broom
permets de calculer des statistiques globales sur un modèle (comme le R² ou l’AIC, les statistiques calculées dépendant de chaque modèle).
Ces statistiques globales peuvent être ajoutées au tableau avec add_glance_table
ou en notes avec add_glance_source_note
. Le paramètre include
permets de choisir les éléments à afficher parmi les colonnes du tableau générés par glance
.
La fonction tbl_stack
permets de coller
deux (ou plus) tableaux l’un au-dessus de l’autre tandis que tbl_merge
les placera côte-à-côte, en s’assurant qu’une même variable sera bien affichée sur la même ligne.
glm(response ~ trt, trial, family = binomial) %>%
tbl_regression(exponentiate = TRUE)
glm(response ~ grade + trt + stage + marker, trial, family = binomial) %>%
tbl_regression(exponentiate = TRUE)
tbl_stack(
list(t1, t2),
group_header = c("Modèle bivarié", "Modèle multivarié")
La fonction tbl_strata
permet de calculer un tableau gtsummary
pour chaque modalité d’une variable catégorielle définie via strata
, puis de combiner les tableaux entre eux. Le paramètre .tbl_fun
indique la fonction à utiliser pour le calcul du tableau. On peut utiliser la syntaxe rapide d’écritude de fonction propre au tidyverse en indiquant une formule (qui commence par ~
) et en utilisant .x
pour indiquer où passer le sous-ensemble de données.
Par défaut les sous-tableaux produits sont combinés avec tbl_merge
.
trial %>%
select(age, grade, stage, trt) %>%
mutate(grade = paste("Grade", grade)) %>%
tbl_strata(
strata = grade,
.tbl_fun =
~ .x %>%
tbl_summary(by = trt, missing = "no") %>%
add_n()
Pour les combiner avec tbl_stack
, on indiquera .combine_with = "tbl_stack"
.
trial %>%
select(age, grade, stage, trt) %>%
mutate(grade = paste("Grade", grade)) %>%
tbl_strata(
strata = grade,
.tbl_fun =
~ .x %>%
tbl_summary(by = trt, missing = "no") %>%
add_n(),
.combine_with = "tbl_stack"
ℹ Column headers among stacked tables differ. Headers from the first table are
used. Use `quiet = TRUE` to supress this message.
Lorsqu’un tableau est trop long et qu’on souhaite le couper en plusieurs tableaux, on pourra utiliser tbl_spit
en indiquant le nom des variables après lesquelles le tableau doit être coupé.
La fonction tbl_uvregression
est utile pour réaliser plusieurs régressions univariées. Il faut lui passer un tableau ne contenant que la variable à expliquer et les variables explicatives. La variable à expliquer sera indiquée avec y
. L’argument method
indique la fonction à utiliser pour le calcul des modèles univariés, par exemple glm
pour une régression logistique ordinale. On pourra indiquer des paramètres à transmettre à cette fonction avec method.args
, par exemple list(family = binomial)
dans le cadre d’une régreession logistique binaire.
On peut facilement présenter côte-à-côte l’analyse descriptive, l’analyse bivariée et l’analyse multivariée avec tbl_merge
.
tbl_desc <- trial %>%
tbl_summary(
by = response,
include = c(age, grade, stage)
7 observations missing `response` have been removed. To include these observations, use `forcats::fct_na_value_to_level()` on `response` column before passing to `tbl_summary()`.
tbl_multi <- trial %>%
glm(
response ~ age + grade + stage,
data = .,
family = binomial
) %>%
tbl_regression(exponentiate = TRUE)
tbl_merge(
list(tbl_desc, tbl_uni, tbl_multi),
tab_spanner = c("**Analyse descriptive**", "**Modèles bivariés**", "**Modèle multivarié**")
L’analyse de survie et les courbes de Kaplan-Meier sont abordées dans un chapitre dédié. La fonction tbl_survfit
permets de représenter la probabilité encore en vie à différents points de temps définis avec times
.
km %>%
tbl_survfit(
times = c(0, 6, 12, 18, 24),
label_header = "**Mois {time}**"
On peut alternativement représenter la proportion ayant vécu l’évènement avec reverse = TRUE
.
km %>%
tbl_survfit(
times = c(6, 12),
reverse = TRUE
Au lieu d’indiquer des points de temps, on peut indiquer des quantiles avec probs
et représenter le temps requis pour atteindre ces quantiles.
Il est également possible de passer une liste d’objets survfit
.
list(
survfit(Surv(ttdeath, death) ~ 1, trial),
survfit(Surv(ttdeath, death) ~ trt, trial),
survfit(Surv(ttdeath, death) ~ grade, trial)
) %>%
tbl_survfit(
times = c(6, 12, 18),
label_header = "**Mois {time}**"
Dernière possibilité, il est possible de passer un tableau de données et d’indiquer les variables à analyser. Les tables de survie seront alors calculées à la volée.
trial %>%
tbl_survfit(
y = Surv(ttdeath, death),
include = c(trt, grade, stage),
probs = 0.5,
label_header = "**Survie médiane en mois** (IC 95%)",
estimate_fun = scales::label_number(accuracy = .1)
Les tableaux produits par gtsummary
peuvent être rendus avec plusieurs moteurs de tableaux, grace aux fonctions as_flex_table
, as_hux_table
, as_kable_extra
, et as_kable
. Ils peuvent même être convertis en tableaux de données avec , as_tibble
.
Dans un document R Markdown, gtsummary
utilisera le moteur de tableaux le plus adapté selon la sortie (HTML, PDF ou Word).
Formats d’export d’un tableau gtsummary
Caractéristique | Drug A, N = 981 | Drug B, N = 1021 | p-valeur2 |
---|
Age | 46 (37 – 59) | 48 (39 – 56) | 0,7 |
Manquant | 7 | 4 |
|
Grade |
|
| 0,9 |
I | 35 (36%) | 33 (32%) |
|
II | 32 (33%) | 36 (35%) |
|
III | 31 (32%) | 33 (32%) |
|
1Médiane (EI); n (%) |
2test de Wilcoxon-Mann-Whitney; test du khi-deux d'indépendance |
Caractéristique
Drug A, N = 98
Drug B, N = 102
p-valeur
Age46 (37 – 59)48 (39 – 56)0,7
Manquant74
Grade0,9
I35 (36%)33 (32%)
II32 (33%)36 (35%)
III31 (32%)33 (32%)
Médiane (EI); n (%)
test de Wilcoxon-Mann-Whitney; test du khi-deux d'indépendance
4 I 35 (36%)
5 II 32 (33%)
6 III 31 (32%)
# ℹ 2 more variables: `**Drug B**, N = 102` <chr>,
# `**p-valeur**` <chr>
En dehors d’un fichier R markdown, pour exporter un tableau dans un fichier HTML, TeX ou RTF, on pourra utiliser gtsave
de gt
.
Pour exporter un tableau dans un fichier Word, on pourra avoir recours à save_as_docx
de flextable
.
L’extension bstfun
est une petite sœur de gtsummary
, développée par la même équipe. Cette extension n’est pas disponible sur CRAN mais seulement sur GitHub et elle permet, entre autres, de tester certaines fonctionnalités avant leur éventuelle intégration dans gtsummary
.
Cette extension n’étant disponible que sur GitHub, elle s’installe avec la commande ci-après. ATTENTION : sous Windows, vous aurez besoin d’avoir installer en amont l’outil R Tools disponible sur https://cran.r-project.org/bin/windows/Rtools/.
En sciences sociales, il est fréquent de mesurer des connaissances ou des opinions selon une échelle de Likert. Dans cette situation, nous avons alors plusieurs variables catégorielles partageant les mêmes modalités.
Prenons les données utilisées dans le chapitre Exemples de graphiques avancés.
pos variable label col_type missing values
2 conn_a — fct 21 oui
3 conn_b — fct 0 oui
4 conn_c — fct 0 oui
5 conn_d — fct 104 oui
6 conn_e — fct 17 oui
7 conn_f — fct 10 oui
8 conn_g — fct 12 oui
Nous avons une série de 8 variables avec les mêmes modalités (Oui, Non et NSP). Un tri à plat peut-être un peu fastidieux à lire.
La fonction tbl_likert
de bstfun
est plus adaptée pour présenter ce type de données.
Attachement du package : 'bstfun'
L'objet suivant est masqué depuis 'package:gtsummary':
trial
La fonction add_sparkline
ajoute une représentation graphique de la distribution d’une variable continue.
La fonction add_inline_forest_plot
ajoute aux tableaux représentant les coefficients d’un modèle une représentation graphique de ces coefficients et de leur intervalle de confiance.
La fonction as_forest_plot
permets d’afficher un graphique des coefficients utilisant la fonction forestplot
de l’extension homonyme forestplot
à partir d’un tableau construit avec tbl_regression
.
Contenus sous licence Creative Commons Attribution - Pas d’utilisation commerciale - Partage dans les mêmes conditions.
Propulsé par R, RStudio, R Markdown, knitr, pandoc et Prince XML. Hébergé par GitHub.