Deskriptiv tabel (baseline, Table 1)

Inden for flere områder (medicin, økonomi osv.) er der brug for en indledende beskrivelse af studiepopulationen. Sådanne beskrivelser udgør normalt studiets Table 1, som er den første tabel i studiet. Udarbejdelse af Table 1 er således en del af mange studier. For at lave Table 1 bruger vi pakken tableone. Det er meget enkelt at bruge denne pakke, og det vises trin for trin herunder.

Start med at aktivere tidyverse samt installere og aktivere tableone:

## Aktivér tidyverse
library(tidyverse)

## Installér tableone
install.packages("tableone")

## Aktivér tableone
library(tableone)

I dette eksempel bruger vi Right Heart Catetherization (RHC), som er et klinisk studie. Hent data ind i R med nedenstående kommando. Som det fremgår nedenfor, gemmer vi data i objektet rhc.

## Importér data
rhc <- read.csv("https://hbiostat.org/data/repo/rhc.csv", header = TRUE)

Variabelnavnene i en data frame er ikke altid egnede til præsentation i en rapport. Derfor bruger vi pakken labelled, som gør det muligt at give hver variabel en label (etiket), der kan bruges i præsentationer og rapporter. Installér og aktivér pakken labelled:

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

Fra rhc-data vælger vi de kolonner (variabler), der skal indgå i Table 1.

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

Vi fortsætter med at give hver variabel en label. Det gøres med følgende kode:

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")

Opret derefter det første objekt, som vi kalder results. Funktionen, vi bruger, hedder CreateTableOne, og den har argumenterne vars, strata og data. Vi angiver, at vars er lig med alle kolonnenavnene i rhc2 (names(rhc2)), og at strata er kolonnen death. Det giver os en Table 1 stratificeret efter death. Vi angiver også, at data kommer fra rhc2.

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

I næste trin skal vi anvende funktionen print() på det foregående objekt (results). Print bruges til at styre, hvilke oplysninger Table 1 skal indeholde. Som det fremgår herunder, er der en række indstillinger, der kan justeres efter smag og behov.

results2 <- as_tibble(print(results,
                             # Antal decimaler for kategoriske variabler
                             catDigits=2,
                             # Antal decimaler for kontinuerte variabler
                             contDigits=1,
                             # Antal decimaler for p-værdier
                             pDigits=5,
                             # Vis manglende værdier (missing) i en kolonne
                             missing=TRUE,
                             # Angiv, om det er middelværdier, SD eller medianer
                             explain=TRUE,
                             # Udskriv ikke resultatet, før vi beder om det
                             printToggle=FALSE,
                             # Præsentér p-værdier
                             test=TRUE,
                             # Præsentér standardized mean difference
                             smd=TRUE,
                             # Fjern unødvendige mellemrum
                             noSpaces=TRUE,
                             # Skal variablernes labels bruges i stedet?
                             varLabels=TRUE,
                             # angiv, om nogen variabel ikke er normalfordelt
                             nonnormal=c('age')),
                             # Skal rækkenavnene bevares, og hvad skal kolonnen i så fald hedde?
                             rownames="Variable")

## Hvis du bruger et almindeligt R-script, udskriver du resultatet sådan her:
results2

## Hvis du bruger R Markdown, udskriver du resultatet sådan her:
library(knitr)
kableone(results2)

Resultat

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