We define a vector of all cutpoints to use for a numeric biomarker (here BMRKR1).
We lapply() over this vector, each time generating a binary factor variable BMRKR1_cut and then tabulating the resulting statistics similar to SFG4, this time including the treatment arms in the subgroups argument. Then we rbind() all tables in the list together.
Greater Less
Baseline Risk Factors Total n n Responders Response (%) n Responders Response (%) Odds Ratio 95% CI
—————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
BMRKR1 (4) 97 62 61 98.4% 35 34 97.1% 0.56 (0.03, 9.20)
Description of Planned Arm
CTRL 36 21 21 100.0% 15 15 100.0% 1.00 (0.00, >999.99)
TRT 61 41 40 97.6% 20 19 95.0% 0.48 (0.03, 8.01)
BMRKR1 (5) 97 50 49 98.0% 47 46 97.9% 0.94 (0.06, 15.45)
Description of Planned Arm
CTRL 36 16 16 100.0% 20 20 100.0% 1.00 (0.00, >999.99)
TRT 61 34 33 97.1% 27 26 96.3% 0.79 (0.05, 13.21)
BMRKR1 (8) 97 16 16 100.0% 81 79 97.5% <0.01 (0.00, >999.99)
Description of Planned Arm
CTRL 36 3 3 100.0% 33 33 100.0% 1.00 (0.00, >999.99)
TRT 61 13 13 100.0% 48 46 95.8% <0.01 (0.00, >999.99)
We can now produce the forest plot using the g_forest() function. Similarly as in SFG4 we need to specify the col_x, col_y and forest_header arguments for g_forest() by recovering them from one of the original tables.
---title: RFG3subtitle: Response Forest Graphs Within Treatment Arms by Continuous Biomarker Cutoffcategories: [RFG]---------------------------------------------------------------------------::: panel-tabset## SetupFor response endpoints it is good to show how to obtain within-treatment-arms comparisons of biomarker subgroups.This is similar to [SFG04](../graphs/sfg04.qmd).Similarly like in [RFG1](../graphs/RFG1/rfg01.qmd).```{r, message = FALSE}library(tern)library(ggplot2.utils)library(dplyr)adrs <- random.cdisc.data::cadrs %>% df_explicit_na() %>% filter(PARAMCD == "BESRSPI", BMEASIFL == "Y") %>% mutate( is_rsp = AVALC %in% c("CR", "PR"), ARM_BIN = fct_collapse_only( ARM, CTRL = c("B: Placebo"), TRT = c("A: Drug X", "C: Combination") ), BMRKR2 = fct_explicit_na_if(BMRKR2, BEP01FL == "N") ) %>% var_relabel( BEP01FL = "BEP", BMRKR2 = "Biomarker (Categorical)" )```## PlotWe define a vector of all cutpoints to use for a numeric biomarker (here `BMRKR1`).We `lapply()` over this vector, each time generating a binary factor variable `BMRKR1_cut` and then tabulating the resulting statistics similar to [SFG4](../graphs/sfg04.qmd), this time including the treatment arms in the `subgroups` argument.Then we `rbind()` all tables in the list together.```{r}# across arm ----cutpoints <-c(4, 5, 8)adrs2 <- adrs %>%mutate(BMRKR1 =ifelse(BEP01FL =="N", NA, BMRKR1),BMRKR1_cut =explicit_na(cut(BMRKR1, c(-Inf, cutpoints, Inf), right =FALSE)) ) %>%var_relabel(BMRKR1_cut ="Biomarker (Binned Continuous)")tables_all_cutpoints <-lapply(cutpoints, function(cutpoint) { adrs3 <- adrs2 %>%filter(!is.na(BMRKR1)) %>%mutate(BMRKR1_thresh =explicit_na(factor(ifelse(BMRKR1 > cutpoint, "Greater", "Less") )) ) tbl <-extract_rsp_subgroups(variables =list(rsp ="is_rsp",arm ="BMRKR1_thresh",subgroups =c("ARM_BIN") ),label_all =paste0("BMRKR1 (", cutpoint, ")"),data = adrs3 )basic_table() %>%tabulate_rsp_subgroups(df = tbl,vars =c("n_tot", "n", "n_rsp", "prop", "or", "ci") )})result <-do.call(rbind, tables_all_cutpoints)```We can look at the result in the console already.```{r}result```We can now produce the forest plot using the `g_forest()` function.Similarly as in [SFG4](../graphs/sfg04.qmd) we need to specify the `col_x`, `col_y` and `forest_header` arguments for `g_forest()` by recovering them from one of the original tables.```{r, fig.width = 15}one_table <- tables_all_cutpoints[[1]]g2 <- g_forest( result, col_x = attr(one_table, "col_x"), col_ci = attr(one_table, "col_ci"), forest_header = attr(one_table, "forest_header"), col_symbol_size = attr(one_table, "col_symbol_size"))```With `gridExtra::grid.arrange()` the plot can be combined e.g. with a between-treatment-arms comparison, like [RFG1A](../graphs/RFG1/rfg01a.qmd){{< include ../misc/session_info.qmd >}}:::