# Layout for Baseline Prevalence of NAbslyt_bl <-basic_table(show_colcounts =TRUE) %>%split_cols_by("ACTARM",split_fun = custom_column_split_fun ) %>%count_patients_with_flags("USUBJID",flag_variables =c("ADABLPFL", "PADABLPFL"),.stats ="count",var_labels ="Baseline Prevalence of NAbs",show_labels ="visible",table_names ="t1" ) %>%count_patients_with_flags("USUBJID",flag_variables ="PNABBLFL",table_names ="t2",.indent_mods =1L,show_labels ="hidden" ) %>%count_patients_with_flags("USUBJID",flag_variables ="NNABBLFL",.stats ="count",table_names ="t3",.indent_mods =1L,show_labels ="hidden" )# Layout for incidence of NAbslyt_pb <-basic_table(show_colcounts =TRUE) %>%split_cols_by("ACTARM",split_fun = custom_column_split_fun ) %>%count_patients_with_flags("USUBJID",flag_variables =c("ADPBLPFL", "ADAPFL"),.stats ="count",var_labels ="Incidence of NAbs",show_labels ="visible",table_names ="tb1" ) %>%count_patients_with_flags("USUBJID",flag_variables ="NABPFL",table_names ="tb2",.indent_mods =1L,show_labels ="hidden" ) %>%count_patients_with_flags("USUBJID",flag_variables ="NABNFL",.stats ="count",table_names ="tb3",.indent_mods =1L,show_labels ="hidden" )result_1 <-build_table(lyt_bl, df = adab_b, alt_counts_df = adsl)result_2 <-build_table(lyt_pb, df = adab_pb, alt_counts_df = adsl)# Combine tables.result <-rbind(result_1, result_2)main_title(result) <-paste("Baseline Prevalence and Incidence of Neutralizing Antibodies (NAbs)")subtitles(result) <-paste("Protocol:", unique(adab$PARCAT1)[1])main_footer(result) <-"NAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s) Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s) Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.Number of patients positive for NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have at least one positive post-baseline NAb result during the study period. Number of patients negative for NAb = number of post-baseline evaluable patients with all negative post-baseline NAb results."result
Baseline Prevalence and Incidence of Neutralizing Antibodies (NAbs)
Protocol: A: Drug X Antibody
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
A: Drug X C: Combination All Drug X B: Placebo All Patients
(N=134) (N=132) (N=266) (N=134) (N=400)
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
Baseline Prevalence of NAbs
Baseline evaluable patients for ADA 134 132 266 0 266
Patients with a positive ADA sample at baseline 63 64 127 0 127
Patients with a positive NAb sample at baseline 0 0 0 0 0
Patients with no positive NAb sample at baseline 0 0 0 0 0
Incidence of NAbs
Post-baseline evaluable patients for ADA 134 132 266 0 266
Patients positive for ADA 66 59 125 0 125
Patients positive for NAb 0 0 0 0 0
Patients negative for NAb 134 132 266 0 266
———————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
NAb = Neutralizing Antibodies ADA = Anti-Drug Antibodies (is also referred to as ATA, or Anti-Therapeutic Antibodies) Baseline evaluable patient for ADA = a patient with an ADA assay result from a baseline sample(s) Baseline evaluable patient for NAb = a patient with a NAb assay result from a baseline sample(s) Post-baseline evaluable patient for ADA = a patient with an ADA assay result from at least one post-baseline sample Post-baseline evaluable patient for NAb = a patient with a NAb assay result from at least one post-baseline sample Number of patients positive for ADA = the number of post-baseline evaluable patients for ADA determined to have Treatment Emergent ADA during the study period.
Number of patients positive for NAb = the number (and percentage) of post-baseline evaluable patients for ADA determined to have at least one positive post-baseline NAb result during the study period. Number of patients negative for NAb = number of post-baseline evaluable patients with all negative post-baseline NAb results.
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(tern)library(dplyr)library(tibble)adsl <- random.cdisc.data::cadsladab <- random.cdisc.data::cadab# Order needed for the columns is c(1, 3, 4, 2, 5)reorder_facets <-function(splret, spl, fulldf, ...) { ord <-c(1, 3, 4, 2, 5)make_split_result( splret$values[ord], splret$datasplit[ord], splret$labels[ord] )}# Create a custom split function for adding the new columns (facets) and sorting themcustom_column_split_fun <-make_split_fun(post =list(add_combo_facet("all_X",label ="All Drug X",levels =c("A: Drug X", "C: Combination") ),add_combo_facet("all_pt",label ="All Patients",levels =c("A: Drug X", "B: Placebo", "C: Combination") ), reorder_facets ))# Ensure character variables are converted to factors and empty strings and NAs are explicit missing levels.adsl <-df_explicit_na(adsl)# Baseline Ptsadab_b <-df_explicit_na(adab) %>%filter( ABLFL =="Y", ADABLPFL =="Y", PARAM %in%c("ADA interpreted per sample result","NAB interpreted per sample result" ) ) %>%select(-PARAMCD, -AVALC, -AVALU) %>% tidyr::pivot_wider(names_from = PARAM,values_from = AVAL ) %>%mutate(across(any_of(c("ADA interpreted per sample result","NAB interpreted per sample result" )), as.logical ) ) %>%mutate(ADABLPFL = ADABLPFL =="Y",PADABLPFL =if (exists("ADA interpreted per sample result", where = .)) {`ADA interpreted per sample result`=="TRUE" } else {FALSE },PNABBLFL =if (exists("NAB interpreted per sample result", where = .)) {`NAB interpreted per sample result`=="TRUE" } else {FALSE },NNABBLFL =if (exists("NAB interpreted per sample result", where = .)) {`NAB interpreted per sample result`=="FALSE" } else {FALSE } ) %>%var_relabel(ADABLPFL ="Baseline evaluable patients for ADA",PADABLPFL ="Patients with a positive ADA sample at baseline",PNABBLFL ="Patients with a positive NAb sample at baseline",NNABBLFL ="Patients with no positive NAb sample at baseline" )# Post-Baseline Evaluable Ptsadab_pb_ada <-df_explicit_na(adab) %>%filter(ADPBLPFL =="Y") %>%select(STUDYID, USUBJID, ARM, ACTARM, ADPBLPFL) %>%mutate(ADPBLPFL = ADPBLPFL =="Y") %>%distinct()# Post-Baseline ADA Positive Ptsadab_pb_adap <-df_explicit_na(adab) %>%filter( ABLFL !="Y", PARAM =="ADA interpreted per sample result", AVALC =="POSITIVE" ) %>%mutate(ADAPFL = AVALC =="POSITIVE") %>%select(STUDYID, USUBJID, ARM, ACTARM, ADAPFL) %>%distinct()# Post-Baseline NAb Positive Ptsadab_pb_nabp <-df_explicit_na(adab) %>%filter( ABLFL !="Y", PARAM =="NAb interpreted per sample result", AVALC =="POSITIVE" ) %>%mutate(NABPFL = AVALC =="POSITIVE") %>%select(STUDYID, USUBJID, ARM, ACTARM, NABPFL) %>%distinct()# Post-Baseline NAb Negative Ptsadab_pb_nabn <-df_explicit_na(adab) %>%filter( ABLFL !="Y", PARAM =="NAb interpreted per sample result", AVALC =="NEGATIVE" ) %>%rename(NABNFL = AVALC) %>%select(STUDYID, USUBJID, ARM, ACTARM, NABNFL) %>%distinct()mergecol <-c("STUDYID", "USUBJID", "ARM", "ACTARM")adab_pb <-left_join(adab_pb_ada, adab_pb_adap, by = mergecol) %>%left_join(adab_pb_nabp, by = mergecol) %>%mutate(NABNFL =ifelse(is.na(NABPFL), "TRUE", "FALSE"),NABNFL = NABNFL =="TRUE" ) %>%var_relabel(ADPBLPFL ="Post-baseline evaluable patients for ADA",ADAPFL ="Patients positive for ADA",NABPFL ="Patients positive for NAb",NABNFL ="Patients negative for NAb" )