We will use the cadtte
data set from the random.cdisc.data
package for the time-to-event summary table. We start by filtering the adtte
data set for the overall survival observations, converting time of overall survival to months, creating new variables for event and non-event information and binarizing the ARM
variable.
Code library (tern)
library (dplyr)
adtte <- random.cdisc.data:: cadtte %>%
df_explicit_na () %>%
filter (
PARAMCD == "OS"
) %>%
mutate (
AVAL = day2month (AVAL),
AVALU = "Months" ,
is_event = CNSR == 0 ,
is_not_event = CNSR == 1 ,
ARM_BIN = fct_collapse_only (
ARM,
CTRL = c ("B: Placebo" ),
TRT = c ("A: Drug X" , "C: Combination" )
)
)
We can add the summary of an analysis with Cox Proportional Hazards models stratified by SEX
to the table above using coxph_pairwise()
.
Code lyt <- basic_table () %>%
split_cols_by (
var = "ARM_BIN" ,
ref_group = "CTRL"
) %>%
add_colcounts () %>%
analyze_vars (
vars = "is_event" ,
.stats = "count_fraction" ,
.labels = c (count_fraction = "Patients with event (%)" ),
nested = FALSE ,
show_labels = "hidden"
) %>%
analyze_vars (
vars = "is_not_event" ,
.stats = "count_fraction" ,
.labels = c (count_fraction = "Patients without event (%)" ),
nested = FALSE ,
show_labels = "hidden"
) %>%
surv_time (
vars = "AVAL" ,
var_labels = "Time to Event (months)" ,
is_event = "is_event" ,
table_names = "time_to_event"
) %>%
coxph_pairwise (
vars = "AVAL" ,
is_event = "is_event" ,
var_labels = c ("Unstratified Analysis" ),
control = control_coxph (pval_method = "log-rank" ),
table_names = "coxph_unstratified"
)
lyt2 <- lyt %>%
coxph_pairwise (
vars = "AVAL" ,
is_event = "is_event" ,
var_labels = c ("Stratified Analysis" ),
strat = "SEX" ,
control = control_coxph (pval_method = "log-rank" ),
table_names = "coxph_stratified"
)
build_table (lyt2, adtte)
CTRL TRT
(N=134) (N=266)
——————————————————————————————————————————————————————————————
Patients with event (%) 58 (43.3%) 127 (47.7%)
Patients without event (%) 76 (56.7%) 139 (52.3%)
Time to Event (months)
Median NA NA
95% CI (9.4, NA) (9.2, NA)
25% and 75%-ile 5.6, NA 5.4, NA
Range 0.9 to 16.3 {1} 0.5 to 16.4 {1}
Unstratified Analysis
p-value (log-rank) 0.4068
Hazard Ratio 1.14
95% CI (0.84, 1.56)
Stratified Analysis
p-value (log-rank) 0.4243
Hazard Ratio 1.13
95% CI (0.83, 1.55)
——————————————————————————————————————————————————————————————
{1} - Censored observation: range maximum
——————————————————————————————————————————————————————————————
Code
R version 4.4.1 (2024-06-14)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 22.04.4 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so; LAPACK version 3.10.0
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
time zone: Etc/UTC
tzcode source: system (glibc)
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_1.1.4 tern_0.9.5.9022 rtables_0.6.9.9014
[4] magrittr_2.0.3 formatters_0.5.9.9001
loaded via a namespace (and not attached):
[1] Matrix_1.7-0 gtable_0.3.5
[3] jsonlite_1.8.8 compiler_4.4.1
[5] tidyselect_1.2.1 stringr_1.5.1
[7] tidyr_1.3.1 splines_4.4.1
[9] scales_1.3.0 yaml_2.3.10
[11] fastmap_1.2.0 lattice_0.22-6
[13] ggplot2_3.5.1 R6_2.5.1
[15] generics_0.1.3 knitr_1.48
[17] forcats_1.0.0 rbibutils_2.2.16
[19] htmlwidgets_1.6.4 backports_1.5.0
[21] checkmate_2.3.2 tibble_3.2.1
[23] munsell_0.5.1 pillar_1.9.0
[25] rlang_1.1.4 utf8_1.2.4
[27] broom_1.0.6 stringi_1.8.4
[29] xfun_0.47 cli_3.6.3
[31] Rdpack_2.6.1 digest_0.6.37
[33] grid_4.4.1 lifecycle_1.0.4
[35] vctrs_0.6.5 evaluate_0.24.0
[37] glue_1.7.0 codetools_0.2-20
[39] survival_3.7-0 random.cdisc.data_0.3.15.9009
[41] fansi_1.0.6 colorspace_2.1-1
[43] purrr_1.0.2 rmarkdown_2.28
[45] tools_4.4.1 pkgconfig_2.0.3
[47] htmltools_0.5.8.1