RFG2A
Response Forest Graphs for Comparing Continuous Biomarker Effects Across Subgroups (Multiple Continuous Biomarkers)
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()
andtabulate_rsp_subgroups()
functions used in RFG1 evaluate the treatment effects from two arms, across subgroups. On the other hand, theextract_rsp_biomarkers()
andtabulate_rsp_biomarkers()
functions used here in RFG2 evaluate the effects from continuous biomarkers on the probability for response. - The
extract_rsp_subgroups()
andtabulate_rsp_subgroups()
functions only allow specification of a single treatment arm variable, while theextract_rsp_biomarkers()
andtabulate_rsp_biomarkers()
allow to look at multiple continuous biomarker variables at once. - In addition to the treatment arms, the use of
extract_rsp_subgroups()
andtabulate_rsp_subgroups()
functions can be extended to other binary variables. For example, we could define the binarizedARM
variable asAGE>=65
vs.AGE<65
and then look at the odds ratios across subgroups. For theextract_rsp_biomarkers()
andtabulate_rsp_biomarkers()
functions, we could use the original continuous biomarker variableAGE
, 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.
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
.
We can look at the result in the console already.
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.
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] stats4 stats graphics grDevices utils datasets methods
[8] base
other attached packages:
[1] hermes_1.8.1 SummarizedExperiment_1.34.0
[3] Biobase_2.64.0 GenomicRanges_1.56.1
[5] GenomeInfoDb_1.40.1 IRanges_2.38.1
[7] S4Vectors_0.42.1 BiocGenerics_0.50.0
[9] MatrixGenerics_1.16.0 matrixStats_1.4.1
[11] ggfortify_0.4.17 ggplot2_3.5.1
[13] dplyr_1.1.4 tern_0.9.5
[15] rtables_0.6.9 magrittr_2.0.3
[17] formatters_0.5.9
loaded via a namespace (and not attached):
[1] Rdpack_2.6.1 DBI_1.2.3
[3] httr2_1.0.4 gridExtra_2.3
[5] biomaRt_2.60.1 rlang_1.1.4
[7] clue_0.3-65 GetoptLong_1.0.5
[9] compiler_4.4.1 RSQLite_2.3.7
[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.44.0
[21] labeling_0.4.3 utf8_1.2.4
[23] rmarkdown_2.28 UCSC.utils_1.0.0
[25] purrr_1.0.2 bit_4.0.5
[27] xfun_0.47 MultiAssayExperiment_1.30.3
[29] zlibbioc_1.50.0 cachem_1.1.0
[31] jsonlite_1.8.8 progress_1.2.3
[33] blob_1.2.4 DelayedArray_0.30.1
[35] prettyunits_1.2.0 broom_1.0.6
[37] parallel_4.4.1 cluster_2.1.6
[39] R6_2.5.1 stringi_1.8.4
[41] RColorBrewer_1.1-3 Rcpp_1.0.13
[43] assertthat_0.2.1 iterators_1.0.14
[45] knitr_1.48 Matrix_1.7-0
[47] splines_4.4.1 tidyselect_1.2.1
[49] abind_1.4-8 yaml_2.3.10
[51] doParallel_1.0.17 codetools_0.2-20
[53] curl_5.2.2 lattice_0.22-6
[55] tibble_3.2.1 withr_3.0.1
[57] KEGGREST_1.44.1 evaluate_0.24.0
[59] survival_3.7-0 BiocFileCache_2.12.0
[61] xml2_1.3.6 circlize_0.4.16
[63] Biostrings_2.72.1 filelock_1.0.3
[65] pillar_1.9.0 checkmate_2.3.2
[67] foreach_1.5.2 generics_0.1.3
[69] hms_1.1.3 munsell_0.5.1
[71] scales_1.3.0 glue_1.7.0
[73] tools_4.4.1 forcats_1.0.0
[75] cowplot_1.1.3 grid_4.4.1
[77] tidyr_1.3.1 rbibutils_2.2.16
[79] AnnotationDbi_1.66.0 colorspace_2.1-1
[81] random.cdisc.data_0.3.15 GenomeInfoDbData_1.2.12
[83] cli_3.6.3 rappdirs_0.3.3
[85] fansi_1.0.6 S4Arrays_1.4.1
[87] ComplexHeatmap_2.20.0 gtable_0.3.5
[89] digest_0.6.37 SparseArray_1.4.8
[91] ggrepel_0.9.6 farver_2.1.2
[93] rjson_0.2.22 htmlwidgets_1.6.4
[95] memoise_2.0.1 htmltools_0.5.8.1
[97] lifecycle_1.0.4 httr_1.4.7
[99] GlobalOptions_0.1.2 bit64_4.0.5