TLG Catalog - Stable
  • Stable
    • Dev
  1. Tables
  2. Risk Management Plan
  3. RMPT06
  • 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
  • Reproducibility
    • Timestamp
    • Session Info
    • .lock file
  • Edit this page
  • Report an issue
  1. Tables
  2. Risk Management Plan
  3. RMPT06

RMPT06

Seriousness, Outcomes, Severity, Frequency with 95% CI for Risk Management Plan


Output

  • Standard Table
  • Table Selecting
    Sections to Display
  • Table with Differences
  • Table Modifying Alpha Level and
    Type of Confidence Interval
  • Table by SMQ
  • Data Setup

Please note that by default the percentage analysis uses Wald’s confidence interval with continuity correction and the default confidence interval for percentage is 95%. To use a different method for confidence interval calculation, the method name needs to be provided to method argument.

  • Preview
  • Try this using WebR
Code
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  estimate_proportion(
    vars = "AEFL",
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "95% CI for % of patients with at least one AE (Clopper-Pearson)"
    ),
    table_names = "est_prop"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser"
  ) %>%
  count_occurrences(
    "AEOUT",
    denom = "n",
    var_labels = "Number of patients with at least one AE by outcome",
    show_labels = "visible"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

result
                                                                   A: Drug X      B: Placebo    C: Combination
                                                                    (N=134)        (N=134)         (N=132)    
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
Number of patients with at least one adverse event                122 (91.0%)    123 (91.8%)     120 (90.9%)  
95% CI for % of patients with at least one AE (Clopper-Pearson)   (84.9, 95.3)   (85.8, 95.8)    (84.7, 95.2) 
Total number of AEs                                                   609            622             703      
Number of patients with at least one AE by worst grade                                                        
  Grade 1                                                           7 (5.2%)       9 (6.7%)        4 (3.0%)   
  Grade 2                                                           6 (4.5%)      10 (7.5%)        7 (5.3%)   
  Grade 3                                                          18 (13.4%)     14 (10.4%)      16 (12.1%)  
  Grade 4                                                          15 (11.2%)     20 (14.9%)      18 (13.6%)  
  Grade 5                                                          76 (56.7%)     70 (52.2%)      75 (56.8%)  
Number of patients with at least one serious AE                   104 (85.2%)    101 (82.1%)      99 (82.5%)  
Number of patients with at least one AE by outcome                                                            
  Fatal outcome                                                    76 (62.3%)     70 (56.9%)      75 (62.5%)  
  Unresolved                                                       66 (54.1%)     64 (52.0%)      70 (58.3%)  
  Recovered/Resolved                                               73 (59.8%)     83 (67.5%)      88 (73.3%)  
  Resolved with sequelae                                           44 (36.1%)     40 (32.5%)      43 (35.8%)  
  Recovering/Resolving                                             81 (66.4%)     84 (68.3%)      88 (73.3%)  
  Unknown outcome                                                  38 (31.1%)     49 (39.8%)      44 (36.7%)  
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
Code
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  estimate_proportion(
    vars = "AEFL",
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "95% CI for % of patients with at least one AE (Clopper-Pearson)"
    ),
    table_names = "est_prop"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser",
    denom = "N_col"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

result
                                                                   A: Drug X      B: Placebo    C: Combination
                                                                    (N=134)        (N=134)         (N=132)    
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
Number of patients with at least one adverse event                122 (91.0%)    123 (91.8%)     120 (90.9%)  
95% CI for % of patients with at least one AE (Clopper-Pearson)   (84.9, 95.3)   (85.8, 95.8)    (84.7, 95.2) 
Total number of AEs                                                   609            622             703      
Number of patients with at least one AE by worst grade                                                        
  Grade 1                                                           7 (5.2%)       9 (6.7%)        4 (3.0%)   
  Grade 2                                                           6 (4.5%)      10 (7.5%)        7 (5.3%)   
  Grade 3                                                          18 (13.4%)     14 (10.4%)      16 (12.1%)  
  Grade 4                                                          15 (11.2%)     20 (14.9%)      18 (13.6%)  
  Grade 5                                                          76 (56.7%)     70 (52.2%)      75 (56.8%)  
Number of patients with at least one serious AE                   104 (77.6%)    101 (75.4%)      99 (75.0%)  
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.

Please note that by default the percentage difference analysis also uses Wald’s confidence interval with continuity correction and the default confidence interval is 95%.

  • Preview
  • Try this using WebR
Code
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "AEFL",
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "95% CI for % of patients with at least one AE"
    ),
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "AEFL",
    .labels = c(
      diff = "Difference in % of patients with at least one AE",
      diff_ci = "95% CI of difference (Wald, with correction)"
    ),
    table_names = "est_prop_diff"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser",
    denom = "N_col"
  ) %>%
  count_occurrences(
    "AEOUT",
    denom = "n",
    var_labels = "Number of patients with at least one AE by outcome",
    show_labels = "visible"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

result
                                                          A: Drug X      B: Placebo    C: Combination
                                                           (N=134)        (N=134)         (N=132)    
—————————————————————————————————————————————————————————————————————————————————————————————————————
Number of patients with at least one adverse event       122 (91.0%)    123 (91.8%)     120 (90.9%)  
95% CI for % of patients with at least one AE            (84.9, 95.3)   (85.8, 95.8)    (84.7, 95.2) 
Difference in % of patients with at least one AE                            0.7             -0.1     
  95% CI of difference (Wald, with correction)                          (-6.7, 8.2)     (-7.8, 7.5)  
Total number of AEs                                          609            622             703      
Number of patients with at least one AE by worst grade                                               
  Grade 1                                                  7 (5.2%)       9 (6.7%)        4 (3.0%)   
  Grade 2                                                  6 (4.5%)      10 (7.5%)        7 (5.3%)   
  Grade 3                                                 18 (13.4%)     14 (10.4%)      16 (12.1%)  
  Grade 4                                                 15 (11.2%)     20 (14.9%)      18 (13.6%)  
  Grade 5                                                 76 (56.7%)     70 (52.2%)      75 (56.8%)  
Number of patients with at least one serious AE          104 (77.6%)    101 (75.4%)      99 (75.0%)  
Number of patients with at least one AE by outcome                                                   
  Fatal outcome                                           76 (62.3%)     70 (56.9%)      75 (62.5%)  
  Unresolved                                              66 (54.1%)     64 (52.0%)      70 (58.3%)  
  Recovered/Resolved                                      73 (59.8%)     83 (67.5%)      88 (73.3%)  
  Resolved with sequelae                                  44 (36.1%)     40 (32.5%)      43 (35.8%)  
  Recovering/Resolving                                    81 (66.4%)     84 (68.3%)      88 (73.3%)  
  Unknown outcome                                         38 (31.1%)     49 (39.8%)      44 (36.7%)  
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 can be changed through the conf_level argument.

  • Preview
  • Try this using WebR
Code
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "AEFL",
    conf_level = 0.90,
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "90% CI for % of patients with at least one AE (Clopper-Pearson)"
    ),
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "AEFL",
    conf_level = 0.90,
    method = "newcombe",
    .labels = c(
      diff = "Difference in % of patients with at least one AE",
      diff_ci = "90% CI of difference (Newcombe)"
    ),
    table_names = "est_prop_diff"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser",
    denom = "N_col"
  ) %>%
  count_occurrences(
    "AEOUT",
    denom = "n",
    var_labels = "Number of patients with at least one AE by outcome",
    show_labels = "visible"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

result
                                                                   A: Drug X      B: Placebo    C: Combination
                                                                    (N=134)        (N=134)         (N=132)    
——————————————————————————————————————————————————————————————————————————————————————————————————————————————
Number of patients with at least one adverse event                122 (91.0%)    123 (91.8%)     120 (90.9%)  
90% CI for % of patients with at least one AE (Clopper-Pearson)   (85.9, 94.8)   (86.8, 95.3)    (85.7, 94.7) 
Difference in % of patients with at least one AE                                     0.7             -0.1     
  90% CI of difference (Newcombe)                                                (-5.1, 6.6)     (-6.1, 5.8)  
Total number of AEs                                                   609            622             703      
Number of patients with at least one AE by worst grade                                                        
  Grade 1                                                           7 (5.2%)       9 (6.7%)        4 (3.0%)   
  Grade 2                                                           6 (4.5%)      10 (7.5%)        7 (5.3%)   
  Grade 3                                                          18 (13.4%)     14 (10.4%)      16 (12.1%)  
  Grade 4                                                          15 (11.2%)     20 (14.9%)      18 (13.6%)  
  Grade 5                                                          76 (56.7%)     70 (52.2%)      75 (56.8%)  
Number of patients with at least one serious AE                   104 (77.6%)    101 (75.4%)      99 (75.0%)  
Number of patients with at least one AE by outcome                                                            
  Fatal outcome                                                    76 (62.3%)     70 (56.9%)      75 (62.5%)  
  Unresolved                                                       66 (54.1%)     64 (52.0%)      70 (58.3%)  
  Recovered/Resolved                                               73 (59.8%)     83 (67.5%)      88 (73.3%)  
  Resolved with sequelae                                           44 (36.1%)     40 (32.5%)      43 (35.8%)  
  Recovering/Resolving                                             81 (66.4%)     84 (68.3%)      88 (73.3%)  
  Unknown outcome                                                  38 (31.1%)     49 (39.8%)      44 (36.7%)  
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
# In progress

The adae and adsl datasets need to undergo data processing before table production. Some new variables are added to these datasets to create the desired tables.

Code
library(tern)
library(dplyr)

adsl <- random.cdisc.data::cadsl
adae <- random.cdisc.data::cadae

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adae <- df_explicit_na(
  adae,
  omit_columns = c("SMQ01NAM", "SMQ01SC", "SMQ02NAM", "SMQ02SC", "CQ01NAM", "STUDYID", "USUBJID")
)

df_max <- aggregate(as.numeric(AETOXGR) ~ USUBJID, data = adae, FUN = max, drop = FALSE)
colnames(df_max) <- c("USUBJID", "WTOXGR")

adae <- adae %>%
  left_join(df_max, by = c("USUBJID")) %>%
  mutate(
    WTOXGR = factor(WTOXGR, levels = c("1", "2", "3", "4", "5")),
    fl_ser = AESER == "Y"
  ) %>%
  mutate(
    WTOXGR = forcats::fct_recode(
      WTOXGR,
      "Grade 1" = "1",
      "Grade 2" = "2",
      "Grade 3" = "3",
      "Grade 4" = "4",
      "Grade 5" = "5"
    ),
    AEOUT = forcats::fct_recode(
      AEOUT,
      "Fatal outcome" = "FATAL",
      "Unresolved" = "NOT RECOVERED/NOT RESOLVED",
      "Recovered/Resolved" = "RECOVERED/RESOLVED",
      "Resolved with sequelae" = "RECOVERED/RESOLVED WITH SEQUELAE",
      "Recovering/Resolving" = "RECOVERING/RESOLVING",
      "Unknown outcome" = "UNKNOWN"
    )
  ) %>%
  var_relabel(
    WTOXGR = "Worst overall grade",
    fl_ser = "Number of patients with at least one serious AE"
  )

# Add AE flag to adsl.
adsl1 <- adsl %>%
  mutate(AEFL = ifelse(USUBJID %in% adae$USUBJID, TRUE, FALSE)) %>%
  var_relabel(AEFL = "At least one AE")

Reproducibility

Timestamp

[1] "2025-07-05 17:42:54 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
 checkmate           2.3.2   2024-07-29 [1] RSPM
 cli                 3.6.5   2025-04-23 [1] RSPM
 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
 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
 forcats             1.0.0   2023-01-29 [1] RSPM
 formatters        * 0.5.11  2025-04-09 [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
 jsonlite            2.0.0   2025-03-27 [1] RSPM
 knitr               1.50    2025-03-16 [1] RSPM
 lattice             0.22-7  2025-04-02 [2] CRAN (R 4.5.0)
 lifecycle           1.0.4   2023-11-07 [1] RSPM
 magrittr          * 2.0.3   2022-03-30 [1] RSPM
 Matrix              1.7-3   2025-03-11 [1] CRAN (R 4.5.0)
 nestcolor           0.1.3   2025-01-21 [1] RSPM
 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
 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
 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
 scales              1.4.0   2025-04-24 [1] RSPM
 sessioninfo         1.2.3   2025-02-05 [1] any (@1.2.3)
 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)
 tern              * 0.9.9   2025-06-20 [1] RSPM
 testthat            3.2.3   2025-01-13 [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
 xfun                0.52    2025-04-02 [1] RSPM
 yaml                2.3.10  2024-07-26 [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

RMPT05
ENTXX
Source Code
---
title: RMPT06
subtitle: Seriousness, Outcomes, Severity, Frequency with 95% CI for Risk Management Plan
---

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

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

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

adsl <- random.cdisc.data::cadsl
adae <- random.cdisc.data::cadae

# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.
adsl <- df_explicit_na(adsl)
adae <- df_explicit_na(
  adae,
  omit_columns = c("SMQ01NAM", "SMQ01SC", "SMQ02NAM", "SMQ02SC", "CQ01NAM", "STUDYID", "USUBJID")
)

df_max <- aggregate(as.numeric(AETOXGR) ~ USUBJID, data = adae, FUN = max, drop = FALSE)
colnames(df_max) <- c("USUBJID", "WTOXGR")

adae <- adae %>%
  left_join(df_max, by = c("USUBJID")) %>%
  mutate(
    WTOXGR = factor(WTOXGR, levels = c("1", "2", "3", "4", "5")),
    fl_ser = AESER == "Y"
  ) %>%
  mutate(
    WTOXGR = forcats::fct_recode(
      WTOXGR,
      "Grade 1" = "1",
      "Grade 2" = "2",
      "Grade 3" = "3",
      "Grade 4" = "4",
      "Grade 5" = "5"
    ),
    AEOUT = forcats::fct_recode(
      AEOUT,
      "Fatal outcome" = "FATAL",
      "Unresolved" = "NOT RECOVERED/NOT RESOLVED",
      "Recovered/Resolved" = "RECOVERED/RESOLVED",
      "Resolved with sequelae" = "RECOVERED/RESOLVED WITH SEQUELAE",
      "Recovering/Resolving" = "RECOVERING/RESOLVING",
      "Unknown outcome" = "UNKNOWN"
    )
  ) %>%
  var_relabel(
    WTOXGR = "Worst overall grade",
    fl_ser = "Number of patients with at least one serious AE"
  )

# Add AE flag to adsl.
adsl1 <- adsl %>%
  mutate(AEFL = ifelse(USUBJID %in% adae$USUBJID, TRUE, FALSE)) %>%
  var_relabel(AEFL = "At least one AE")
```

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

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

## Output

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

Please note that by default the percentage analysis uses Wald's confidence interval with continuity correction and the default confidence interval for percentage is 95%. To use a different method for confidence interval calculation, the method name needs to be provided to `method` argument.

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

```{r variant1, test = list(result_v1 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  estimate_proportion(
    vars = "AEFL",
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "95% CI for % of patients with at least one AE (Clopper-Pearson)"
    ),
    table_names = "est_prop"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser"
  ) %>%
  count_occurrences(
    "AEOUT",
    denom = "n",
    var_labels = "Number of patients with at least one AE by outcome",
    show_labels = "visible"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

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

```{r variant2, test = list(result_v2 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  estimate_proportion(
    vars = "AEFL",
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "95% CI for % of patients with at least one AE (Clopper-Pearson)"
    ),
    table_names = "est_prop"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser",
    denom = "N_col"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

result
```

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

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

## Table with Differences

Please note that by default the percentage difference analysis also uses Wald's confidence interval with continuity correction and the default confidence interval is 95%.

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

```{r variant3, test = list(result_v3 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "AEFL",
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "95% CI for % of patients with at least one AE"
    ),
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "AEFL",
    .labels = c(
      diff = "Difference in % of patients with at least one AE",
      diff_ci = "95% CI of difference (Wald, with correction)"
    ),
    table_names = "est_prop_diff"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser",
    denom = "N_col"
  ) %>%
  count_occurrences(
    "AEOUT",
    denom = "n",
    var_labels = "Number of patients with at least one AE by outcome",
    show_labels = "visible"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

result
```

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

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

## Table Modifying Alpha Level and <br/> Type of Confidence Interval

The confidence level can be changed through the `conf_level` argument.

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

```{r variant4, test = list(result_v4 = "result")}
lyt_adsl <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM", ref_group = "A: Drug X") %>%
  estimate_proportion(
    vars = "AEFL",
    conf_level = 0.90,
    method = "clopper-pearson",
    .labels = c(
      n_prop = "Number of patients with at least one adverse event",
      prop_ci = "90% CI for % of patients with at least one AE (Clopper-Pearson)"
    ),
    table_names = "est_prop"
  ) %>%
  estimate_proportion_diff(
    vars = "AEFL",
    conf_level = 0.90,
    method = "newcombe",
    .labels = c(
      diff = "Difference in % of patients with at least one AE",
      diff_ci = "90% CI of difference (Newcombe)"
    ),
    table_names = "est_prop_diff"
  )

result_adsl <- build_table(lyt_adsl, df = adsl1, alt_counts_df = adsl1)

# Layout for variables from adae dataset.
lyt_adae <- basic_table(show_colcounts = TRUE) %>%
  split_cols_by("ACTARM") %>%
  count_values(
    "STUDYID",
    values = as.character(unique(adae$STUDYID)),
    .stats = "count",
    .labels = c(count = "Total number of AEs"),
    table_names = "total_aes"
  ) %>%
  count_occurrences(
    "WTOXGR",
    var_labels = "Number of patients with at least one AE by worst grade",
    show_labels = "visible"
  ) %>%
  count_patients_with_flags(
    "USUBJID",
    flag_variables = "fl_ser",
    denom = "N_col"
  ) %>%
  count_occurrences(
    "AEOUT",
    denom = "n",
    var_labels = "Number of patients with at least one AE by outcome",
    show_labels = "visible"
  )

result_adae <- build_table(lyt_adae, df = adae, alt_counts_df = adsl)

# Combine tables.
col_info(result_adsl) <- col_info(result_adae)
result <- rbind(
  result_adsl,
  result_adae[seq_len(nrow(result_adae)), ]
)

result
```

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

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

## Table by SMQ

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

# In progress
```

## Data Setup

The `adae` and `adsl` datasets need to undergo data processing before table production. Some new variables are added to these datasets to create the desired tables.

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

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

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

Made with ❤️ by the NEST Team

  • Edit this page
  • Report an issue
Cookie Preferences