Tableau descriptif (caractéristiques initiales, Table 1)

Dans de nombreux domaines (médecine, économie, etc.), une description initiale de la population d'étude est nécessaire. Cette description constitue généralement la Table 1 de l'étude, c'est-à-dire le premier tableau de l'article. La production de la Table 1 fait donc partie de nombreuses études. Pour créer la Table 1, nous utilisons le package tableone. Son utilisation est très simple et est présentée étape par étape ci-dessous.

Commencez par charger tidyverse, puis installez et chargez tableone :

## Charger tidyverse
library(tidyverse)

## Installer tableone
install.packages("tableone")

## Charger tableone
library(tableone)

Dans cet exemple, nous utilisons les données Right Heart Catetherization (RHC), issues d'une étude clinique. Importez les données dans R à l'aide de la commande ci-dessous. Comme on le voit, nous enregistrons les données dans l'objet rhc.

## Importer les données
rhc <- read.csv("https://hbiostat.org/data/repo/rhc.csv", header = TRUE)

Les noms de variables d'un data frame ne se prêtent pas toujours à une présentation dans un rapport. C'est pourquoi nous utilisons le package labelled, qui permet d'attribuer à chaque variable un label (étiquette) utilisable dans les présentations et les rapports. Installez et chargez le package labelled :

install.packages("labelled")
library(labelled)

Dans les données rhc, nous sélectionnons les colonnes (variables) qui doivent figurer dans la Table 1.

rhc2 <- select(rhc,
               adld3p,
               age,
               alb1,
               amihx,
               aps1,
               bili1,
               ca,
               card,
               cardiohx,
               cat1,
               cat2,
               chfhx,
               chrpulhx,
               crea1,
               death)

Nous poursuivons en attribuant un label à chaque variable, à l'aide du code suivant :

var_label(rhc2) <- list(adld3p    = "ADL",
                        age       = "Age (years)",
                        alb1      = "Albumin (g/L)",
                        amihx	  = "Definite Myocardial Infarction",
                        aps1	  = "APACHE score",
                        bili1	  = "Bilirubin",
                        ca	  = "Cancer",
                        card	  = "Cardiovascular Diagnosis",
                        cardiohx  = "Cardiovascular disease",
                        cat1	  = "Primary disease category",
                        cat2	  = "Secondary disease category",
                        chfhx	  = "Congestive Heart Failure",
                        chrpulhx  = "Chronic Pulmonary Disease",
                        crea1	  = "Creatinine",
                        death	  = "Death at 180 days")

Créez ensuite un premier objet, que nous appelons results. La fonction utilisée s'appelle CreateTableOne et prend les arguments vars, strata et data. Nous indiquons que vars correspond à tous les noms de colonnes de rhc2 (names(rhc2)) et que strata est la colonne death. Nous obtiendrons ainsi une Table 1 stratifiée selon death. Nous précisons également que data provient de rhc2.

results <- CreateTableOne(vars=names(rhc2),
                          strata="death",
                          data=rhc2)

À l'étape suivante, nous devons appliquer la fonction print() à l'objet précédent (results). Print sert à déterminer les informations que doit contenir la Table 1. Comme on le voit ci-dessous, de nombreux paramètres peuvent être ajustés selon les préférences de chacun.

results2 <- as_tibble(print(results,
                             # Nombre de décimales pour les variables catégorielles
                             catDigits=2,
                             # Nombre de décimales pour les variables continues
                             contDigits=1,
                             # Nombre de décimales pour les valeurs p
                             pDigits=5,
                             # Afficher les données manquantes dans une colonne
                             missing=TRUE,
                             # Indiquer s'il s'agit de moyennes, d'écarts-types ou de médianes
                             explain=TRUE,
                             # Ne pas afficher le résultat avant que nous le demandions
                             printToggle=FALSE,
                             # Présenter les valeurs p
                             test=TRUE,
                             # Présenter la différence moyenne standardisée
                             smd=TRUE,
                             # Supprimer les espaces inutiles
                             noSpaces=TRUE,
                             # Faut-il utiliser les labels des variables à la place ?
                             varLabels=TRUE,
                             # indiquer si une variable ne suit pas une distribution normale
                             nonnormal=c('age')),
                             # Faut-il conserver les noms de lignes, et si oui, comment nommer la colonne ?
                             rownames="Variable")

## Si vous utilisez un script R classique, affichez le résultat comme suit :
results2

## Si vous utilisez R Markdown, affichez le résultat comme suit :
library(knitr)
kableone(results2)

Résultat

Variable Alive Dead P-value SMD Missing
n 2013 3722
ADL (mean (SD)) 1.0 (1.7) 1.4 (1.9) <0.00001 0.24675 74.9
Age (years) (median IQRIQR) 58.3 43.3,70.343.3, 70.3 66.2 54.3,75.654.3, 75.6 <0.00001 0.45396 0.0
Albumin (g/L) (mean (SD)) 3.1 (0.7) 3.1 (0.8) 0.02534 0.06359 0.0
Definite Myocardial Infarction (mean (SD)) 0.0 (0.2) 0.0 (0.2) 0.67296 0.01163 0.0
APACHE score (mean (SD)) 49.5 (18.2) 57.5 (20.3) <0.00001 0.41676 0.0
Bilirubin (mean (SD)) 1.7 (3.3) 2.6 (5.4) <0.00001 0.18905 0.0
Cancer (%) <0.00001 0.45295 0.0
Metastatic 36 (1.79) 348 (9.35)
No 1758 (87.33) 2621 (70.42)
Yes 219 (10.88) 753 (20.23)
Cardiovascular Diagnosis = Yes (%) 645 (32.04) 1286 (34.55) 0.05874 0.05327 0.0
Cardiovascular disease (mean (SD)) 0.2 (0.4) 0.2 (0.4) 0.00157 0.08850 0.0
Primary disease category (%) <0.00001 0.44903 0.0
ARF 1019 (50.62) 1471 (39.52)
CHF 181 (8.99) 275 (7.39)
Cirrhosis 66 (3.28) 158 (4.25)
Colon Cancer 3 (0.15) 4 (0.11)
Coma 89 (4.42) 347 (9.32)
COPD 176 (8.74) 281 (7.55)
Lung Cancer 3 (0.15) 36 (0.97)
MOSF w/Malignancy 36 (1.79) 363 (9.75)
MOSF w/Sepsis 440 (21.86) 787 (21.14)
Secondary disease category (%) <0.00001 0.51537 79.1
Cirrhosis 6 (2.17) 32 (3.46)
Colon Cancer 0 (0.00) 2 (0.22)
Coma 20 (7.25) 70 (7.58)
Lung Cancer 0 (0.00) 15 (1.62)
MOSF w/Malignancy 20 (7.25) 209 (22.62)
MOSF w/Sepsis 230 (83.33) 596 (64.50)
Congestive Heart Failure (mean (SD)) 0.1 (0.4) 0.2 (0.4) <0.00001 0.13331 0.0
Chronic Pulmonary Disease (mean (SD)) 0.2 (0.4) 0.2 (0.4) 0.02294 0.06342 0.0
Creatinine (mean (SD)) 1.9 (2.0) 2.3 (2.1) <0.00001 0.17245 0.0
Death at 180 days = Yes (%) 0 (0.00) 3722 (100.00) <0.00001 NaN 0.0