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.
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.
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%.
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.
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::cadsladae <- 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")
---title: RMPT06subtitle: Seriousness, Outcomes, Severity, Frequency with 95% CI for Risk Management Plan---------------------------------------------------------------------------{{< include ../../_utils/envir_hook.qmd >}}:::: {.panel-tabset}```{r setup, echo = FALSE}library(tern)library(dplyr)adsl <- random.cdisc.data::cadsladae <- 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")```## Standard TablePlease 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 webr_code_labels <- c("setup", "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 webr_code_labels <- c("setup", "variant2")`{{< include ../../_utils/webr.qmd >}}:::## Table with DifferencesPlease 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 webr_code_labels <- c("setup", "variant3")`{{< include ../../_utils/webr.qmd >}}:::## Table Modifying Alpha Level and <br/> Type of Confidence IntervalThe 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 webr_code_labels <- c("setup", "variant4")`{{< include ../../_utils/webr.qmd >}}:::## Table by SMQ```{r}#| code-fold: show# In progress```## Data SetupThe `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 >}}