Skip to contents

[Stable]

Tabulate statistics such as response rate and odds ratio for population subgroups.

Usage

extract_rsp_subgroups(
  variables,
  data,
  groups_lists = list(),
  conf_level = 0.95,
  method = NULL,
  label_all = "All Patients"
)

a_response_subgroups(
  .formats = list(n = "xx", n_rsp = "xx", prop = "xx.x%", n_tot = "xx", or =
    list(format_extreme_values(2L)), ci = list(format_extreme_values_ci(2L)), pval =
    "x.xxxx | (<0.0001)")
)

tabulate_rsp_subgroups(lyt, df, vars = c("n_tot", "n", "prop", "or", "ci"))

Arguments

variables

(named list of string)
list of additional analysis variables.

data

(data frame)
the dataset containing the variables to summarize.

groups_lists

(named list of list)
optionally contains for each subgroups variable a list, which specifies the new group levels via the names and the levels that belong to it in the character vectors that are elements of the list.

conf_level

(proportion)
confidence level of the interval.

method

(string)
specifies the test used to calculate the p-value for the difference between two proportions. For options, see s_test_proportion_diff(). Default is NULL so no test is performed.

label_all

(string)
label for the total population analysis.

.formats

(named character or list)
formats for the statistics.

lyt

(layout)
input layout where analyses will be added to.

df

(list)
of data frames containing all analysis variables. List should be created using extract_rsp_subgroups().

vars

(character)
the name of statistics to be reported among n (total number of observations per group), n_rsp (number of responders per group), prop (proportion of responders), n_tot (total number of observations), or (odds ratio), ci (confidence interval of odds ratio) and pval (p value of the effect). Note, the statistics n_tot, or and ci are required.

Details

These functions create a layout starting from a data frame which contains the required statistics. Tables typically used as part of forest plot.

Functions

  • extract_rsp_subgroups(): prepares response rates and odds ratios for population subgroups in data frames. Simple wrapper for h_odds_ratio_subgroups_df() and h_proportion_subgroups_df(). Result is a list of two data frames: prop and or. variables corresponds to the names of variables found in data, passed as a named list and requires elements rsp, arm and optionally subgroups and strat. groups_lists optionally specifies groupings for subgroups variables.

  • a_response_subgroups(): Formatted Analysis function used to format the results of extract_rsp_subgroups(). Returns is a list of Formatted Analysis functions with one element per statistic.

  • tabulate_rsp_subgroups(): table creating function.

Examples


# Testing dataset.
library(scda)
library(dplyr)
library(forcats)
library(rtables)

adrs <- synthetic_cdisc_data("latest")$adrs
adrs_labels <- formatters::var_labels(adrs)

adrs_f <- adrs %>%
  filter(PARAMCD == "BESRSPI") %>%
  filter(ARM %in% c("A: Drug X", "B: Placebo")) %>%
  droplevels() %>%
  mutate(
    # Reorder levels of factor to make the placebo group the reference arm.
    ARM = fct_relevel(ARM, "B: Placebo"),
    rsp = AVALC == "CR"
  )
formatters::var_labels(adrs_f) <- c(adrs_labels, "Response")
# Unstratified analysis.
df <- extract_rsp_subgroups(
  variables = list(rsp = "rsp", arm = "ARM", subgroups = c("SEX", "BMRKR2")),
  data = adrs_f
)
df
#> $prop
#>           arm   n n_rsp      prop     subgroup    var
#> 1  B: Placebo 134    97 0.7238806 All Patients    ALL
#> 2   A: Drug X 134   119 0.8880597 All Patients    ALL
#> 3  B: Placebo  82    57 0.6951220            F    SEX
#> 4   A: Drug X  79    73 0.9240506            F    SEX
#> 5  B: Placebo  52    40 0.7692308            M    SEX
#> 6   A: Drug X  55    46 0.8363636            M    SEX
#> 7  B: Placebo  45    38 0.8444444          LOW BMRKR2
#> 8   A: Drug X  50    46 0.9200000          LOW BMRKR2
#> 9  B: Placebo  56    38 0.6785714       MEDIUM BMRKR2
#> 10  A: Drug X  37    31 0.8378378       MEDIUM BMRKR2
#> 11 B: Placebo  33    21 0.6363636         HIGH BMRKR2
#> 12  A: Drug X  47    42 0.8936170         HIGH BMRKR2
#>                        var_label row_type
#> 1                   All Patients  content
#> 2                   All Patients  content
#> 3                            Sex analysis
#> 4                            Sex analysis
#> 5                            Sex analysis
#> 6                            Sex analysis
#> 7  Categorical Level Biomarker 2 analysis
#> 8  Categorical Level Biomarker 2 analysis
#> 9  Categorical Level Biomarker 2 analysis
#> 10 Categorical Level Biomarker 2 analysis
#> 11 Categorical Level Biomarker 2 analysis
#> 12 Categorical Level Biomarker 2 analysis
#> 
#> $or
#>   arm n_tot       or       lcl       ucl conf_level     subgroup    var
#> 1       268 3.026117 1.5685817  5.838002       0.95 All Patients    ALL
#> 2       161 5.336257 2.0514242 13.880913       0.95            F    SEX
#> 3       107 1.533333 0.5856092  4.014813       0.95            M    SEX
#> 4        95 2.118421 0.5765066  7.784313       0.95          LOW BMRKR2
#> 5        93 2.447368 0.8662556  6.914371       0.95       MEDIUM BMRKR2
#> 6        80 4.800000 1.4936979 15.424806       0.95         HIGH BMRKR2
#>                       var_label row_type
#> 1                  All Patients  content
#> 2                           Sex analysis
#> 3                           Sex analysis
#> 4 Categorical Level Biomarker 2 analysis
#> 5 Categorical Level Biomarker 2 analysis
#> 6 Categorical Level Biomarker 2 analysis
#> 

