cardinal
  • Home
  • Template Catalog
  • About
  • Resources
  • Help
    • Getting Started
    • Report a Bug
    • FAQ

Overview of Adverse Events by Demographic Subgroup, Safety Population, Pooled Analysis (or Trial X)

FDA Table 51

table
FDA
safety
adverse events
  • Table Preview
  • Setup
  • Build Table
  • Build ARD

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 (%)

Code
ard <- gather_ard(tbl)

ard
$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
Source Code
---
title: Overview of Adverse Events by Demographic Subgroup, Safety Population, Pooled Analysis (or Trial X)
subtitle: FDA Table 51
categories: [table, FDA, safety, adverse events]
---

::: panel-tabset
## Table Preview

```{r img, echo=FALSE, fig.align='center', out.width='65%'}
knitr::include_graphics("result.png")
```

## Setup

```{r setup, message=FALSE}
# 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")))
```

## Build Table

```{r tbl, message=FALSE, warning=FALSE}
# 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
```

```{r eval=FALSE, include=FALSE}
# Run chunk locally to generate image file
gt::gtsave(as_gt(tbl), filename = "result.png")
```

```{r img, echo=FALSE, fig.align='center', out.width='65%'}
```

## Build ARD

```{r ard, message=FALSE, warning=FALSE, results='hide'}
ard <- gather_ard(tbl)

ard
```

```{r, echo=FALSE}
# Print ARD
withr::local_options(width = 9999)
print(ard, columns = "all", n = 40, na.print = NULL)
```

:::
 
  • This website as well as code examples are licensed under the Apache License, Version 2.0.
Cookie Preferences