机灵的楼梯 · Python Agent in ...· 2 周前 · |
逼格高的投影仪 · vscode怎么自动搜索python • ...· 2 月前 · |
千杯不醉的西装 · [BGM出没注意]Slam Dunk / ...· 3 月前 · |
爱笑的草稿纸 · 如何在spyder中使任意代码块可折叠_如何 ...· 3 月前 · |
打篮球的抽屉 · 全景图转小行星视角投影原理详解 - ...· 3 月前 · |
Le package
gtsummary
est, entre autres, abordé sur
guide-R
dans les chapitres suivants :
Statistique univariée & Intervalles de confiance
,
Statistique bivariée & Tests de comparaison
,
Échelles de Likert
,
Régression linéaire
,
Régression logistique binaire
,
Prédictions marginales, contrastes marginaux & effets marginaux
.
Ce chapitre est évoqué dans le webin-R #22 (tableaux statistiques avec gtsummary) sur YouTube .
Ce chapitre est évoqué dans le webin-R #23 (tableaux statistiques avec gtsummary : suite) sur YouTube .
L’extension
gtsummary
a déjà été abordée dans d’autres chapitres, notamment via les fonctions
tbl_summary
et
tbl_svysummary
dans le chapitre sur la
statistique bivariée
ou la fonction
tbl_regression
dans le chapitre sur la
régression logistique
.
Dans ce chapitre, nous allons explorer plus en profondeur les différentes options offertes
gtsummary
pour la réalisation de tableaux statistiques prêts à être publiés.
Les personnes anglophones pourront également se référer à l’excellent site de documentation du package : https://www.danieldsjoberg.com/gtsummary/
gtsummary
permets de réaliser des tableaux statistiques combinant plusieurs variables, l’affichage des résultats pouvant dépendre du type de variables.
Par défaut,
gtsummary
considère qu’une variable est
catégorielle
s’il s’agit d’un facteur, d’une variable textuelle ou d’une variable numérique ayant moins de 10 valeurs différentes.
Une variable sera considérée comme
dichotomique
(variable catégorielle à seulement deux modalités) s’il s’agit d’un vecteur logique (
TRUE
/
FALSE
), d’une variable textuelle codée
yes
/
no
ou d’une variable numérique codée
0
/
1
.
Dans les autres cas, une variable numérique sera considérée comme continue .
Si vous utilisez des vecteurs labellisés (voir le
chapitre dédié
), vous devez les convertir, en amont, en facteur ou en variables numériques. Voir l’extension
labelled
et les fonctions
to_factor
,
unlabelled
et
unclass
.
Nous verrons plus loin qu’il est possible de forcer le type d’une variable et l’existence d’autres types de variables.
gtsummary
fournit des sélecteurs qui pourront être utilisés dans les options des différentes fonctions, en particulier
all_continuous
pour les variables continues,
all_dichotolous
pour les variables dichotomiques et
all_categorical
pour les variables catégorielles (incluant les variables dichotomiques, utiliser
all_categorical(dichotomous = FALSE)
pour sélectionner les variables catégorielles en excluant les variables dichotomiques).
Dans le cadre des tableaux présentant les résultats d’un modèle statistique, il existe en plus d’autres sélecteurs pour sélectionner certains termes spécifiques :
all_intercepts
(pour sélectionner seulement le ou les
intercepts
du modèle),
all_interaction
pour les termes d’interactions entre plusieurs variables,
all_contrasts
pour sélectionner les variables catégorielles codées avec un contraste particulier.
De nombreuses options des fonctions de
gtsummary
peuvent s’appliquer seulement à une ou certaines variables. Pour ces options-là,
gtsummary
attends une formule de la forme
variables concernées ~ valeur de l'option
ou bien une liste de formules ayant cette forme.
Par exemple, pour modifier l’étiquette associée à une certaine variable, on peut utiliser l’option
label
de
tbl_summary
.
tbl_summary(trial, label = age ~ "Âge") tbl_summary(trial, label = list(age ~ "Âge", trt ~ "Traitement"))
gtsummary
est très flexible sur la manière d’indiquer la ou les variables concernées. Il peut s’agir du nom de la variable, d’une chaîne de caractères contenant le nom de la variable, ou d’un vecteur contenant le nom de la variable. Les syntaxes ci-dessous sont ainsi équivalentes.
tbl_summary(trial, label = age ~ "Âge") tbl_summary(trial, label = "age" ~ "Âge") v <- "age" tbl_summary(trial, label = v ~ "Âge") tbl_summary(trial, label = vars(age) ~ "Âge")
Pour appliquer le même changement à plusieurs variables, plusieurs syntaxes sont acceptées pour lister plusieurs variables.
tbl_summary(trial, label = c("age", "trt") ~ "Une même étiquette") tbl_summary(trial, label = c(age, trt) ~ "Une même étiquette") tbl_summary(trial, label = vars(age, trt) ~ "Une même étiquette")
Il est également possible d’utiliser la syntaxe
tidyselect
et les sélecteurs de
tidyselect
comme
everything
,
starts_with
,
contains
ou
all_of
. Ces différents sélecteurs peuvent être combinés au sein d’un
c()
ou de
vars()
.
tbl_summary(trial, label = everything() ~ "Une même étiquette") tbl_summary(trial, label = starts_with("a") ~ "Une même étiquette") tbl_summary(trial, label = c(everything(), -age, -trt) ~ "Une même étiquette") tbl_summary(trial, label = age:trt ~ "Une même étiquette")
Bien sûr, il est possible d’utiliser les sélecteurs propres à
gtsummary
.
tbl_summary(trial, label = all_continuous() ~ "Une même étiquette") tbl_summary(trial, label = list( all_continuous() ~ "Variable continue", all_dichotomous() ~ "Variable dichotomique", all_categorical(dichotomous = FALSE) ~ "Variable catégorielle"
Enfin, si l’on ne précise rien à gauche du
~
, ce sera considéré comme équivalent àeverything()
. Les deux syntaxes ci-dessous sont donc équivalentes.tbl_summary(trial, label = ~"Une même étiquette") tbl_summary(trial, label = everything() ~ "Une même étiquette")
Thèmes
gtsummary
fournit plusieurs fonctions préfixéestheme_gtsummary_*()
permettant de modifier l’affichage par défaut des tableaux.La fonction
theme_gtsummary_journal
permets d’adopter les standards de certaines grandes revues scientifiques telles que JAMA (Journal of the American Medical Association), The Lancet ou encore le NEJM (New England Journal of Medicine).Par défaut,
tbl_summary
utilise la médiane et l’intervalle interquartile pour les variables continues. Si on appliquetheme_gtsummary_mean_sd
, la moyenne et l’écart-type seront utilisés par défaut.La fonction
theme_gtsummary_language
permet de modifier la langue utilisée par défaut dans les tableaux. Les optionsdecimal.mark
etbig.mark
permettent de définir respectivement le séparateur de décimales et le séparateur des milliers. Ainsi, pour présenter un tableau en français, on appliquera en début de script :Setting theme `language: fr`
Statistiques descriptives avec tbl_summary()
La fonction
tbl_summary
permets de réaliser des tris à plats de plusieurs variables, éventuellement croisés selon une variable catégorielle.On lui passe en entrée un tableaux de données (data.frame) et par défaut toutes les variables sont résumées.
Sélection des variables (include)
La paramètre
include
permets de spécifier les variables à inclure dans le tableau (et leur ordre). On peut lui passer un vecteur de noms de variables, ou bien utiliser des sélecteurs tidyselect (utiliserc()
si plusieurs sélecteurs).En fonction d’une seconde variable (by, add_overall)
Le paramètre
by
permets de résumer chacune des variables inclues en fonction d’une variable catégorielle.trial %>% tbl_summary( include = c(age, stage, response), by = trt
La fonction
add_overall
, appliquée aprèstbl_summary
, permets, lorsqu’une variableby
a été définie, de rajouter une colonne avec l’ensemble du fichier. L’optionlast
permets de spécifier si l’on veut ajouter cette colonne à la droite du tableau etcol_label
permet de personnaliser le titre de la colonne (noter le recours aux**
pour indiquer ce qui doit être affiché en gras et{N}
qui sera remplacé par le nombre d’observations).trial %>% tbl_summary( include = c(age, stage, response), by = trt ) %>% add_overall(last = TRUE, col_label = "**Ensemble** (effectif total: {N})")
Statistiques affichées (statistic, percent, sort)
Le paramètre
statistic
permets de sélectionner les statistiques à afficher pour chaque variable. On indiquera une chaîne de caractères dont les différentes statistiques seront indiquées entre accolades ({}
).Pour une variable continue, on pourra utiliser
{median}
pour la médiane,{mean}
pour la moyenne,{sd}
pour l’écart type,{var}
pour la variance,{min}
pour le minimum,{max}
pour le maximum, ou encore{p##}
(en remplacant##
par un nombre entier entre 00 et 100) pour le percentile correspondant (par exemplep25
etp75
pour le premier et le troisième quartile). Utilisezall_continous
pour sélectionner toutes les variables continues.trial %>% tbl_summary( include = c(age, marker), statistic = all_continuous() ~ "Moy. : {mean} [min-max : {min} - {max}]"
Il est possible d’afficher des statistiques différentes pour chaque variable.
trial %>% tbl_summary( include = c(age, marker), statistic = list( age ~ "Méd. : {median} [{p25} - {p75}]", marker ~ "Moy. : {mean} ({sd})"
Pour les variables continues, il est également possible d’indiquer le nom d’une fonction personnalisée qui prends un vecteur et renvoie une valeur résumé. Par exemple, pour afficher la moyenne des carrés :
moy_carres <- function(x) { mean(x^2, na.rm = TRUE) trial %>% tbl_summary( include = marker, statistic = ~"MC : {moy_carres}"
Pour une variable catégorielle, les statistiques possibles sont
{n}
le nombre d’observations,{N}
le nombre total d’observations, et{p}
le pourcentage correspondant. Utilisezall_categorical
pour sélectionner toutes les variables catégorielles.trial %>% tbl_summary( include = c(stage, response), statistic = all_categorical() ~ "{p} % ({n}/{N})"
Il est possible, pour une variable catégorielle, de trier les modalités de la plus fréquente à la moins fréquente avec le paramètre
sort
.trial %>% tbl_summary( include = c(stage, response), sort = all_categorical() ~ "frequency"
Lorsqu’une variable
by
est définie, on peut utiliserpercent
pour indiquer le type de pourcentages : en ligne avec"row"
, en colonne avec"column"
et"cell"
pour les pourcentages totaux.trial %>% tbl_summary( include = c(stage, response), by = grade, statistic = all_categorical() ~ "{p} % ({n}/{N})", percent = "row" ) %>% add_overall(last = TRUE)
Pour toutes les variables (catégorielles et continues), les statistiques suivantes sont également disponibles :
{N_obs}
le nombre total d’observations,{N_miss}
le nombre d’observations manquantes (NA
),{N_nonmiss}
le nombre d’observations non manquantes,{p_miss}
le pourcentage d’observations manquantes (i.e.N_miss / N_obs
) et{p_nonmiss}
le pourcentage d’observations non manquantes (i.e.N_nonmiss / N_obs
).Affichage du nom des statistiques (add_stat_label)
Lorsque l’on affiche de multiples statistiques, la liste des statistiques est regroupée dans une note de tableau qui peut vite devenir un peu confuse.
tbl <- trial %>% tbl_summary( include = c(age, marker, grade), by = trt, statistic = list( age ~ "{median} [{p25} - {p75}]", marker ~ "{mean} ({sd})"
La fonction
add_stat_label
permets d’indiquer le type de statistique à côté du nom des variables ou bien dans une colonne dédiée, plutôt qu’en note de tableau.Forcer le type de variable (type, value)
Comme abordé plus haut,
gtsummary
détermine automatiquement le type de chaque variable. Par défaut, la variabeage
est traitée comme variable continue,death
comme dichotomique (seule la valeur 1 est affichée) etgrade
comme variable catégorielle.trial %>% tbl_summary( include = c(grade, age, death)
Il est cependant possible de forcer un certain type avec l’argument
type
. Précision, lorsque l’on force une variable en dichotomique, il faut indiquer avecvalue
la valeur à afficher (les autres sont alors masquées).trial %>% tbl_summary( include = c(grade, age, death), type = list( grade ~ "dichotomous", age ~ "categorical", death ~ "categorical" value = grade ~ "III", label = grade ~ "Grade III"
Afficher des statistiques sur plusieurs lignes (continuous2)
Pour les variables continues,
gtsummary
a introduit un type de variable"continuous2"
, qui doit être attribué manuellement viatype
, et qui permets d’afficher plusieurs lignes de statistiques (en indiquant plusieurs chaînes de caractères dansstatistic
). À noter le sélecteur dédiéall_continuous2
.trial %>% tbl_summary( include = c(age, marker, ttdeath), type = c(age, marker) ~ "continuous2", statistic = all_continuous2() ~ c("{median} ({p25} - {p75}", "{mean} ({sd})", "{min} - {max}")
Mise en forme des statistiques (digits)
L’argument
digits
permet de spécifier comment mettre en forme les différentes statistiques. Le plus simple est d’indiquer le nombre de décimales à afficher. Il est important de tenir compte que plusieurs statistiques peuvent être affichées pour une même variable. On peut alors indiquer une valeur différente pour chaque statistique.trial %>% tbl_summary( include = c(age, stage), by = trt, digits = list( all_continuous() ~ 1, all_categorical() ~ c(0, 1)
Au lieu d’un nombre de décimales, on peut indiquer plutôt une fonction à appliquer pour mettre en forme le résultat. Par exemple,
gtsummary
fournit les fonctions suivantes :style_number
pour les nombres de manière générale,style_percent
pour les pourcentages (les valeurs sont multipliées par 100, mais le symbole % n’est pas ajouté),style_pvalue
pour les p-valeurs,style_sigfig
qui n’affiche (par défaut) que deux chiffres significatifs, ou encorestyle_ratio
qui est une variante destyle_sigfig
pour les ratios (comme les odds ratios) que l’on compare à 1.Il faiut bien noter que ce qui est attendu par
tbl_summary( include = marker, digits = all_continuous() ~ c(style_percent, style_pvalue, style_ratio)digits
, c’est une fonction et non le résultat d’une fonction. On indiquera donc le nom de la fonction sans parenthèse.Comme
digits
attends à recevoir une fonction (et non le résultat) d’une fonction, on ne peut pas passer directement des arguments aux fonctionsstyle_*()
degtsummary
. Pour cela il faut créer une fonction à la levée :trial %>% tbl_summary( include = marker, statistic = ~"{mean} pour 100", digits = ~ function(x) { style_percent(x, digits = 1)
Une syntaxe alternative consiste à avoir recours à la fonction
partial
depurrr
qui permet d’appelerpartiellementune fonction et de renvoyer une nouvelle fonction.trial %>% tbl_summary( include = marker, statistic = ~"{mean} pour 100", digits = ~ purrr::partial(style_percent, digits = 1)
À noter dans l’exemple précédent que les fonctions
style_*()
degtsummary
tiennent compte du thème défini (ici la virgule comme séparateur de décimale).Pour une mise en forme plus avancée des nombres, il faut se tourner vers l’extension
scales
(choir le chapitre dédié). ATTENTION : les fonctions descales
n’héritent pas des paramètres du thème gtsummary actif. Il faut donc personnaliser le séparateur de décimal dans l’appel à la fonction.trial %>% tbl_summary( include = marker, statistic = ~"{mean}", digits = ~ scales::label_number(accuracy = .01, suffix = " ng/mL", decimal.mark = ",")
Données manquantes (missing, missing_text)
Le paramètre
include = c(trt, age), missing = "always", missing_text = "Nbre observations manquantes"missing
permets d’indiquer s’il faut afficher le nombre d’observations manquantes (c’est-à-dire égales àNA
) :"ifany"
(valeur par défaut) affiche ce nombre seulement s’il y en a,"no"
masque ce nombre et"always"
force l’affichage de ce nombre même s’il n’y pas de valeur manquante. Le paramètremissing_text
permets de personnaliser le texte affiché.Il est à noter, pour les variables catégorielles, que les valeurs manquantes ne sont jamais pris en compte pour le calcul des pourcentages. Pour les inclure dans le calcul, il faut les transformer en valeurs explicites, par exemple avec
fct_explicit_na
deforcats
.trial %>% mutate(response = response %>% as.factor() %>% forcats::fct_explicit_na(na_level = "non observé")) %>% tbl_summary(include = response)
Warning: There was 1 warning in `mutate()`. ℹ In argument: `response = response %>% as.factor() %>% forcats::fct_explicit_na(na_level = "non observé")`. Caused by warning: ! `fct_explicit_na()` was deprecated in forcats 1.0.0. ℹ Please use `fct_na_value_to_level()` instead.
Étiquettes des variables (label)
gtsummary
, par défaut, prends en compte les étiquettes de variables, si elles existent, et sinon utilisera le nom de chaque variable dans le tableau. Pour rappel, les étiquettes de variables peuvent être manipulées avec l’extensionlabelled
et les fonctionsvar_label
etset_variable_labels
.Il est aussi possible d’utiliser l’option
label
detbl_summary
pour indiquer des étiquettes personnalisées.iris %>% labelled::set_variable_labels( Petal.Length = "Longueur du pétale", Petal.Width = "Largeur du pétale" ) %>% tbl_summary(label = Species ~ "Espèce")
Pour modifier les modalités d’une variable catégorielle, il faut modifier en amont les niveaux du facteur correspondant.
Afficher les effectifs (add_n)
La fonction
add_n
permets d’ajouter une colonne avec le nombre d’observations (non manquantes par défaut). Plusieurs options permettent de personnaliser le résultat :col_label
pour modifier l’intitulé de la colonne;statistic
pour personnaliser la ou les statistiques affichées (la liste des statistiques disponibles est disponible dans le fichier d’aideadd_n.tbl_summary
);last
pour la positition de la colonne;footnote
pour l’ajout d’une note de tableau.Mise en forme du tableau (bold_labels, italicize_levels)
Les fonctions
bold_labels
,bold_levels
,italicize_labels
etitalicize_levels
permettent d’afficher les étiquettes de variables et les modalités des variables catégorielles en gras ou en italique.trial %>% tbl_summary( include = c(marker, grade, stage), by = trt ) %>% bold_labels() %>% italicize_levels()
Modifer en-têtes et notes (modify_header, modify_spanning_header, modify_footnote)
La fonction
modify_header
permet de modifier les en-têtes des colonnes,modify_spanning_header
d’ajouter un chapeau regroupant plusieurs colonnes etmodify_footnote
. On doit indiquer une formule ou une liste de formules indiquant les colonnes concernées et la modification souhaitée.Il faut néanmoins connaître le nom interne des différentes colonnes. Ceux-ci peuvent âtre affichés avec la fonction
show_header_names
:tbl <- trial %>% tbl_summary( include = c(age, grade), by = trt ) %>% add_overall() %>% add_p()
ℹ 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ètreby
) et p.value la colonne crée paradd_p
. Lorsqu’il y a un paramètreby
, des colonnes nommées stat_1, stat_2, etc. sont crées pour chaque valeur deby
. La fonctionall_stat_cols
permets de sélectionner toutes les colonnes dont le nom commence par stat_. On peut également utiliserall_stat_cols(stat_0 = FALSE)
sélectionner toutes les colonnes associées àby
mais pas celle crée paradd_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 valeurNA
peut être utilisée pour supprimer les notes associées aux colonnes concernées.tbl %>% modify_header( list( label ~ "**Variable**", all_stat_cols(stat_0 = FALSE) ~ "_{level}_ (n={n}, {style_percent(p)}%)", stat_0 ~ "**TOTAL** (n={N})", p.value ~ "**Test de comparaison** (p-valeur)" ) %>% modify_footnote(everything() ~ NA) %>% modify_spanning_header(all_stat_cols() ~ "**Traitement**")
Tests de comparaisons (add_p, separate_p_footnotes)
Lorsqu’une variable
by
est définie, la fonctionadd_p
permets d’ajouter des tests de comparaisons entre les groupes et d’afficher les p-valeurs.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é avecwilcox.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é avecfisher.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 fonctionseparate_p_footnotes
peut être utilisée pour créer une note de tableau différente pour chaque test. Le paramètrepvalue_fun
permet d’indiquer une fonction personnalisée pour la mise en forme des p-valeurs.trial %>% tbl_summary( include = c(trt, marker, age, response, stage), statistic = age ~ "{mean} ({sd})", by = trt ) %>% add_stat_label() %>% add_p( test = list( response ~ "fisher.test", age ~ "t.test" pvalue_fun = scales::label_pvalue(accuracy = .0001) ) %>% separate_p_footnotes()
Intervalles de confiance (add_ci)
La fonction
add_ci
permets d’ajouter des intervalles de confiance dans des colonnes additionnelles. ATTENTION : par défaut, pour les variables continues, cela calcule les intervalles de confiance d’une moyenne et non d’une médiane. Le type d’intervalle peut être modifié avecmethod
(par exemple"wilcox.test"
pour l’intervalle de confiance d’une médiane).statistic
permet de personnaliser la présentation de l’intervalle.conf.level
permets de changer le niveau de confiance.style_fun
permets de modifier la fonction de formatage desmethod = ~"wilcox.test", statistic = ~"entre {conf.low} et {conf.high}", conf.level = .9, style_fun = ~ scales::label_number(accuracy = .01, decimal.mark = ",")trial %>% tbl_summary( include = c(age, stage), by = trt, statistic = all_continuous() ~ "{mean}" ) %>% add_overall() %>% add_ci()
Différences entre groupes (add_difference)
Si la variable spécfiée dans
by
a exactement 2 niveaux, il est possible de calculer la différence entre deux moyennes (variable continue) ou entre deux proportions (variables dichotomiques uniquement, pas les variables catégorielles), d’afficher l’intervalle de confiance de cette différence et la p-valeur associée (la différence est-elle significativement différente de 0) avecadd_difference
.trial %>% tbl_summary( include = c(age, marker, response), by = trt, statistic = list( all_continuous() ~ "{mean}", all_categorical() ~ "{p}%" digits = list( all_continuous() ~ 2, all_categorical() ~ 1 ) %>% add_difference()
Tableau croisé avec tbl_cross()
La fonction
tbl_cross
est une variation detbl_summary
permettant de croiser deux variables spécfiées avec les argumentsrow
etcol
. Le type de pourcentage peut-être précisé avec l’arguementpercent
. Il est possible d’ajouter le résultat d’un test du Chi² avecadd_p.tbl_cross
.Données pondérées et tbl_svysummary()
La fonction
tbl_svysummary
est similaire àtbl_summary
à l’exception qu’elle prend en entrée un objet de typesurvey
défini avec l’extension homonyme. Cela permet de définir une pondération des observations et un plan d’échantillonnage complexe. Les options detbl_svysummary
sont similaires et il est possible d’utiliser les autres fonctions degtsummary
telles queadd_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
.Titanic %>% as.data.frame() %>% survey::svydesign(~1, data = ., weights = ~Freq) %>% tbl_svysummary( by = Survived, percent = "row" ) %>% add_stat_label(location = "column") %>% add_n() %>% add_overall(last = TRUE) %>% add_p() %>% separate_p_footnotes()
tbl_continuous()
La fonction
tbl_continuous
permets de résumer une variable continue en fonction de deux ou plusieurs variables catégorielles.Par exemple, pour afficher l’âge moyen de plusieurs sous-groupes :
trial %>% tbl_continuous( variable = age, statistic = ~"{mean}", include = c(stage, grade), by = trt, digits = ~1
tbl_custom_summary()
La fonction
tbl_custom_summary
permets encore plus de personnalisation quetbl_continuous
.Comme précédemment, un tableau va être créé avec les paramètres
include
etby
. On doit également fournir viastat_fns
une fonction personnalisée qui va recevoir un sous tableau de données (obtenu en croisantinclude
etby
), contenant toutes les variables du fichier, et qui renverra des statistiques personnalisées que l’on affichera avecstatistic
. 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 etoverall_raw_last
de choisir si on souhaite l’afficher en début ou en fin de tableau.tbl_custom_summary() & continuous_summary()
La fonction
continuous_summary
permet de reproduire avectbl_custom_summary
le fonctionnement detbl_continuous
.continuous_summary
prend un seul argument (le nom d’une variable du fichier). Les statistiques à afficher sont directement précisées avecstatistic
.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.tbl_custom_summary() & proportion_summary()
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é avecstatistic
et la mise enforme avecdigits
.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 = "")
tbl_custom_summary() & ratio_summary()
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 fonctionpoisson.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)"
tbl_custom_summary() & écriture d’une fonction personnalisée
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 viastat_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 devariable
et deby
. Il faut noter que les valeurs manquantes (NA
) devariable
sont également exclues dedata
.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 variableby
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’argumentstatistic
detbl_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 exemplema_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 dansstatistic
.Voyons un premier exemple, avec une fonction calculant la somme de marker et l’âge moyen.
ma_fonction <- function(data, ...) { marker_sum <- sum(data$marker, na.rm = TRUE) mean_age <- mean(data$age, na.rm = TRUE) dplyr::tibble( marker_sum = marker_sum, mean_age = mean_age ma_fonction(trial)
Construisons un tableau à partir de cette dernière.
trial %>% tbl_custom_summary( include = c(stage, grade), by = trt, stat_fns = ~ma_fonction, statistic = ~"A: {mean_age} - M: {marker_sum}", digits = everything() ~ c(1, 0), overall_row = TRUE ) %>% add_overall(last = TRUE) %>% modify_footnote( update = all_stat_cols() ~ "A: âge moyen - M: somme de marker" ) %>% bold_labels()
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 syntaxedata[[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()
add_stat()
D’un usage plus avancé,
add_stat
permets de rajouter une colonne de statistiques personnalisées à un objetgtsummary
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.
Résultats d’un modèle avec tbl_regression()
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’extensionbroom.helpers
et est donc compatible avec tous les types de modèles compatibles.Afficher seulement certains coefficients (include)
Le paramètre
include
permets de choisir les variables / termes à afficher.Étiquettes des variables (label)
On peut personnaliser les étiquettes des variables avec
label
.mod %>% tbl_regression(label = list( trt ~ "Traitement", "grade:age" ~ "Interaction entre grade et âge"
Exponentiation des coefficients (exponentiate)
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
.Changer l’intitulé des colonnes
Comme pour tout tableau
gtsummary
, l’intitulé des colonnes peut être modifié avecmodify_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**
Afficher des étoiles de signification (add_significance_stars)
La fonction
add_significance_stars
ajoute des étoiles de significativité à côté des coefficients. Les optionshide_ci
,hide_p
ethide_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
Variables dichotomiques sur une ligne (show_single_row)
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’indiquerall_dichotomous
()
pour appliquer cette option à toutes les variables dichotomiques.Afficher l’intercept (intercept)
Par défaut, l’intercept n’est pas affiché. Mais on peut forcer son affichage avec
intercept = TRUE
.Mise en forme des coefficients (estimate_fun, pvalue_fun)
L’argument
estimate_fun
permet de fournir une fonction qui sera utilisée pour mettre en forme les coefficients (et les intervalles de confiance) etpvalue_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)
Afficher les coefficients pour les références (add_estimate_to_reference_rows)
L’option
add_estimate_to_reference_rows = TRUE
ajoute la valeur du coefficient pour les modalités de références.P-valeurs globales (add_global_p)
La fonction
add_global_p
calcule une p-valeur globale pour chaque variable. On ajouterakeep = 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.
Ajouter les VIF (add_vif)
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
.1 OR = rapport de cotes, IC = intervalle de confiance, GVIF = Generalized Variance Inflation Factor 2 GVIF^[1/(2*df)]there are higher-order terms (interactions) in this model consider setting type = 'predictor'; see ?vif
Représenter graphiquement le modèle (plot)
Nous avons déjà abordé dans d’autres chapitres la fonction
ggcoef_model
deGGally
pour la représentation graphiques des coefficients. Pour un graphique rapide, on peut appliquerplot()
à un tableau généré avectbl_regression
pour produire rapidement un graphique des coefficients.Cependant, si l’on souhaite plus d’options de personnalisation, on utilisera directement
ggcoef_model
deGGally
.Registered S3 method overwritten by 'GGally': method from +.gg ggplot2
Afficher des statistiques globales du modèle (add_glance_table, add_glance_source_note)
La méthode
glance
debroom
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 avecadd_glance_source_note
. Le paramètreinclude
permets de choisir les éléments à afficher parmi les colonnes du tableau générés parglance
.tbl_stack() & tbl_merge()
La fonction
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é")tbl_stack
permets decollerdeux (ou plus) tableaux l’un au-dessus de l’autre tandis quetbl_merge
les placera côte-à-côte, en s’assurant qu’une même variable sera bien affichée sur la même ligne.tbl_strata()
La fonction
tbl_strata
permet de calculer un tableaugtsummary
pour chaque modalité d’une variable catégorielle définie viastrata
, 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.
tbl_split()
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é.Régressions univariées multiples avec tbl_uvregression()
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 avecy
. L’argumentmethod
indique la fonction à utiliser pour le calcul des modèles univariés, par exempleglm
pour une régression logistique ordinale. On pourra indiquer des paramètres à transmettre à cette fonction avecmethod.args
, par exemplelist(family = binomial)
dans le cadre d’une régreession logistique binaire.tbl_uni <- tbl_uvregression( trial %>% select(response, age, grade, stage), method = glm, y = response, method.args = list(family = binomial), exponentiate = TRUE, hide_n = TRUE tbl_uni
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é**")
Tables de survie avec tbl_survfit()
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 avectimes
.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)
Exporter un tableau
Les tableaux produits par
gtsummary
peuvent être rendus avec plusieurs moteurs de tableaux, grace aux fonctionsas_flex_table
,as_hux_table
,as_kable_extra
, etas_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).
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
degt
.Pour exporter un tableau dans un fichier Word, on pourra avoir recours à
save_as_docx
deflextable
.Plus d’options avec bstfun
L’extension
bstfun
est une petite sœur degtsummary
, 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 dansgtsummary
.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/.
tbl_likert()
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
Attachement du package : 'bstfun'tbl_likert
debstfun
est plus adaptée pour présenter ce type de données.L'objet suivant est masqué depuis 'package:gtsummary': trial
Ajouter un graphique de tendances (add_sparkline)
La fonction
add_sparkline
ajoute une représentation graphique de la distribution d’une variable continue.trial %>% tbl_summary(include = c(age, marker)) %>% add_sparkline(column_header = "**Distribution**")
Représentation graphique des coefficients dans le tableau (add_inline_forest_plot)
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.Forest plot (as_forest_plot)
La fonction
as_forest_plot
permets d’afficher un graphique des coefficients utilisant la fonctionforestplot
de l’extension homonymeforestplot
à partir d’un tableau construit avectbl_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.