# Stratified analysis.
df_strat <- extract_rsp_subgroups(
  variables = list(rsp = "rsp", arm = "ARM", subgroups = c("SEX", "BMRKR2"), strat = "STRATA1"),
  data = adrs_f
)
df_strat
#> $prop
#>           arm   n n_rsp      prop     subgroup    var
#> 1  B: Placebo 134    97 0.7238806 All Patients    ALL
#> 2   A: Drug X 134   119 0.8880597 All Patients    ALL
#> 3  B: Placebo  82    57 0.6951220            F    SEX
#> 4   A: Drug X  79    73 0.9240506            F    SEX
#> 5  B: Placebo  52    40 0.7692308            M    SEX
#> 6   A: Drug X  55    46 0.8363636            M    SEX
#> 7  B: Placebo  45    38 0.8444444          LOW BMRKR2
#> 8   A: Drug X  50    46 0.9200000          LOW BMRKR2
#> 9  B: Placebo  56    38 0.6785714       MEDIUM BMRKR2
#> 10  A: Drug X  37    31 0.8378378       MEDIUM BMRKR2
#> 11 B: Placebo  33    21 0.6363636         HIGH BMRKR2
#> 12  A: Drug X  47    42 0.8936170         HIGH BMRKR2
#>                        var_label row_type
#> 1                   All Patients  content
#> 2                   All Patients  content
#> 3                            Sex analysis
#> 4                            Sex analysis
#> 5                            Sex analysis
#> 6                            Sex analysis
#> 7  Categorical Level Biomarker 2 analysis
#> 8  Categorical Level Biomarker 2 analysis
#> 9  Categorical Level Biomarker 2 analysis
#> 10 Categorical Level Biomarker 2 analysis
#> 11 Categorical Level Biomarker 2 analysis
#> 12 Categorical Level Biomarker 2 analysis
#> 
#> $or
#>   arm n_tot       or       lcl       ucl conf_level     subgroup    var
#> 1       268 3.036189 1.5749483  5.853173       0.95 All Patients    ALL
#> 2       161 5.211620 2.0113615 13.503781       0.95            F    SEX
#> 3       107 1.628393 0.6196333  4.279406       0.95            M    SEX
#> 4        95 2.045340 0.5597227  7.474085       0.95          LOW BMRKR2
#> 5        93 2.423656 0.8624779  6.810734       0.95       MEDIUM BMRKR2
#> 6        80 4.540487 1.4443496 14.273571       0.95         HIGH BMRKR2
#>                       var_label row_type
#> 1                  All Patients  content
#> 2                           Sex analysis
#> 3                           Sex analysis
#> 4 Categorical Level Biomarker 2 analysis
#> 5 Categorical Level Biomarker 2 analysis
#> 6 Categorical Level Biomarker 2 analysis
#> 

