Overview of Adverse Events by Demographic Subgroup, Safety Population, Pooled Analysis (or Trial X)
FDA Table 51
table
FDA
safety
adverse events
Code
# Load libraries & data -------------------------------------
library(dplyr)
library(cards)
library(gtsummary)
adae <- random.cdisc.data::cadae
adsl <- random.cdisc.data::cadsl
adsl <- adsl |>
filter(SAFFL == "Y") |>
mutate(
AGEGR1 = factor(
dplyr::case_when(
AGE >= 17 & AGE < 65 ~ ">=17 to <65",
AGE >= 65 & AGE < 75 ~ "65-74",
AGE >= 75 ~ ">=75"
),
levels = c(">=17 to <65", "65-74", ">=75")
)
) |>
mutate(any_ae = "Any AE")
data <- adae |>
filter(
SAFFL == "Y",
TRTEMFL == "Y"
) |>
mutate(
AGEGR1 = factor(
dplyr::case_when(
AGE >= 17 & AGE < 65 ~ ">=17 to <65",
AGE >= 65 & AGE < 75 ~ "65-74",
AGE >= 75 ~ ">=75"
),
levels = c(">=17 to <65", "65-74", ">=75")
)
) |>
mutate(any_ae = "Any AE") |>
# subset to one AE per subject
dplyr::slice_tail(n = 1L, by = all_of(c("USUBJID", "ARM")))
Code
# generate ARD for `n` statistic
ard_summary <- data |>
ard_categorical(
variables = c(any_ae, SEX, AGEGR1, RACE, ETHNIC),
by = ARM,
statistic = ~"n"
)
# generate ARD for `N_s` statistic
ard_Ns <- adsl |>
ard_categorical(
variables = c(any_ae, SEX, AGEGR1, RACE, ETHNIC),
by = ARM,
statistic = ~"n",
stat_label = ~ list(n = "N_s")
) |>
mutate(stat_name = "N_s")
# generate ARD for `p` statistic
ard_p <-
cards::bind_ard(
ard_summary,
ard_Ns
) |>
select(-stat_label) |>
tidyr::pivot_wider(names_from = stat_name, values_from = stat, values_fn = unlist) |>
rowwise() |>
mutate(
stat_name = "p",
stat_label = "%",
stat = if_else(n > 0, list(n / N_s), list(0)),
fmt_fun = list(label_round(digits = 1, scale = 100))
) |>
select(-n, -N_s)
# combine all ARDs
ard <- cards::bind_ard(ard_summary, ard_Ns, ard_p, ard_categorical(adsl, variables = ARM, statistic = ~"n")) |>
cards::tidy_ard_row_order()
# generate table from ARDs
tbl <-
tbl_ard_summary(
ard,
by = ARM,
# set variable labels
label = list(
SEX = "Sex",
AGEGR1 = "Age Group, years",
RACE = "Race",
ETHNIC = "Ethnicity"
)
) |>
gtsummary::modify_table_body(
\(x) x |> filter(!label %in% "any_ae")
) |>
gtsummary::modify_indent(columns = label, rows = variable == "any_ae", indent = 0L) |>
# update statistic footnote
gtsummary::modify_footnote_header(
footnote = "n/N_s (%)",
columns = all_stat_cols()
) |>
gtsummary::modify_header(all_stat_cols() ~ "**{level}** \n N = {n}")
tbl
Characteristic |
A: Drug X N = 1341 |
B: Placebo N = 1341 |
C: Combination N = 1321 |
---|---|---|---|
Any AE | 122 (91.0%) | 123 (91.8%) | 120 (90.9%) |
Sex | |||
F | 72 (91.1%) | 77 (93.9%) | 65 (92.9%) |
M | 50 (90.9%) | 46 (88.5%) | 55 (88.7%) |
Age Group, years | |||
>=17 to <65 | 122 (91.0%) | 123 (91.8%) | 119 (90.8%) |
65-74 | 0 (0.0%) | 0 (0.0%) | 1 (100.0%) |
>=75 | 0 (0.0%) | 0 (0.0%) | 0 (0.0%) |
Race | |||
ASIAN | 61 (89.7%) | 62 (92.5%) | 63 (86.3%) |
BLACK OR AFRICAN AMERICAN | 28 (90.3%) | 24 (85.7%) | 31 (96.9%) |
WHITE | 26 (96.3%) | 25 (96.2%) | 21 (100.0%) |
AMERICAN INDIAN OR ALASKA NATIVE | 7 (87.5%) | 10 (90.9%) | 5 (83.3%) |
MULTIPLE | 0 (0.0%) | 1 (100.0%) | 0 (0.0%) |
NATIVE HAWAIIAN OR OTHER PACIFIC ISLANDER | 0 (0.0%) | 1 (100.0%) | 0 (0.0%) |
OTHER | 0 (0.0%) | 0 (0.0%) | 0 (0.0%) |
UNKNOWN | 0 (0.0%) | 0 (0.0%) | 0 (0.0%) |
Ethnicity | |||
HISPANIC OR LATINO | 13 (86.7%) | 17 (94.4%) | 13 (86.7%) |
NOT HISPANIC OR LATINO | 95 (91.3%) | 94 (91.3%) | 93 (92.1%) |
NOT REPORTED | 6 (100.0%) | 10 (100.0%) | 10 (90.9%) |
UNKNOWN | 8 (88.9%) | 2 (66.7%) | 4 (80.0%) |
1 n/N_s (%) |
$tbl_ard_summary
{cards} data frame: 175 x 12
group1 group1_level variable variable_level context stat_name stat_label stat fmt_fun warning error gts_column
1 <NA> any_ae attribut… label Variable… any_ae <fn> <NA>
2 <NA> any_ae attribut… class Variable… logical NULL <NA>
3 ARM A: Drug X any_ae Any AE categori… n n 122 0 stat_1
4 ARM A: Drug X SEX F categori… n n 72 0 stat_1
5 ARM A: Drug X SEX M categori… n n 50 0 stat_1
6 ARM A: Drug X AGEGR1 >=17 to … categori… n n 122 0 stat_1
7 ARM A: Drug X AGEGR1 65-74 categori… n n 0 0 stat_1
8 ARM A: Drug X AGEGR1 >=75 categori… n n 0 0 stat_1
9 ARM A: Drug X RACE ASIAN categori… n n 61 0 stat_1
10 ARM A: Drug X RACE BLACK OR… categori… n n 28 0 stat_1
11 ARM A: Drug X RACE WHITE categori… n n 26 0 stat_1
12 ARM A: Drug X RACE AMERICAN… categori… n n 7 0 stat_1
13 ARM A: Drug X RACE MULTIPLE categori… n n 0 0 stat_1
14 ARM A: Drug X RACE NATIVE H… categori… n n 0 0 stat_1
15 ARM A: Drug X RACE OTHER categori… n n 0 0 stat_1
16 ARM A: Drug X RACE UNKNOWN categori… n n 0 0 stat_1
17 ARM A: Drug X ETHNIC HISPANIC… categori… n n 13 0 stat_1
18 ARM A: Drug X ETHNIC NOT HISP… categori… n n 95 0 stat_1
19 ARM A: Drug X ETHNIC NOT REPO… categori… n n 6 0 stat_1
20 ARM A: Drug X ETHNIC UNKNOWN categori… n n 8 0 stat_1
21 ARM A: Drug X any_ae Any AE categori… N_s N_s 134 0 stat_1
22 ARM A: Drug X SEX F categori… N_s N_s 79 0 stat_1
23 ARM A: Drug X SEX M categori… N_s N_s 55 0 stat_1
24 ARM A: Drug X AGEGR1 >=17 to … categori… N_s N_s 134 0 stat_1
25 ARM A: Drug X AGEGR1 65-74 categori… N_s N_s 0 0 stat_1
26 ARM A: Drug X AGEGR1 >=75 categori… N_s N_s 0 0 stat_1
27 ARM A: Drug X RACE ASIAN categori… N_s N_s 68 0 stat_1
28 ARM A: Drug X RACE BLACK OR… categori… N_s N_s 31 0 stat_1
29 ARM A: Drug X RACE WHITE categori… N_s N_s 27 0 stat_1
30 ARM A: Drug X RACE AMERICAN… categori… N_s N_s 8 0 stat_1
31 ARM A: Drug X RACE MULTIPLE categori… N_s N_s 0 0 stat_1
32 ARM A: Drug X RACE NATIVE H… categori… N_s N_s 0 0 stat_1
33 ARM A: Drug X RACE OTHER categori… N_s N_s 0 0 stat_1
34 ARM A: Drug X RACE UNKNOWN categori… N_s N_s 0 0 stat_1
35 ARM A: Drug X ETHNIC HISPANIC… categori… N_s N_s 15 0 stat_1
36 ARM A: Drug X ETHNIC NOT HISP… categori… N_s N_s 104 0 stat_1
37 ARM A: Drug X ETHNIC NOT REPO… categori… N_s N_s 6 0 stat_1
38 ARM A: Drug X ETHNIC UNKNOWN categori… N_s N_s 9 0 stat_1
39 ARM A: Drug X any_ae Any AE categori… p % 0.91 <fn> stat_1
40 ARM A: Drug X SEX F categori… p % 0.911 <fn> stat_1
ℹ 135 more rows
ℹ Use `print(n = ...)` to see more rows