---
title: ADAT04B
subtitle: Baseline Prevalence and Incidence of NAbs
---
------------------------------------------------------------------------
{{< include ../../_utils/envir_hook.qmd >}}
```{r setup, echo = FALSE, warning = FALSE, message = FALSE}
library(tern)
library(dplyr)
library(tibble)
adsl <- random.cdisc.data::cadsl
adab <- 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 them
custom_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 Pts
adab_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 Pts
adab_pb_ada <- df_explicit_na(adab) %>%
filter(ADPBLPFL == "Y") %>%
select(STUDYID, USUBJID, ARM, ACTARM, ADPBLPFL) %>%
mutate(ADPBLPFL = ADPBLPFL == "Y") %>%
distinct()
# Post-Baseline ADA Positive Pts
adab_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 Pts
adab_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 Pts
adab_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"
)
```
```{r include = FALSE}
webr_code_labels <- c("setup")
```
{{< include ../../_utils/webr_no_include.qmd >}}
## Output
:::: panel-tabset
## Standard Table
::: {.panel-tabset .nav-justified group="webr"}
## {{< fa regular file-lines sm fw >}} Preview
```{r variant1, test = list(result_v1 = "result")}
# Layout for Baseline Prevalence of NAbs
lyt_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 NAbs
lyt_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])
# nolint start: line_length.
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."
# nolint end: line_length.
result
```
```{r include = FALSE}
webr_code_labels <- c("variant1")
```
{{< include ../../_utils/webr.qmd >}}
:::
## Data Setup
```{r setup}
#| code-fold: show
```
::::
{{< include ../../_utils/save_results.qmd >}}
{{< include ../../repro.qmd >}}