TLG Catalog - Stable
  • Stable
    • Dev
  1. Tables
  2. Efficacy
  3. RSPT01
  • Introduction

  • Tables
    • ADA
      • ADAT01
      • ADAT02
      • ADAT03
      • ADAT04A
      • ADAT04B
    • Adverse Events
      • AET01
      • AET01_AESI
      • AET02
      • AET02_SMQ
      • AET03
      • AET04
      • AET04_PI
      • AET05
      • AET05_ALL
      • AET06
      • AET06_SMQ
      • AET07
      • AET09
      • AET09_SMQ
      • AET10
    • Concomitant Medications
      • CMT01
      • CMT01A
      • CMT01B
      • CMT02_PT
    • Deaths
      • DTHT01
    • Demography
      • DMT01
    • Disclosures
      • DISCLOSUREST01
      • EUDRAT01
      • EUDRAT02
    • Disposition
      • DST01
      • PDT01
      • PDT02
    • ECG
      • EGT01
      • EGT02
      • EGT03
      • EGT04
      • EGT05_QTCAT
    • Efficacy
      • AOVT01
      • AOVT02
      • AOVT03
      • CFBT01
      • CMHT01
      • COXT01
      • COXT02
      • DORT01
      • LGRT02
      • MMRMT01
      • ONCT05
      • RATET01
      • RBMIT01
      • RSPT01
      • TTET01
    • Exposure
      • EXT01
    • Lab Results
      • LBT01
      • LBT02
      • LBT03
      • LBT04
      • LBT05
      • LBT06
      • LBT07
      • LBT08
      • LBT09
      • LBT10
      • LBT10_BL
      • LBT11
      • LBT11_BL
      • LBT12
      • LBT12_BL
      • LBT13
      • LBT14
      • LBT15
    • Medical History
      • MHT01
    • Pharmacokinetic
      • PKCT01
      • PKPT02
      • PKPT03
      • PKPT04
      • PKPT05
      • PKPT06
      • PKPT07
      • PKPT08
      • PKPT11
    • Risk Management Plan
      • RMPT01
      • RMPT03
      • RMPT04
      • RMPT05
      • RMPT06
    • Safety
      • ENTXX
    • Vital Signs
      • VST01
      • VST02
  • Listings
    • ADA
      • ADAL02
    • Adverse Events
      • AEL01
      • AEL01_NOLLT
      • AEL02
      • AEL02_ED
      • AEL03
      • AEL04
    • Concomitant Medications
      • CML01
      • CML02A_GL
      • CML02B_GL
    • Development Safety Update Report
      • DSUR4
    • Disposition
      • DSL01
      • DSL02
    • ECG
      • EGL01
    • Efficacy
      • ONCL01
    • Exposure
      • EXL01
    • Lab Results
      • LBL01
      • LBL01_RLS
      • LBL02A
      • LBL02A_RLS
      • LBL02B
    • Medical History
      • MHL01
    • Pharmacokinetic
      • ADAL01
      • PKCL01
      • PKCL02
      • PKPL01
      • PKPL02
      • PKPL04
    • Vital Signs
      • VSL01
  • Graphs
    • Efficacy
      • FSTG01
      • FSTG02
      • KMG01
      • MMRMG01
      • MMRMG02
    • Other
      • BRG01
      • BWG01
      • CIG01
      • IPPG01
      • LTG01
      • MNG01
    • Pharmacokinetic
      • PKCG01
      • PKCG02
      • PKCG03
      • PKPG01
      • PKPG02
      • PKPG03
      • PKPG04
      • PKPG06

  • Appendix
    • Reproducibility

  • Index

On this page

  • Output
  • teal App
  • Reproducibility
    • Timestamp
    • Session Info
    • .lock file
  • Edit this page
  • Report an issue
  1. Tables
  2. Efficacy
  3. RSPT01

RSPT01

Best Overall Response


Data pre-processing is done to label the analysis value (AVALC) so as to improve the readability of the output table. In addition, the response is binary defined (is_rsp, responder yes/no) depending on the analysis value. Finally, for comparison purposes, the reference arm is specified.

Code
# Pre-Processing

anl <- anl_adsl %>%
  left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
  mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%
  mutate(is_rsp = AVALC %in% c("CR", "PR")) %>%
  mutate(ARM = relevel(ARM, ref = "A: Drug X")) %>%
  var_relabel(ARM = "Description of Planned Arm")

Output

  • Standard Table
  • Table Selecting
    Sections to Display
  • Table Modifying Analysis Details like Type of
    Confidence Interval, Alpha Level, Test Statistic
  • Table with
    Stratified Analysis
  • Table Modifying the Definition
    of Overall Response
  • Table Defining New
    Sections to Display
  • Data Setup

The tabulation layout is built in layers for the analysis of overall response and applied to the pre-processed dataset.

  • Preview
  • Try this using WebR
Code
lyt_01 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    table_names = "test_prop_diff"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    table_names = "est_or"
  ) %>%
  estimate_multinomial_response(var = "rsp_lab")

result <- build_table(lyt = lyt_01, df = anl)
result
                                       A: Drug X          B: Placebo         C: Combination  
                                        (N=134)            (N=134)              (N=132)      
