Biomarker Analysis Catalog - Stable
  • Stable
    • Dev
  1. Graphs
  2. SFG
  3. SFG2
  4. SFG2B
  • 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
  3. SFG2
  4. SFG2B

SFG2B

Survival Forest Graph for Overall Population and by Continuous Biomarker with “Above and Below Percentage” Cutoffs Biomarker

SFG

  • Setup
  • Plot
  • Session Info

We prepare the data similarly as in SFG1. In particular we use again the cut_quantile_bins() function, here to obtain quartile bins of the continuous biomarker BMRKR1.

Code
library(tern)
library(dplyr)

BMRKR1_probs <- c(0.25, 0.5, 0.75)

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 = c("B: Placebo"),
      TRT = c("A: Drug X", "C: Combination")
    ),
    BMRKR1 = ifelse(BEP01FL == "N", NA, BMRKR1),
    BMRKR1_BIN = explicit_na(cut_quantile_bins(BMRKR1, BMRKR1_probs)),
    BMRKR2 = fct_explicit_na_if(BMRKR2, BEP01FL == "N")
  ) %>%
  var_relabel(
    BEP01FL = "BEP",
    BMRKR2 = "Biomarker (Categorical)",
    BMRKR1_BIN = "Biomarker (Binned)"
  )

In this template we are looking for each percentage cutoff at above vs. below subgroups: So we just provide yet another groups_lists specification for the BMRKR1_BIN binned variable.

Code
BMRKR1_BIN_levels <- levels(adtte$BMRKR1_BIN)

tbl <- extract_survival_subgroups(
  variables = list(
    tte = "AVAL",
    is_event = "is_event",
    arm = "ARM_BIN",
    subgroups = c("BEP01FL", "BMRKR1_BIN")
  ),
  label_all = "ITT",
  groups_lists = list(
    BMRKR1_BIN = list(
      "[0%, 25%]" = BMRKR1_BIN_levels[1],
      "(25%, 100%]" = BMRKR1_BIN_levels[2:4],
      "[0%, 50%]" = BMRKR1_BIN_levels[1:2],
      "(50%, 100%]" = BMRKR1_BIN_levels[3:4],
      "[0%, 75%]" = BMRKR1_BIN_levels[1:3],
      "(75%, 100%]" = BMRKR1_BIN_levels[4]
    )
  ),
  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 now produce the forest plot using the g_forest() function.

Code
g_forest(result)

Code
sessionInfo()
R version 4.5.2 (2025-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.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.26.so;  LAPACK version 3.12.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.2.1       tern_0.9.10       rtables_0.6.15    magrittr_2.0.5   
[5] formatters_0.5.12

loaded via a namespace (and not attached):
 [1] generics_0.1.4           tidyr_1.3.2              stringi_1.8.7           
 [4] lattice_0.22-9           digest_0.6.39            evaluate_1.0.5          
 [7] grid_4.5.2               RColorBrewer_1.1-3       fastmap_1.2.0           
[10] jsonlite_2.0.0           Matrix_1.7-5             backports_1.5.1         
[13] survival_3.8-6           purrr_1.2.1              scales_1.4.0            
[16] codetools_0.2-20         Rdpack_2.6.6             cli_3.6.5               
[19] nestcolor_0.1.3          rlang_1.2.0              rbibutils_2.4.1         
[22] cowplot_1.2.0            splines_4.5.2            withr_3.0.2             
[25] yaml_2.3.12              otel_0.2.0               tools_4.5.2             
[28] checkmate_2.3.4          ggplot2_4.0.2            forcats_1.0.1           
[31] broom_1.0.12             vctrs_0.7.2              R6_2.6.1                
[34] lifecycle_1.0.5          stringr_1.6.0            htmlwidgets_1.6.4       
[37] pkgconfig_2.0.3          pillar_1.11.1            gtable_0.3.6            
[40] glue_1.8.0               xfun_0.57                tibble_3.3.1            
[43] tidyselect_1.2.1         knitr_1.51               dichromat_2.0-0.1       
[46] farver_2.1.2             htmltools_0.5.9          rmarkdown_2.31          
[49] labeling_0.4.3           random.cdisc.data_0.3.16 compiler_4.5.2          
[52] S7_0.2.1                

Reuse

Copyright 2023, Hoffmann-La Roche Ltd.
SFG2A
SFG2C
Source Code
---
title: SFG2B
subtitle: Survival Forest Graph for Overall Population and by Continuous Biomarker with "Above and Below Percentage" Cutoffs Biomarker
categories: [SFG]
---

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

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

## Plot

In this template we are looking for each percentage cutoff at above vs. below subgroups: So we just provide yet another `groups_lists` specification for the `BMRKR1_BIN` binned variable.

```{r}
BMRKR1_BIN_levels <- levels(adtte$BMRKR1_BIN)

tbl <- extract_survival_subgroups(
  variables = list(
    tte = "AVAL",
    is_event = "is_event",
    arm = "ARM_BIN",
    subgroups = c("BEP01FL", "BMRKR1_BIN")
  ),
  label_all = "ITT",
  groups_lists = list(
    BMRKR1_BIN = list(
      "[0%, 25%]" = BMRKR1_BIN_levels[1],
      "(25%, 100%]" = BMRKR1_BIN_levels[2:4],
      "[0%, 50%]" = BMRKR1_BIN_levels[1:2],
      "(50%, 100%]" = BMRKR1_BIN_levels[3:4],
      "[0%, 75%]" = BMRKR1_BIN_levels[1:3],
      "(75%, 100%]" = BMRKR1_BIN_levels[4]
    )
  ),
  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 now produce the forest plot using the `g_forest()` function.

```{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