Biomarker Analysis Catalog - Stable
  • Stable
    • Dev
  1. Graphs
  2. RFG
  3. RFG2
  • 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. RFG
  3. RFG2

RFG2A

Response Forest Graphs for Comparing Continuous Biomarker Effects Across Subgroups (Multiple Continuous Biomarkers)

RFG

  • Setup
  • Plot
  • Session Info

These templates are helpful when we are interested in modelling the effects of continuous biomarker variables on the binary response outcome, conditional on covariates and/or stratification variables included in (conditional) logistic regression models. We would like to assess how the estimates effects change when we look at different subgroups.

In detail the differences to RFG1 are the following:

  • The extract_rsp_subgroups() and tabulate_rsp_subgroups() functions used in RFG1 evaluate the treatment effects from two arms, across subgroups. On the other hand, the extract_rsp_biomarkers() and tabulate_rsp_biomarkers() functions used here in RFG2 evaluate the effects from continuous biomarkers on the probability for response.
  • The extract_rsp_subgroups() and tabulate_rsp_subgroups() functions only allow specification of a single treatment arm variable, while the extract_rsp_biomarkers() and tabulate_rsp_biomarkers() allow to look at multiple continuous biomarker variables at once.
  • In addition to the treatment arms, the use of extract_rsp_subgroups() and tabulate_rsp_subgroups() functions can be extended to other binary variables. For example, we could define the binarized ARM variable as AGE>=65 vs. AGE<65 and then look at the odds ratios across subgroups. For the extract_rsp_biomarkers() and tabulate_rsp_biomarkers() functions, we could use the original continuous biomarker variable AGE, and then look at the estimated effect across subgroups.

Similarly like in RFG1, we will use the cadrs data set from the random.cdisc.data package. Here we just filter for the Best Confirmed Overall Response by Investigator and patients with measurable disease at baseline, and define a new variable COMPRESP to include complete responses only.

Code
library(tern)
library(dplyr)
library(hermes)

adrs <- random.cdisc.data::cadrs

adrs_f <- adrs %>%
  df_explicit_na() %>%
  filter(PARAMCD == "BESRSPI", BMEASIFL == "Y") %>%
  mutate(COMPRESP = (AVALC == "CR"))

Here we specify that we would like to analyze the two continuous biomarkers BMRKR1 and AGE, conditional on the covariate SEX, in the subgroups defined by the levels of BMRKR2.

Code
df <- extract_rsp_biomarkers(
  variables = list(
    rsp = "COMPRESP",
    biomarkers = c("BMRKR1", "AGE"),
    covariates = "SEX",
    subgroups = "BMRKR2"
  ),
  data = adrs_f
)

result <- tabulate_rsp_biomarkers(df, vars = c("n_tot", "n_rsp", "prop", "or", "ci"))

We can look at the result in the console already.

Code
result
                                  Total n   Responders   Response (%)   Odds Ratio      95% CI   
—————————————————————————————————————————————————————————————————————————————————————————————————
Age                                                                                              
  All Patients                      203        165          81.3%          1.01      (0.96, 1.06)
  Categorical Level Biomarker 2                                                                  
    LOW                             74          64          86.5%          1.07      (0.96, 1.18)
    MEDIUM                          65          49          75.4%          1.04      (0.95, 1.15)
    HIGH                            64          52          81.2%          0.92      (0.84, 1.01)
Continuous Level Biomarker 1                                                                     
  All Patients                      203        165          81.3%          1.02      (0.91, 1.14)
  Categorical Level Biomarker 2                                                                  
    LOW                             74          64          86.5%          1.05      (0.83, 1.33)
    MEDIUM                          65          49          75.4%          1.00      (0.85, 1.18)
    HIGH                            64          52          81.2%          1.05      (0.84, 1.31)

Note that in addition to the Categorical Level Biomarker 2 subgroups we automatically also get the estimates for the overall patient population.

We can then produce the final forest plot using the g_forest() function on this tabular result.

Code
g_forest(result, xlim = c(0.7, 1.4))

Code
sessionInfo()
R version 4.4.2 (2024-10-31)
Platform: x86_64-pc-linux-gnu
Running under: Ubuntu 24.04.1 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] stats4    stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
 [1] hermes_1.10.0               SummarizedExperiment_1.36.0
 [3] Biobase_2.66.0              GenomicRanges_1.58.0       
 [5] GenomeInfoDb_1.42.3         IRanges_2.40.1             
 [7] S4Vectors_0.44.0            BiocGenerics_0.52.0        
 [9] MatrixGenerics_1.18.1       matrixStats_1.5.0          
[11] ggfortify_0.4.17            ggplot2_3.5.1              
[13] dplyr_1.1.4                 tern_0.9.7                 
[15] rtables_0.6.11              magrittr_2.0.3             
[17] formatters_0.5.10          