—————————————————————————————————————————————————————————————————————————————————————————————
Responders                            100 (74.6%)         84 (62.7%)           81 (61.4%)    
95% CI (Wald, with correction)        (66.9, 82.4)       (54.1, 71.2)         (52.7, 70.0)   
Unstratified Analysis                                                                        
  Difference in Response rate (%)                           -11.9                -13.3       
    95% CI (Wald, with correction)                      (-23.7, -0.2)        (-25.1, -1.4)   
  p-value (Chi-Squared Test)                                0.0351               0.0204      
Odds Ratio (95% CI)                                   0.57 (0.34 - 0.96)   0.54 (0.32 - 0.91)
Complete Response (CR)                 60 (44.8%)         47 (35.1%)           57 (43.2%)    
  95% CI (Wald, with correction)     (35.98, 53.57)     (26.62, 43.53)       (34.35, 52.01)  
Partial Response (PR)                  40 (29.9%)         37 (27.6%)           24 (18.2%)    
  95% CI (Wald, with correction)     (21.73, 37.97)     (19.67, 35.55)       (11.22, 25.14)  
Stable Disease (SD)                     9 (6.7%)          22 (16.4%)           13 (9.8%)     
  95% CI (Wald, with correction)     (2.11, 11.33)      (9.77, 23.06)        (4.39, 15.31)   
Progressive Disease (PD)               24 (17.9%)         16 (11.9%)           33 (25.0%)    
  95% CI (Wald, with correction)     (11.05, 24.78)     (6.08, 17.80)        (17.23, 32.77)  
Not Evaluable (NE)                      1 (0.7%)          12 (9.0%)             5 (3.8%)     
  95% CI (Wald, with correction)      (0.00, 2.58)      (3.75, 14.16)         (0.15, 7.42)   
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

  • Preview
  • Try this using WebR

Remove (or add) rows of results by removing/adding the corresponding layers from the layout. For instance, the odds-ratio row is removed by simply removing the estimate_odds_ratio call:

Code
lyt_02 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    table_names = "test_prop"
  ) %>%
  estimate_multinomial_response(var = "rsp_lab")

result <- build_table(lyt = lyt_02, df = anl)
result
                                       A: Drug X        B: Placebo     C: Combination
                                        (N=134)          (N=134)          (N=132)    
—————————————————————————————————————————————————————————————————————————————————————
Responders                            100 (74.6%)       84 (62.7%)       81 (61.4%)  
95% CI (Wald, with correction)        (66.9, 82.4)     (54.1, 71.2)     (52.7, 70.0) 
Unstratified Analysis                                                                
  Difference in Response rate (%)                         -11.9            -13.3     
    95% CI (Wald, with correction)                    (-23.7, -0.2)    (-25.1, -1.4) 
  p-value (Chi-Squared Test)                              0.0351           0.0204    
Complete Response (CR)                 60 (44.8%)       47 (35.1%)       57 (43.2%)  
  95% CI (Wald, with correction)     (35.98, 53.57)   (26.62, 43.53)   (34.35, 52.01)
Partial Response (PR)                  40 (29.9%)       37 (27.6%)       24 (18.2%)  
  95% CI (Wald, with correction)     (21.73, 37.97)   (19.67, 35.55)   (11.22, 25.14)
Stable Disease (SD)                     9 (6.7%)        22 (16.4%)       13 (9.8%)   
  95% CI (Wald, with correction)     (2.11, 11.33)    (9.77, 23.06)    (4.39, 15.31) 
Progressive Disease (PD)               24 (17.9%)       16 (11.9%)       33 (25.0%)  
  95% CI (Wald, with correction)     (11.05, 24.78)   (6.08, 17.80)    (17.23, 32.77)
Not Evaluable (NE)                      1 (0.7%)        12 (9.0%)         5 (3.8%)   
  95% CI (Wald, with correction)      (0.00, 2.58)    (3.75, 14.16)     (0.15, 7.42) 
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

The confidence level is controlled by the conf_level parameter to the estimation functions. Similarly, the methods for tests and confidence interval can be modified (see ?estimate_proportion_diff).

  • Preview
  • Try this using WebR
Code
conf_level <- 0.90
lyt_03 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    conf_level = conf_level,
    method = "clopper-pearson",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    conf_level = conf_level,
    method = "ha",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    method = "fisher",
    table_names = "test_prop"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    conf_level = conf_level,
    table_names = "est_or"
  ) %>%
  estimate_multinomial_response(
    var = "rsp_lab",
    conf_level = conf_level,
    method = "clopper-pearson"
  )

result <- build_table(lyt = lyt_03, df = anl)
result
                                      A: Drug X          B: Placebo         C: Combination  
                                       (N=134)            (N=134)              (N=132)      
