FDA Table 20
Adverse Events of Special Interest Assessment, Safety Population, Pooled Analysis (or Trial X)
table
FDA
safety
adverse events
Code
# Load libraries & data -------------------------------------
library(dplyr)
library(cards)
library(cardx)
library(gtsummary)
adsl <- random.cdisc.data::cadsl
adae <- random.cdisc.data::cadae
set.seed(1)
adae$AESIFL <- ifelse(adae$AESOC %in% c("cl A", "cl D"), "Y", "N")
adae$AELABFL <- sample(c("Y", "N"), nrow(adae), replace = TRUE)
# Pre-processing --------------------------------------------
adsl <- adsl |>
filter(SAFFL == "Y") # safety population
data <- adae |>
filter(
SAFFL == "Y", # safety population
AESIFL == "Y" # AESI assessment
)
# dataset of AE flag variable counts by subject
data_ae_fl <-
adsl |>
select(USUBJID, TRT01A) |>
# create subject-level flags from adae data
left_join(
data |>
select(USUBJID, AESER, AESDTH, AEACN, AEREL, AELABFL) |>
mutate(
# Serious AE
ae_ser = any(AESER == "Y"),
# Serious AE leading to death
ae_ser_death = any(AESER == "Y" & AESDTH == "Y"),
# AE resulting in discontinuation
ae_withdraw = any(AEACN == "DRUG WITHDRAWN"),
# Related AE
ae_rel = any(AEREL == "Y"),
# Laboratory assessment
ae_lab = any(AELABFL == "Y"),
.by = USUBJID
),
by = "USUBJID"
) |>
distinct(USUBJID, .keep_all = TRUE) |>
# add number of AEs
left_join(
data |> summarise(.by = USUBJID, ae_count = n()),
by = "USUBJID",
relationship = "one-to-one"
)
Code
## AE grouping flags section --------
tbl_ae_gp <- data |>
tbl_hierarchical(
variables = AEDECOD,
id = USUBJID,
denominator = adsl,
by = TRT01A,
overall_row = TRUE,
label = list(
..ard_hierarchical_overall.. = "AE grouping related to AESI",
AEDECOD = "AESI Assessment"
)
) |>
modify_indent(columns = label, rows = variable != "..ard_hierarchical_overall..", indent = 4L)
## Maximum severity section ---------
tbl_ae_sev <- data |>
ard_categorical_max(variables = AESEV, id = USUBJID, by = TRT01A, denominator = adsl, quiet = TRUE) |>
tbl_ard_summary(by = TRT01A, label = list(AESEV = "Maximum severity"))
## Events section -------------------
tbl_ae_fl <- data_ae_fl |>
tbl_summary(
by = "TRT01A",
include = c(ae_ser, ae_ser_death, ae_withdraw, ae_rel, ae_lab),
missing = "no",
percent = adsl,
label = list(
ae_ser = "Serious",
ae_ser_death = "Deaths",
ae_withdraw = "Resulting in discontinuation",
ae_rel = "Relatedness",
ae_lab = "Laboratory Assessment"
)
) |>
modify_indent(columns = label, rows = label == "Deaths", indent = 4L)
## Build table ----------------------
tbl <- tbl_stack(list(tbl_ae_gp, tbl_ae_sev, tbl_ae_fl), quiet = TRUE)
{cards} data frame: 226 x 13
group1 group1_level variable variable_level context stat_name stat_label stat stat_fmt fmt_fun warning error gts_column
1 TRT01A A: Drug X ..ard_hierarchical_overall.. TRUE hierarch… n n 107 107 <fn> stat_1
2 TRT01A A: Drug X ..ard_hierarchical_overall.. TRUE hierarch… N N 134 134 <fn> stat_1
3 TRT01A A: Drug X ..ard_hierarchical_overall.. TRUE hierarch… p % 0.799 80 <fn> stat_1
4 TRT01A B: Place… ..ard_hierarchical_overall.. TRUE hierarch… n n 112 112 <fn> stat_2
5 TRT01A B: Place… ..ard_hierarchical_overall.. TRUE hierarch… N N 134 134 <fn> stat_2
6 TRT01A B: Place… ..ard_hierarchical_overall.. TRUE hierarch… p % 0.836 84 <fn> stat_2
7 TRT01A C: Combi… ..ard_hierarchical_overall.. TRUE hierarch… n n 113 113 <fn> stat_3
8 TRT01A C: Combi… ..ard_hierarchical_overall.. TRUE hierarch… N N 132 132 <fn> stat_3
9 TRT01A C: Combi… ..ard_hierarchical_overall.. TRUE hierarch… p % 0.856 86 <fn> stat_3
10 TRT01A A: Drug X AEDECOD dcd A.1.… hierarch… n n 50 50 <fn> stat_1
11 TRT01A A: Drug X AEDECOD dcd A.1.… hierarch… N N 134 134 <fn> stat_1
12 TRT01A A: Drug X AEDECOD dcd A.1.… hierarch… p % 0.373 37 <fn> stat_1
13 TRT01A B: Place… AEDECOD dcd A.1.… hierarch… n n 45 45 <fn> stat_2
14 TRT01A B: Place… AEDECOD dcd A.1.… hierarch… N N 134 134 <fn> stat_2
15 TRT01A B: Place… AEDECOD dcd A.1.… hierarch… p % 0.336 34 <fn> stat_2
16 TRT01A C: Combi… AEDECOD dcd A.1.… hierarch… n n 63 63 <fn> stat_3
17 TRT01A C: Combi… AEDECOD dcd A.1.… hierarch… N N 132 132 <fn> stat_3
18 TRT01A C: Combi… AEDECOD dcd A.1.… hierarch… p % 0.477 48 <fn> stat_3
19 TRT01A A: Drug X AEDECOD dcd A.1.… hierarch… n n 48 48 <fn> stat_1
20 TRT01A A: Drug X AEDECOD dcd A.1.… hierarch… N N 134 134 <fn> stat_1
21 TRT01A A: Drug X AEDECOD dcd A.1.… hierarch… p % 0.358 36 <fn> stat_1
22 TRT01A B: Place… AEDECOD dcd A.1.… hierarch… n n 48 48 <fn> stat_2
23 TRT01A B: Place… AEDECOD dcd A.1.… hierarch… N N 134 134 <fn> stat_2
24 TRT01A B: Place… AEDECOD dcd A.1.… hierarch… p % 0.358 36 <fn> stat_2
25 TRT01A C: Combi… AEDECOD dcd A.1.… hierarch… n n 50 50 <fn> stat_3
26 TRT01A C: Combi… AEDECOD dcd A.1.… hierarch… N N 132 132 <fn> stat_3
27 TRT01A C: Combi… AEDECOD dcd A.1.… hierarch… p % 0.379 38 <fn> stat_3
28 TRT01A A: Drug X AEDECOD dcd D.1.… hierarch… n n 50 50 <fn> stat_1
29 TRT01A A: Drug X AEDECOD dcd D.1.… hierarch… N N 134 134 <fn> stat_1
30 TRT01A A: Drug X AEDECOD dcd D.1.… hierarch… p % 0.373 37 <fn> stat_1
31 TRT01A B: Place… AEDECOD dcd D.1.… hierarch… n n 42 42 <fn> stat_2
32 TRT01A B: Place… AEDECOD dcd D.1.… hierarch… N N 134 134 <fn> stat_2
33 TRT01A B: Place… AEDECOD dcd D.1.… hierarch… p % 0.313 31 <fn> stat_2
34 TRT01A C: Combi… AEDECOD dcd D.1.… hierarch… n n 51 51 <fn> stat_3
35 TRT01A C: Combi… AEDECOD dcd D.1.… hierarch… N N 132 132 <fn> stat_3
36 TRT01A C: Combi… AEDECOD dcd D.1.… hierarch… p % 0.386 39 <fn> stat_3
37 TRT01A A: Drug X AEDECOD dcd D.1.… hierarch… n n 48 48 <fn> stat_1
38 TRT01A A: Drug X AEDECOD dcd D.1.… hierarch… N N 134 134 <fn> stat_1
39 TRT01A A: Drug X AEDECOD dcd D.1.… hierarch… p % 0.358 36 <fn> stat_1
40 TRT01A B: Place… AEDECOD dcd D.1.… hierarch… n n 42 42 <fn> stat_2
ℹ 186 more rows
ℹ Use `print(n = ...)` to see more rows