loaded via a namespace (and not attached):
 [1] Rdpack_2.6.2                DBI_1.2.3                  
 [3] httr2_1.1.0                 gridExtra_2.3              
 [5] biomaRt_2.62.1              rlang_1.1.5                
 [7] clue_0.3-66                 GetoptLong_1.0.5           
 [9] compiler_4.4.2              RSQLite_2.3.9              
[11] png_0.1-8                   vctrs_0.6.5                
[13] stringr_1.5.1               pkgconfig_2.0.3            
[15] shape_1.4.6.1               crayon_1.5.3               
[17] fastmap_1.2.0               dbplyr_2.5.0               
[19] backports_1.5.0             XVector_0.46.0             
[21] labeling_0.4.3              rmarkdown_2.29             
[23] UCSC.utils_1.2.0            purrr_1.0.4                
[25] bit_4.5.0.1                 xfun_0.51                  
[27] MultiAssayExperiment_1.32.0 zlibbioc_1.52.0            
[29] cachem_1.1.0                jsonlite_1.9.0             
[31] progress_1.2.3              blob_1.2.4                 
[33] DelayedArray_0.32.0         prettyunits_1.2.0          
[35] broom_1.0.7                 parallel_4.4.2             
[37] cluster_2.1.8               R6_2.6.1                   
[39] stringi_1.8.4               RColorBrewer_1.1-3         
[41] Rcpp_1.0.14                 assertthat_0.2.1           
[43] iterators_1.0.14            knitr_1.49                 
[45] Matrix_1.7-2                splines_4.4.2              
[47] tidyselect_1.2.1            abind_1.4-8                
[49] yaml_2.3.10                 doParallel_1.0.17          
[51] codetools_0.2-20            curl_6.2.1                 
[53] lattice_0.22-6              tibble_3.2.1               
[55] withr_3.0.2                 KEGGREST_1.46.0            
[57] evaluate_1.0.3              survival_3.8-3             
[59] BiocFileCache_2.14.0        xml2_1.3.6                 
[61] circlize_0.4.16             Biostrings_2.74.1          
[63] filelock_1.0.3              pillar_1.10.1              
[65] checkmate_2.3.2             foreach_1.5.2              
[67] generics_0.1.3              hms_1.1.3                  
[69] munsell_0.5.1               scales_1.3.0               
[71] glue_1.8.0                  nestcolor_0.1.3            
[73] tools_4.4.2                 forcats_1.0.0              
[75] cowplot_1.1.3               grid_4.4.2                 
[77] tidyr_1.3.1                 rbibutils_2.3              
[79] AnnotationDbi_1.68.0        colorspace_2.1-1           
[81] random.cdisc.data_0.3.16    GenomeInfoDbData_1.2.13    
[83] cli_3.6.4                   rappdirs_0.3.3             
[85] S4Arrays_1.6.0              ComplexHeatmap_2.22.0      
[87] gtable_0.3.6                digest_0.6.37              
[89] SparseArray_1.6.1           ggrepel_0.9.6              
[91] farver_2.1.2                rjson_0.2.23               
[93] htmlwidgets_1.6.4           memoise_2.0.1              
[95] htmltools_0.5.8.1           lifecycle_1.0.4            
[97] httr_1.4.7                  GlobalOptions_0.1.2        
[99] bit64_4.6.0-1              

Reuse

Copyright 2023, Hoffmann-La Roche Ltd.
RFG1A
RFG2B
Source Code
---
title: RFG2A
subtitle: Response Forest Graphs for Comparing Continuous Biomarker Effects Across Subgroups (Multiple Continuous Biomarkers)
categories: [RFG]
---

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

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

## Plot

Here we specify that we would like to analyze the two continuous biomarkers `BMRKR1` and `AGE`, conditional on the covariate `SEX`, in the subgroups defined by the levels of `BMRKR2`.

```{r}
df <- extract_rsp_biomarkers(
  variables = list(
    rsp = "COMPRESP",
    biomarkers = c("BMRKR1", "AGE"),
    covariates = "SEX",
    subgroups = "BMRKR2"
  ),
  data = adrs_f
)

result <- tabulate_rsp_biomarkers(df, vars = c("n_tot", "n_rsp", "prop", "or", "ci"))
```

We can look at the result in the console already.

```{r}
result
```

Note that in addition to the `Categorical Level Biomarker 2` subgroups we automatically also get the estimates for the overall patient population.

We can then produce the final forest plot using the `g_forest()` function on this tabular result.

```{r, fig.width = 15}
g_forest(result, xlim = c(0.7, 1.4))
```

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

Made with ❤️ by the Statistical Engineering Team StatisticalEngineering

  • License

  • Edit this page
  • Report an issue
Cookie Preferences