————————————————————————————————————————————————————————————————————————————————————————————
Responders                           100 (74.6%)         84 (62.7%)           81 (61.4%)    
90% CI (Clopper-Pearson)             (67.7, 80.7)       (55.3, 69.7)         (53.9, 68.5)   
Unstratified Analysis                                                                       
  Difference in Response rate (%)                          -11.9                -13.3       
    90% CI (Anderson-Hauck)                            (-21.6, -2.3)        (-23.0, -3.5)   
  p-value (Fisher's Exact Test)                            0.0479               0.0253      
Odds Ratio (90% CI)                                  0.57 (0.37 - 0.89)   0.54 (0.35 - 0.84)
Complete Response (CR)                60 (44.8%)         47 (35.1%)           57 (43.2%)    
  90% CI (Clopper-Pearson)          (37.48, 52.25)     (28.22, 42.43)       (35.88, 50.71)  
Partial Response (PR)                 40 (29.9%)         37 (27.6%)           24 (18.2%)    
  90% CI (Clopper-Pearson)          (23.36, 37.02)     (21.31, 34.67)       (12.87, 24.61)  
Stable Disease (SD)                    9 (6.7%)          22 (16.4%)           13 (9.8%)     
  90% CI (Clopper-Pearson)          (3.55, 11.43)      (11.38, 22.61)       (5.92, 15.20)   
Progressive Disease (PD)              24 (17.9%)         16 (11.9%)           33 (25.0%)    
  90% CI (Clopper-Pearson)          (12.67, 24.25)     (7.63, 17.57)        (18.90, 31.97)  
Not Evaluable (NE)                     1 (0.7%)          12 (9.0%)             5 (3.8%)     
  90% CI (Clopper-Pearson)           (0.04, 3.49)      (5.25, 14.11)         (1.50, 7.80)   
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

  • Preview
  • Try this using WebR

The stratified analysis section can be added by defining the analyses needed with control_binary_comparison for the argument strat_analysis and identifying the stratification variables to use.

Code
strata <- "STRATA1"
lyt_04 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    table_names = "test_prop"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    table_names = "est_or"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Stratified Analysis",
    method = "cmh",
    variables = list(strata = strata),
    table_names = "est_prop_diff_strat"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    method = "cmh",
    variables = list(strata = strata),
    table_names = "test_prop_strat"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    variables = list(strata = strata, arm = "ARM"),
    table_names = "est_or_strat"
  ) %>%
  estimate_multinomial_response(var = "rsp_lab")

result <- build_table(lyt = lyt_04, df = anl)
result
                                             A: Drug X          B: Placebo         C: Combination  
                                              (N=134)            (N=134)              (N=132)      
———————————————————————————————————————————————————————————————————————————————————————————————————
Responders                                  100 (74.6%)         84 (62.7%)           81 (61.4%)    
95% CI (Wald, with correction)              (66.9, 82.4)       (54.1, 71.2)         (52.7, 70.0)   
Unstratified Analysis                                                                              
  Difference in Response rate (%)                                 -11.9                -13.3       
    95% CI (Wald, with correction)                            (-23.7, -0.2)        (-25.1, -1.4)   
  p-value (Chi-Squared Test)                                      0.0351               0.0204      
Odds Ratio (95% CI)                                         0.57 (0.34 - 0.96)   0.54 (0.32 - 0.91)
Stratified Analysis                                                                                
  Difference in Response rate (%)                                 -11.9                -13.5       
    95% CI (CMH, without correction)                          (-22.7, -1.0)        (-24.5, -2.5)   
  p-value (Cochran-Mantel-Haenszel Test)                          0.0366               0.0180      
Odds Ratio (95% CI)                                         0.57 (0.34 - 0.96)   0.54 (0.32 - 0.90)
Complete Response (CR)                       60 (44.8%)         47 (35.1%)           57 (43.2%)    
  95% CI (Wald, with correction)           (35.98, 53.57)     (26.62, 43.53)       (34.35, 52.01)  
Partial Response (PR)                        40 (29.9%)         37 (27.6%)           24 (18.2%)    
  95% CI (Wald, with correction)           (21.73, 37.97)     (19.67, 35.55)       (11.22, 25.14)  
Stable Disease (SD)                           9 (6.7%)          22 (16.4%)           13 (9.8%)     
  95% CI (Wald, with correction)           (2.11, 11.33)      (9.77, 23.06)        (4.39, 15.31)   
Progressive Disease (PD)                     24 (17.9%)         16 (11.9%)           33 (25.0%)    
  95% CI (Wald, with correction)           (11.05, 24.78)     (6.08, 17.80)        (17.23, 32.77)  
Not Evaluable (NE)                            1 (0.7%)          12 (9.0%)             5 (3.8%)     
  95% CI (Wald, with correction)            (0.00, 2.58)      (3.75, 14.16)         (0.15, 7.42)   
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

The definition of responders is realized during the pre-processing step. The layout does not need to be modified and can be reused.

  • Preview
  • Try this using WebR
Code
anl <- anl_adsl %>%
  left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
  mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%
  mutate(is_rsp = AVALC == "CR") %>%
  mutate(ARM = relevel(ARM, ref = "A: Drug X")) %>%
  var_relabel(ARM = "Description of Planned Arm")

result <- build_table(lyt = lyt_01, df = anl)
result
                                       A: Drug X          B: Placebo         C: Combination  
                                        (N=134)            (N=134)              (N=132)      