# Grouping of the BMRKR2 levels.
df_grouped <- extract_rsp_subgroups(
  variables = list(rsp = "rsp", arm = "ARM", subgroups = c("SEX", "BMRKR2")),
  data = adrs_f,
  groups_lists = list(
    BMRKR2 = list(
      "low" = "LOW",
      "low/medium" = c("LOW", "MEDIUM"),
      "low/medium/high" = c("LOW", "MEDIUM", "HIGH")
    )
  )
)
df_grouped
#> $prop
#>           arm   n n_rsp      prop        subgroup    var
#> 1  B: Placebo 134    97 0.7238806    All Patients    ALL
#> 2   A: Drug X 134   119 0.8880597    All Patients    ALL
#> 3  B: Placebo  82    57 0.6951220               F    SEX
#> 4   A: Drug X  79    73 0.9240506               F    SEX
#> 5  B: Placebo  52    40 0.7692308               M    SEX
#> 6   A: Drug X  55    46 0.8363636               M    SEX
#> 7  B: Placebo  45    38 0.8444444             low BMRKR2
#> 8   A: Drug X  50    46 0.9200000             low BMRKR2
#> 9  B: Placebo 101    76 0.7524752      low/medium BMRKR2
#> 10  A: Drug X  87    77 0.8850575      low/medium BMRKR2
#> 11 B: Placebo 134    97 0.7238806 low/medium/high BMRKR2
#> 12  A: Drug X 134   119 0.8880597 low/medium/high BMRKR2
#>                        var_label row_type
#> 1                   All Patients  content
#> 2                   All Patients  content
#> 3                            Sex analysis
#> 4                            Sex analysis
#> 5                            Sex analysis
#> 6                            Sex analysis
#> 7  Categorical Level Biomarker 2 analysis
#> 8  Categorical Level Biomarker 2 analysis
#> 9  Categorical Level Biomarker 2 analysis
#> 10 Categorical Level Biomarker 2 analysis
#> 11 Categorical Level Biomarker 2 analysis
#> 12 Categorical Level Biomarker 2 analysis
#> 
#> $or
#>   arm n_tot       or       lcl       ucl conf_level        subgroup    var
#> 1       268 3.026117 1.5685817  5.838002       0.95    All Patients    ALL
#> 2       161 5.336257 2.0514242 13.880913       0.95               F    SEX
#> 3       107 1.533333 0.5856092  4.014813       0.95               M    SEX
#> 4        95 2.118421 0.5765066  7.784313       0.95             low BMRKR2
#> 5       188 2.532895 1.1393669  5.630807       0.95      low/medium BMRKR2
#> 6       268 3.026117 1.5685817  5.838002       0.95 low/medium/high BMRKR2
#>                       var_label row_type
#> 1                  All Patients  content
#> 2                           Sex analysis
#> 3                           Sex analysis
#> 4 Categorical Level Biomarker 2 analysis
#> 5 Categorical Level Biomarker 2 analysis
#> 6 Categorical Level Biomarker 2 analysis
#> 
# Internal function - a_response_subgroups
if (FALSE) {
a_response_subgroups(.formats = list("n" = "xx", "prop" = "xx.xx%"))
}


## Table with default columns.
basic_table() %>%
  tabulate_rsp_subgroups(df)
#> Baseline Risk Factors                         B: Placebo           A: Drug X                                  
#>                                 Total n    n    Response (%)    n    Response (%)   Odds Ratio      95% CI    
#> ——————————————————————————————————————————————————————————————————————————————————————————————————————————————
#> All Patients                      268     134      72.4%       134      88.8%          3.03      (1.57, 5.84) 
#> Sex                                                                                                           
#>   F                               161     82       69.5%       79       92.4%          5.34      (2.05, 13.88)
#>   M                               107     52       76.9%       55       83.6%          1.53      (0.59, 4.01) 
#> Categorical Level Biomarker 2                                                                                 
#>   LOW                             95      45       84.4%       50       92.0%          2.12      (0.58, 7.78) 
#>   MEDIUM                          93      56       67.9%       37       83.8%          2.45      (0.87, 6.91) 
#>   HIGH                            80      33       63.6%       47       89.4%          4.80      (1.49, 15.42)

## Table with selected columns.
basic_table() %>%
  tabulate_rsp_subgroups(
    df = df,
    vars = c("n_tot", "n", "n_rsp", "prop", "or", "ci")
  )
#> Baseline Risk Factors                               B: Placebo                         A: Drug X                                        
#>                                 Total n    n    Responders   Response (%)    n    Responders   Response (%)   Odds Ratio      95% CI    
#> ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
#> All Patients                      268     134       97          72.4%       134      119          88.8%          3.03      (1.57, 5.84) 
#> Sex                                                                                                                                     
#>   F                               161     82        57          69.5%       79        73          92.4%          5.34      (2.05, 13.88)
#>   M                               107     52        40          76.9%       55        46          83.6%          1.53      (0.59, 4.01) 
#> Categorical Level Biomarker 2                                                                                                           
#>   LOW                             95      45        38          84.4%       50        46          92.0%          2.12      (0.58, 7.78) 
#>   MEDIUM                          93      56        38          67.9%       37        31          83.8%          2.45      (0.87, 6.91) 
#>   HIGH                            80      33        21          63.6%       47        42          89.4%          4.80      (1.49, 15.42)