Deskriptiv tabell (Baseline, Table 1)

Inom flera områden (medicin, ekonomi, etc) behövs en inledande beskrivning av studiepopulationen. Sådana beskrivningar brukar utgöra studiens Table 1, vilket är den första tabellen i studien. Produktion av Table 1 är således en del av många studier. För att skapa Table 1 använder vi paketet tableone. Användning av detta paketet är mycket enkelt och visas steg för steg här nedan.

Börja med att aktivera tidyverse, samt installera och aktivera tableone:

## Aktivera tidyverse
library(tidyverse)

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

## Aktivera tableone
library(tableone)

I detta exempel använder vi Right Heart Catetherization (RHC), som är en klinisk studie. Ladda ner data till R genom nedanstående kommando. Som framgår nedan sparar vi data till objektet rhc.

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

Variabelnamnen i en data frame är inte alltid lämpliga för presentation i en rapport. Därför använder vi paketet labelled, vilket gör det möjligt att ge varje variabel en label (etikett), som kan användas i presentationer och rapporter. Installera och aktivera paketet labelled:

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

Från rhc data väljer vi de kolumner (variabler) som skall vara med i Table 1.

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

Vi fortsätter genom att ge varje variabel en label. Det görs genom följande kod:

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

Skapa sedan första objektet, som vi kallar results. Funktionen vi använder heter CreateTableOne och den har argumenten vars, strata och data. Vi anger att vars är lika med alla kolumnnamnen i rhc2 (names(rhc2)), och att strata är kolumnen death. Detta kommer ge oss en Table 1 stratifierat på death. Vi specificerar också att data kommer från rhc2.

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

I nästa steg behöver vi tillämpa funktionen print() på föregående objekt (results). Print används för att styra vilken information som Table 1 skall innehålla. Som framgår här nedan finns en rad inställningar som kan justeras efter tycke och smak.

results2 <- as_tibble(print(results,
                             # Antal decimaler på kategoriska variabler
                             catDigits=2,
                             # Antal decimaler på kontinuerliga variabler
                             contDigits=1,
                             # Antal decimaler på p-värden
                             pDigits=5,
                             # Visa missing i en kolumn
                             missing=TRUE,
                             # Ange om det är medelvärden, SD eller medianer
                             explain=TRUE,
                             # Skriv inte ut resultatet förrän vi ber om det
                             printToggle=FALSE,
                             # Presentera P-värden
                             test=TRUE,
                             # Presentera standardized mean difference
                             smd=TRUE,
                             # Ta bort onödiga mellanrum
                             noSpaces=TRUE,
                             # Ska variabel labels användas istället?
                             varLabels=TRUE,
                             # ange om någon variabel inte är normalfördelad
                             nonnormal=c('age')),
                             # Ska radnamnen behållas, i så fall vad skall kolumnen heta?
                             rownames="Variable")

## Om du använder ett vanligt R-skript skriver du ut resultatet som följer:
results2

## Om du använder R Markdown skriver du ut resultatet som följer:
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