—————————————————————————————————————————————————————————————————————————————————————————————
Responders                             60 (44.8%)         47 (35.1%)           57 (43.2%)    
95% CI (Wald, with correction)        (36.0, 53.6)       (26.6, 43.5)         (34.4, 52.0)   
Unstratified Analysis                                                                        
  Difference in Response rate (%)                            -9.7                 -1.6       
    95% CI (Wald, with correction)                       (-22.1, 2.7)        (-14.3, 11.1)   
  p-value (Chi-Squared Test)                                0.1049               0.7934      
Odds Ratio (95% CI)                                   0.67 (0.41 - 1.09)   0.94 (0.58 - 1.52)
Complete Response (CR)                 60 (44.8%)         47 (35.1%)           57 (43.2%)    
  95% CI (Wald, with correction)     (35.98, 53.57)     (26.62, 43.53)       (34.35, 52.01)  
Partial Response (PR)                  40 (29.9%)         37 (27.6%)           24 (18.2%)    
  95% CI (Wald, with correction)     (21.73, 37.97)     (19.67, 35.55)       (11.22, 25.14)  
Stable Disease (SD)                     9 (6.7%)          22 (16.4%)           13 (9.8%)     
  95% CI (Wald, with correction)     (2.11, 11.33)      (9.77, 23.06)        (4.39, 15.31)   
Progressive Disease (PD)               24 (17.9%)         16 (11.9%)           33 (25.0%)    
  95% CI (Wald, with correction)     (11.05, 24.78)     (6.08, 17.80)        (17.23, 32.77)  
Not Evaluable (NE)                      1 (0.7%)          12 (9.0%)             5 (3.8%)     
  95% CI (Wald, with correction)      (0.00, 2.58)      (3.75, 14.16)         (0.15, 7.42)   
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

Similarly to in the previous tab, redefinition or relabeling of the result is a pre-processing step and the original table layout can be reused.

  • Preview
  • Try this using WebR
Code
anl <- anl_adsl %>%
  left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
  mutate(rsp_lab = as.character(d_onco_rsp_label(AVALC))) %>%
  mutate(
    rsp_lab = case_when(
      rsp_lab == "Complete Response (CR)" ~ "No Progression",
      rsp_lab == "Partial Response (PR)" ~ "No Progression",
      rsp_lab == "Stable Disease (SD)" ~ "No Progression",
      TRUE ~ rsp_lab
    )
  ) %>%
  mutate(is_rsp = rsp_lab %in% "No Progression") %>%
  mutate(ARM = relevel(ARM, ref = "A: Drug X")) %>%
  var_relabel(ARM = "Description of Planned Arm")

result <- build_table(lyt = lyt_01, df = anl)
result
                                       A: Drug X          B: Placebo         C: Combination  
                                        (N=134)            (N=134)              (N=132)      
—————————————————————————————————————————————————————————————————————————————————————————————
Responders                            109 (81.3%)        106 (79.1%)           94 (71.2%)    
95% CI (Wald, with correction)        (74.4, 88.3)       (71.8, 86.4)         (63.1, 79.3)   
Unstratified Analysis                                                                        
  Difference in Response rate (%)                            -2.2                -10.1       
    95% CI (Wald, with correction)                       (-12.5, 8.0)         (-21.0, 0.8)   
  p-value (Chi-Squared Test)                                0.6455               0.0520      
Odds Ratio (95% CI)                                   0.87 (0.48 - 1.59)   0.57 (0.32 - 1.01)
Progressive Disease (PD)               24 (17.9%)         16 (11.9%)           33 (25.0%)    
  95% CI (Wald, with correction)     (11.05, 24.78)     (6.08, 17.80)        (17.23, 32.77)  
No Progression                        109 (81.3%)        106 (79.1%)           94 (71.2%)    
  95% CI (Wald, with correction)     (74.37, 88.31)     (71.85, 86.36)       (63.11, 79.31)  
Not Evaluable (NE)                      1 (0.7%)          12 (9.0%)             5 (3.8%)     
  95% CI (Wald, with correction)      (0.00, 2.58)      (3.75, 14.16)         (0.15, 7.42)   
Experimental use!

WebR is a tool allowing you to run R code in the web browser. Modify the code below and click run to see the results. Alternatively, copy the code and click here to open WebR in a new tab.

Code
library(dplyr)
library(tern)

adsl <- random.cdisc.data::cadsl
adrs <- random.cdisc.data::cadrs

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adrs <- df_explicit_na(adrs)

anl_adrs <- adrs %>%
  filter(PARAMCD == "INVET") %>%
  select(STUDYID, USUBJID, PARAMCD, AVISIT, AVALC)
anl_adsl <- adsl %>%
  select(STUDYID, USUBJID, ARM, STRATA1)

teal App

  • Preview
  • Try this using shinylive
Code
library(teal.modules.clinical)

## Data reproducible code
data <- teal_data()
data <- within(data, {
  library(dplyr)

  ADSL <- random.cdisc.data::cadsl
  ADRS <- random.cdisc.data::cadrs

  # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
  ADSL <- df_explicit_na(ADSL)
  ADRS <- df_explicit_na(ADRS)

  ADSL <- ADSL %>%
    mutate(Dum_ARM = factor(rep("Single ARM", nrow(.))))
  ADRS <- ADRS %>%
    mutate(Dum_ARM = factor(rep("Single ARM", nrow(.))))
})
datanames <- c("ADSL", "ADRS")
datanames(data) <- datanames
Warning: `datanames<-()` was deprecated in teal.data 0.7.0.
ℹ invalid to use `datanames()<-` or `names()<-` on an object of class
  `teal_data`. See ?names.teal_data
