Biomarker Analysis Catalog - Dev
  • Dev
    • Stable
  1. Graphs
  2. SFG
  • Index

  • Tables
    • CPMT
      • CPMT1
      • CPMT2
        • CPMT2A
      • CPMT3
    • DT
      • DT1
        • DT1A
        • DT1B
        • DT1C
      • DT2
        • DT2A
    • TET
      • TET1
        • TET1A

  • Graphs
    • AG
      • AG1
    • DG
      • DG1
        • DG1A
        • DG1B
      • DG2
      • DG3
        • DG3A
      • DG4
    • KG
      • KG1
        • KG1A
        • KG1B
      • KG2
        • KG2A
      • KG3
      • KG4
        • KG4A
        • KG4B
      • KG5
        • KG5A
        • KG5B
    • RFG
      • RFG1
        • RFG1A
      • RFG2
        • RFG2A
        • RFG2B
        • RFG2C
      • RFG3
    • RG
      • RG1
        • RG1A
        • RG1B
        • RG1C
      • RG2
        • RG2A
      • RG3
        • RG3A
        • RG3B
    • SPG
      • SPG1
      • SPG2
    • RNAG
      • RNAG1
      • RNAG2
      • RNAG3
      • RNAG4
      • RNAG5
      • RNAG6
      • RNAG7
      • RNAG8
      • RNAG9
      • RNAG10
    • SFG
      • SFG1
        • SFG1A
        • SFG1B
      • SFG2
        • SFG2A
        • SFG2B
        • SFG2C
        • SFG2D
      • SFG3
        • SFG3A
      • SFG4
      • SFG5
        • SFG5A
        • SFG5B
        • SFG5C
      • SFG6
        • SFG6A
        • SFG6B
        • SFG6C
  1. Graphs
  2. SFG

SFG1

Survival Forest Graphs for Overall Population and by Categorical Biomarker

SFG

  • Setup
  • Plot
  • Session Info

We will use the cadtte data set from the random.cdisc.data package to create the survival forest graph. We start by filtering the adtte data set for the overall survival observations, converting time of overall survival to months, creating a new variable for event information, binarizing the ARM variable and creating a binned age variable by using the function cut_quantile_bins(). Note that we do not include the boundaries 0 and 1 in the corresponding cutoffs vector AGE_probs, but only the true cutoff probabilities to use (here 0.5, i.e. the median). We restrict the analysis of the biomarker variables BMRKR1 and BMRKR2 to the BEP by setting them as missing for the non-BEP.

We also relabel the biomarker evaluable population flag variable BEP01FL and the categorical biomarker variable BMRKR2 to update the display label of these variables in the graph.

Code
library(tern)
library(dplyr)

AGE_probs <- 0.5

adtte <- random.cdisc.data::cadtte %>%
  df_explicit_na() %>%
  filter(
    PARAMCD == "OS"
  ) %>%
  mutate(
    AVAL = day2month(AVAL),
    AVALU = "Months",
    is_event = CNSR == 0,
    ARM_BIN = fct_collapse_only(
      ARM,
      CTRL = "B: Placebo",
      TRT = c("A: Drug X", "C: Combination")
    ),
    AGE_BIN = cut_quantile_bins(AGE, probs = AGE_probs),
    BMRKR1 = ifelse(BEP01FL == "N", NA, BMRKR1),
    BMRKR2 = fct_explicit_na_if(BMRKR2, BEP01FL == "N")
  ) %>%
  var_relabel(
    BEP01FL = "BEP",
    BMRKR2 = "Biomarker (Categorical)"
  )

We use the extract_survival_subgroups() function to calculate the survival forest results for the subgroups defined by the levels of the factor variables given in subgroups. We then tabulate the estimated statistics with the function tabulate_survival_subgroups() to be able to use them as an input for forest plot. Note that for the argument vars we could select different statistics, but the statistics n_tot, hr and ci are required.

Code
tbl <- extract_survival_subgroups(
  variables = list(
    tte = "AVAL",
    is_event = "is_event",
    arm = "ARM_BIN",
    subgroups = c("BEP01FL", "BMRKR2")
  ),
  label_all = "ITT",
  data = adtte
)

result <- basic_table() %>%
  tabulate_survival_subgroups(
    df = tbl,
    vars = c("n_tot_events", "n", "n_events", "median", "hr", "ci"),
    time_unit = adtte$AVALU[1]
  )

We can remove the last line showing the <Missing> category from the result table to display the survival forest plot only with non-missing categories for BMRKR2.

Code
result <- result[-9, , keep_topleft = TRUE]

We can now produce the forest plot using the g_forest() function from tern based on this trimmed result table.

Code
g_forest(result)

Code
sessionInfo()
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] labeling_0.4.3                generics_0.1.3               
[17] knitr_1.48                    forcats_1.0.0                
[19] rbibutils_2.2.16              htmlwidgets_1.6.4            
[21] backports_1.5.0               checkmate_2.3.2              
[23] tibble_3.2.1                  munsell_0.5.1                
[25] pillar_1.9.0                  rlang_1.1.4                  
[27] utf8_1.2.4                    broom_1.0.6                  
[29] stringi_1.8.4                 xfun_0.47                    
[31] cli_3.6.3                     withr_3.0.1                  
[33] Rdpack_2.6.1                  digest_0.6.37                
[35] grid_4.4.1                    cowplot_1.1.3                
[37] lifecycle_1.0.4               vctrs_0.6.5                  
[39] evaluate_0.24.0               glue_1.7.0                   
[41] farver_2.1.2                  codetools_0.2-20             
[43] survival_3.7-0                random.cdisc.data_0.3.15.9009
[45] fansi_1.0.6                   colorspace_2.1-1             
[47] purrr_1.0.2                   rmarkdown_2.28               
[49] tools_4.4.1                   pkgconfig_2.0.3              
[51] htmltools_0.5.8.1            

Reuse

Copyright 2023, Hoffmann-La Roche Ltd.
RNAG10
SFG1A
Source Code
---
title: SFG1
subtitle: Survival Forest Graphs for Overall Population and by Categorical Biomarker
categories: [SFG]
---

------------------------------------------------------------------------

::: panel-tabset
{{< include setup.qmd >}}

## Plot

We use the `extract_survival_subgroups()` function to calculate the survival forest results for the subgroups defined by the levels of the factor variables given in `subgroups`.
We then tabulate the estimated statistics with the function `tabulate_survival_subgroups()` to be able to use them as an input for forest plot.
Note that for the argument `vars` we could select different statistics, but the statistics `n_tot`, `hr` and `ci` are required.

```{r}
tbl <- extract_survival_subgroups(
  variables = list(
    tte = "AVAL",
    is_event = "is_event",
    arm = "ARM_BIN",
    subgroups = c("BEP01FL", "BMRKR2")
  ),
  label_all = "ITT",
  data = adtte
)

result <- basic_table() %>%
  tabulate_survival_subgroups(
    df = tbl,
    vars = c("n_tot_events", "n", "n_events", "median", "hr", "ci"),
    time_unit = adtte$AVALU[1]
  )
```

We can remove the last line showing the `<Missing>` category from the `result` table to display the survival forest plot only with non-missing categories for `BMRKR2`.

```{r}
result <- result[-9, , keep_topleft = TRUE]
```

We can now produce the forest plot using the `g_forest()` function from `tern` based on this trimmed `result` table.

```{r, fig.width = 15}
g_forest(result)
```

{{< include ../../misc/session_info.qmd >}}
:::

Made with ❤️ by the Statistical Engineering Team StatisticalEngineering

  • License

  • Edit this page
  • Report an issue
Cookie Preferences