Code
join_keys(data) <- default_cdisc_join_keys[datanames]

## Reusable Configuration For Modules
ADRS <- data[["ADRS"]]
arm_ref_comp <- list(
  ACTARMCD = list(
    ref = "ARM B",
    comp = c("ARM A", "ARM C")
  ),
  ARM = list(
    ref = "B: Placebo",
    comp = c("A: Drug X", "C: Combination")
  )
)

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_binary_outcome(
      label = "Responders",
      dataname = "ADRS",
      paramcd = choices_selected(
        choices = value_choices(ADRS, "PARAMCD", "PARAM"),
        selected = "BESRSPI"
      ),
      arm_var = choices_selected(
        choices = variable_choices(ADRS, c("ARM", "ARMCD", "ACTARMCD", "Dum_ARM")),
        selected = "ARM"
      ),
      arm_ref_comp = arm_ref_comp,
      strata_var = choices_selected(
        choices = variable_choices(ADRS, c("SEX", "BMRKR2")),
        select = NULL
      ),
      rsp_table = TRUE
    )
  )
)

shinyApp(app$ui, app$server)

Experimental use!

shinylive allow you to modify to run shiny application entirely in the web browser. Modify the code below and click re-run the app to see the results. The performance is slighly worse and some of the features (e.g. downloading) might not work at all.

#| '!! shinylive warning !!': |
#|   shinylive does not work in self-contained HTML documents.
#|   Please set `embed-resources: false` in your metadata.
#| standalone: true
#| viewerHeight: 800
#| editorHeight: 200
#| components: [viewer, editor]
#| layout: vertical

# -- WEBR HELPERS --
options(webr_pkg_repos = c("r-universe" = "https://insightsengineering.r-universe.dev", getOption("webr_pkg_repos")))

# -- APP CODE --
library(teal.modules.clinical)

## Data reproducible code
data <- teal_data()
data <- within(data, {
  library(dplyr)

  ADSL <- random.cdisc.data::cadsl
  ADRS <- random.cdisc.data::cadrs

  # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
  ADSL <- df_explicit_na(ADSL)
  ADRS <- df_explicit_na(ADRS)

  ADSL <- ADSL %>%
    mutate(Dum_ARM = factor(rep("Single ARM", nrow(.))))
  ADRS <- ADRS %>%
    mutate(Dum_ARM = factor(rep("Single ARM", nrow(.))))
})
datanames <- c("ADSL", "ADRS")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]

## Reusable Configuration For Modules
ADRS <- data[["ADRS"]]
arm_ref_comp <- list(
  ACTARMCD = list(
    ref = "ARM B",
    comp = c("ARM A", "ARM C")
  ),
  ARM = list(
    ref = "B: Placebo",
    comp = c("A: Drug X", "C: Combination")
  )
)

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_binary_outcome(
      label = "Responders",
      dataname = "ADRS",
      paramcd = choices_selected(
        choices = value_choices(ADRS, "PARAMCD", "PARAM"),
        selected = "BESRSPI"
      ),
      arm_var = choices_selected(
        choices = variable_choices(ADRS, c("ARM", "ARMCD", "ACTARMCD", "Dum_ARM")),
        selected = "ARM"
      ),
      arm_ref_comp = arm_ref_comp,
      strata_var = choices_selected(
        choices = variable_choices(ADRS, c("SEX", "BMRKR2")),
        select = NULL
      ),
      rsp_table = TRUE
    )
  )
)

shinyApp(app$ui, app$server)

Reproducibility

Timestamp

[1] "2025-07-05 17:38:18 UTC"

Session Info

─ Session info ───────────────────────────────────────────────────────────────
 setting  value
 version  R version 4.5.0 (2025-04-11)
 os       Ubuntu 24.04.2 LTS
 system   x86_64, linux-gnu
 ui       X11
 language (EN)
 collate  en_US.UTF-8
 ctype    en_US.UTF-8
 tz       Etc/UTC
 date     2025-07-05
 pandoc   3.7.0.2 @ /usr/bin/ (via rmarkdown)
 quarto   1.7.32 @ /usr/local/bin/quarto

─ Packages ───────────────────────────────────────────────────────────────────
 package               * version  date (UTC) lib source
 backports               1.5.0    2024-05-23 [1] RSPM
 brio                    1.1.5    2024-04-24 [1] RSPM
 broom                   1.0.8    2025-03-28 [1] RSPM
 bslib                   0.9.0    2025-01-30 [1] RSPM
 cachem                  1.1.0    2024-05-16 [1] RSPM
 callr                   3.7.6    2024-03-25 [1] RSPM
 checkmate               2.3.2    2024-07-29 [1] RSPM
 chromote                0.5.1    2025-04-24 [1] RSPM
 cli                     3.6.5    2025-04-23 [1] RSPM
 coda                    0.19-4.1 2024-01-31 [1] CRAN (R 4.5.0)
 codetools               0.2-20   2024-03-31 [2] CRAN (R 4.5.0)
 curl                    6.4.0    2025-06-22 [1] RSPM
 dichromat               2.0-0.1  2022-05-02 [1] CRAN (R 4.5.0)
 digest                  0.6.37   2024-08-19 [1] RSPM
 dplyr                 * 1.1.4    2023-11-17 [1] RSPM
 emmeans                 1.11.1   2025-05-04 [1] RSPM
 estimability            1.5.1    2024-05-12 [1] RSPM
 evaluate                1.0.4    2025-06-18 [1] RSPM
 farver                  2.1.2    2024-05-13 [1] RSPM
 fastmap                 1.2.0    2024-05-15 [1] RSPM
 fontawesome             0.5.3    2024-11-16 [1] RSPM
 forcats                 1.0.0    2023-01-29 [1] RSPM
 formatR                 1.14     2023-01-17 [1] CRAN (R 4.5.0)
 formatters            * 0.5.11   2025-04-09 [1] RSPM
 geepack                 1.3.12   2024-09-23 [1] RSPM
 generics                0.1.4    2025-05-09 [1] RSPM
 ggplot2                 3.5.2    2025-04-09 [1] RSPM
 glue                    1.8.0    2024-09-30 [1] RSPM
 gtable                  0.3.6    2024-10-25 [1] RSPM
 htmltools               0.5.8.1  2024-04-04 [1] RSPM
 htmlwidgets             1.6.4    2023-12-06 [1] RSPM
 httpuv                  1.6.16   2025-04-16 [1] RSPM
 jquerylib               0.1.4    2021-04-26 [1] RSPM
 jsonlite                2.0.0    2025-03-27 [1] RSPM
 knitr                   1.50     2025-03-16 [1] RSPM
 later                   1.4.2    2025-04-08 [1] RSPM
 lattice                 0.22-7   2025-04-02 [2] CRAN (R 4.5.0)
 lifecycle               1.0.4    2023-11-07 [1] RSPM
 logger                  0.4.0    2024-10-22 [1] RSPM
 magrittr              * 2.0.3    2022-03-30 [1] RSPM
 MASS                    7.3-65   2025-02-28 [2] CRAN (R 4.5.0)
 Matrix                  1.7-3    2025-03-11 [1] CRAN (R 4.5.0)
 memoise                 2.0.1    2021-11-26 [1] RSPM
 mime                    0.13     2025-03-17 [1] RSPM
 multcomp                1.4-28   2025-01-29 [1] RSPM
 mvtnorm                 1.3-3    2025-01-10 [1] RSPM
 nestcolor               0.1.3    2025-01-21 [1] RSPM
 nlme                    3.1-168  2025-03-31 [2] CRAN (R 4.5.0)
 pillar                  1.11.0   2025-07-04 [1] RSPM
 pkgcache                2.2.4    2025-05-26 [1] RSPM
 pkgconfig               2.0.3    2019-09-22 [1] RSPM
 processx                3.8.6    2025-02-21 [1] RSPM
 promises                1.3.3    2025-05-29 [1] RSPM
 ps                      1.9.1    2025-04-12 [1] RSPM
 purrr                   1.0.4    2025-02-05 [1] RSPM
 R6                      2.6.1    2025-02-15 [1] RSPM
 random.cdisc.data       0.3.16   2024-10-10 [1] RSPM
 rbibutils               2.3      2024-10-04 [1] RSPM
 RColorBrewer            1.1-3    2022-04-03 [1] RSPM
 Rcpp                    1.1.0    2025-07-02 [1] RSPM
 Rdpack                  2.6.4    2025-04-09 [1] RSPM
 rlang                   1.1.6    2025-04-11 [1] RSPM
 rmarkdown               2.29     2024-11-04 [1] RSPM
 rtables               * 0.6.13   2025-06-19 [1] RSPM
 sandwich                3.1-1    2024-09-15 [1] RSPM
 sass                    0.4.10   2025-04-11 [1] RSPM
 scales                  1.4.0    2025-04-24 [1] RSPM
 sessioninfo             1.2.3    2025-02-05 [1] any (@1.2.3)
 shiny                 * 1.11.1   2025-07-03 [1] RSPM
 shinycssloaders         1.1.0    2024-07-30 [1] RSPM
 shinyjs                 2.1.0    2021-12-23 [1] RSPM
 shinyvalidate           0.1.3    2023-10-04 [1] RSPM
 shinyWidgets            0.9.0    2025-02-21 [1] RSPM
 stringi                 1.8.7    2025-03-27 [1] RSPM
 stringr                 1.5.1    2023-11-14 [1] RSPM
 survival                3.8-3    2024-12-17 [2] CRAN (R 4.5.0)
 teal                  * 0.16.0   2025-02-23 [1] RSPM
 teal.code             * 0.6.1    2025-02-14 [1] RSPM
 teal.data             * 0.7.0    2025-01-28 [1] RSPM
 teal.logger             0.3.2    2025-02-14 [1] RSPM
 teal.modules.clinical * 0.10.0   2025-02-28 [1] RSPM
 teal.reporter           0.4.0    2025-01-24 [1] RSPM
 teal.slice            * 0.6.0    2025-02-03 [1] RSPM
 teal.transform        * 0.6.0    2025-02-12 [1] RSPM
 teal.widgets            0.4.3    2025-01-31 [1] RSPM
 tern                  * 0.9.9    2025-06-20 [1] RSPM
 tern.gee                0.1.5    2024-08-23 [1] RSPM
 testthat                3.2.3    2025-01-13 [1] RSPM
 TH.data                 1.1-3    2025-01-17 [1] RSPM
 tibble                  3.3.0    2025-06-08 [1] RSPM
 tidyr                   1.3.1    2024-01-24 [1] RSPM
 tidyselect              1.2.1    2024-03-11 [1] RSPM
 vctrs                   0.6.5    2023-12-01 [1] RSPM
 webshot                 0.5.5    2023-06-26 [1] CRAN (R 4.5.0)
 webshot2                0.1.2    2025-04-23 [1] RSPM
 websocket               1.4.4    2025-04-10 [1] RSPM
 withr                   3.0.2    2024-10-28 [1] RSPM
 xfun                    0.52     2025-04-02 [1] RSPM
 xtable                  1.8-4    2019-04-21 [1] RSPM
 yaml                    2.3.10   2024-07-26 [1] RSPM
 zoo                     1.8-14   2025-04-10 [1] RSPM

 [1] /usr/local/lib/R/site-library
 [2] /usr/local/lib/R/library
 [3] /github/home/R/x86_64-pc-linux-gnu-library/4.5
 * ── Packages attached to the search path.

──────────────────────────────────────────────────────────────────────────────

.lock file

Download the .lock file and use renv::restore() on it to recreate environment used to generate this website.

Download

RBMIT01
TTET01
Source Code
---
title: RSPT01
subtitle: Best Overall Response
---

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

{{< include ../../_utils/envir_hook.qmd >}}

```{r setup, echo = FALSE, warning = FALSE, message = FALSE}
library(dplyr)
library(tern)

adsl <- random.cdisc.data::cadsl
adrs <- random.cdisc.data::cadrs

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adrs <- df_explicit_na(adrs)

anl_adrs <- adrs %>%
  filter(PARAMCD == "INVET") %>%
  select(STUDYID, USUBJID, PARAMCD, AVISIT, AVALC)
anl_adsl <- adsl %>%
  select(STUDYID, USUBJID, ARM, STRATA1)
```

Data pre-processing is done to label the analysis value (`AVALC`) so as to improve the readability of the output table. In addition, the *response* is binary defined (`is_rsp`, responder yes/no) depending on the analysis value. Finally, for comparison purposes, the reference arm is specified.

```{r pre-processing}
#| code-fold: show

# Pre-Processing

anl <- anl_adsl %>%
  left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
  mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%
  mutate(is_rsp = AVALC %in% c("CR", "PR")) %>%
  mutate(ARM = relevel(ARM, ref = "A: Drug X")) %>%
  var_relabel(ARM = "Description of Planned Arm")
```

```{r include = FALSE}
webr_code_labels <- c("setup", "pre-processing")
```

{{< include ../../_utils/webr_no_include.qmd >}}

## Output

::::::::: panel-tabset
## Standard Table

The tabulation layout is built in layers for the analysis of overall response and applied to the pre-processed dataset.

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant1, test = list(result_v1 = "result")}
lyt_01 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    table_names = "test_prop_diff"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    table_names = "est_or"
  ) %>%
  estimate_multinomial_response(var = "rsp_lab")

result <- build_table(lyt = lyt_01, df = anl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant1")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Table Selecting <br/> Sections to Display

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

Remove (or add) rows of results by removing/adding the corresponding layers from the layout. For instance, the odds-ratio row is removed by simply removing the `estimate_odds_ratio` call:

```{r variant2, test = list(result_v2 = "result")}
lyt_02 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    table_names = "test_prop"
  ) %>%
  estimate_multinomial_response(var = "rsp_lab")

result <- build_table(lyt = lyt_02, df = anl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant2")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Table Modifying Analysis Details like Type of <br/> Confidence Interval, Alpha Level, Test Statistic

The confidence level is controlled by the `conf_level` parameter to the estimation functions. Similarly, the methods for tests and confidence interval can be modified (see `?estimate_proportion_diff`).

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant3, test = list(result_v3 = "result")}
conf_level <- 0.90
lyt_03 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    conf_level = conf_level,
    method = "clopper-pearson",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    conf_level = conf_level,
    method = "ha",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    method = "fisher",
    table_names = "test_prop"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    conf_level = conf_level,
    table_names = "est_or"
  ) %>%
  estimate_multinomial_response(
    var = "rsp_lab",
    conf_level = conf_level,
    method = "clopper-pearson"
  )

result <- build_table(lyt = lyt_03, df = anl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant3")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Table with <br/> Stratified Analysis

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

The stratified analysis section can be added by defining the analyses needed with `control_binary_comparison` for the argument `strat_analysis` and identifying the stratification variables to use.

```{r variant4, test = list(result_v4 = "result")}
strata <- "STRATA1"
lyt_04 <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by(var = "ARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "is_rsp",
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Unstratified Analysis",
    table_names = "est_prop_diff"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    table_names = "test_prop"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    table_names = "est_or"
  ) %>%
  estimate_proportion_diff(
    vars = "is_rsp",
    show_labels = "visible",
    var_labels = "Stratified Analysis",
    method = "cmh",
    variables = list(strata = strata),
    table_names = "est_prop_diff_strat"
  ) %>%
  test_proportion_diff(
    vars = "is_rsp",
    method = "cmh",
    variables = list(strata = strata),
    table_names = "test_prop_strat"
  ) %>%
  estimate_odds_ratio(
    vars = "is_rsp",
    variables = list(strata = strata, arm = "ARM"),
    table_names = "est_or_strat"
  ) %>%
  estimate_multinomial_response(var = "rsp_lab")

result <- build_table(lyt = lyt_04, df = anl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant4")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Table Modifying the Definition <br/> of Overall Response

The definition of *responders* is realized during the pre-processing step. The layout does not need to be modified and can be reused.

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant5, test = list(result_v5 = "result")}
anl <- anl_adsl %>%
  left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
  mutate(rsp_lab = d_onco_rsp_label(AVALC)) %>%
  mutate(is_rsp = AVALC == "CR") %>%
  mutate(ARM = relevel(ARM, ref = "A: Drug X")) %>%
  var_relabel(ARM = "Description of Planned Arm")

result <- build_table(lyt = lyt_01, df = anl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant5")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Table Defining New <br/> Sections to Display

Similarly to in the previous tab, redefinition or relabeling of the result is a pre-processing step and the original table layout can be reused.

::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview

```{r variant6, test = list(result_v6 = "result")}
anl <- anl_adsl %>%
  left_join(anl_adrs, by = c("STUDYID", "USUBJID")) %>%
  mutate(rsp_lab = as.character(d_onco_rsp_label(AVALC))) %>%
  mutate(
    rsp_lab = case_when(
      rsp_lab == "Complete Response (CR)" ~ "No Progression",
      rsp_lab == "Partial Response (PR)" ~ "No Progression",
      rsp_lab == "Stable Disease (SD)" ~ "No Progression",
      TRUE ~ rsp_lab
    )
  ) %>%
  mutate(is_rsp = rsp_lab %in% "No Progression") %>%
  mutate(ARM = relevel(ARM, ref = "A: Drug X")) %>%
  var_relabel(ARM = "Description of Planned Arm")

result <- build_table(lyt = lyt_01, df = anl)
result
```

```{r include = FALSE}
webr_code_labels <- c("variant6")
```

{{< include ../../_utils/webr.qmd >}}
:::

## Data Setup

```{r setup}
#| code-fold: show
```
:::::::::

{{< include ../../_utils/save_results.qmd >}}

## `teal` App

::: {.panel-tabset .nav-justified}
## {{< fa regular file-lines fa-sm fa-fw >}} Preview

```{r teal, opts.label = c("skip_if_testing", "app")}
library(teal.modules.clinical)

## Data reproducible code
data <- teal_data()
data <- within(data, {
  library(dplyr)

  ADSL <- random.cdisc.data::cadsl
  ADRS <- random.cdisc.data::cadrs

  # Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
  ADSL <- df_explicit_na(ADSL)
  ADRS <- df_explicit_na(ADRS)

  ADSL <- ADSL %>%
    mutate(Dum_ARM = factor(rep("Single ARM", nrow(.))))
  ADRS <- ADRS %>%
    mutate(Dum_ARM = factor(rep("Single ARM", nrow(.))))
})
datanames <- c("ADSL", "ADRS")
datanames(data) <- datanames
join_keys(data) <- default_cdisc_join_keys[datanames]

## Reusable Configuration For Modules
ADRS <- data[["ADRS"]]
arm_ref_comp <- list(
  ACTARMCD = list(
    ref = "ARM B",
    comp = c("ARM A", "ARM C")
  ),
  ARM = list(
    ref = "B: Placebo",
    comp = c("A: Drug X", "C: Combination")
  )
)

## Setup App
app <- init(
  data = data,
  modules = modules(
    tm_t_binary_outcome(
      label = "Responders",
      dataname = "ADRS",
      paramcd = choices_selected(
        choices = value_choices(ADRS, "PARAMCD", "PARAM"),
        selected = "BESRSPI"
      ),
      arm_var = choices_selected(
        choices = variable_choices(ADRS, c("ARM", "ARMCD", "ACTARMCD", "Dum_ARM")),
        selected = "ARM"
      ),
      arm_ref_comp = arm_ref_comp,
      strata_var = choices_selected(
        choices = variable_choices(ADRS, c("SEX", "BMRKR2")),
        select = NULL
      ),
      rsp_table = TRUE
    )
  )
)

shinyApp(app$ui, app$server)
```

{{< include ../../_utils/shinylive.qmd >}}
:::

{{< include ../../repro.qmd >}}

Made with ❤️ by the NEST Team

  • Edit this page
  • Report an issue
Cookie Preferences