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 <- pharmaverseadam::adae
adsl <- pharmaverseadam::adsl

adsl <- adsl |>
  filter(SAFFL == "Y") |>
  mutate(any_ae = "Any AE")

data <- adae |>
  filter(
    SAFFL == "Y",
    TRTEMFL == "Y"
  ) |>
  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 Placebo
N = 861
Xanomeline High Dose
N = 841
Xanomeline Low Dose
N = 841
Any AE 65 (75.6%) 75 (89.3%) 77 (91.7%)
Sex


    F 40 (75.5%) 36 (90.0%) 44 (88.0%)
    M 25 (75.8%) 39 (88.6%) 33 (97.1%)
Age Group, years


    >64 55 (76.4%) 65 (89.0%) 69 (90.8%)
    18-64 10 (71.4%) 10 (90.9%) 8 (100.0%)
Race


    AMERICAN INDIAN OR ALASKA NATIVE 0 (0.0%) 1 (100.0%) 0 (0.0%)
    BLACK OR AFRICAN AMERICAN 6 (75.0%) 7 (77.8%) 4 (66.7%)
    WHITE 59 (75.6%) 67 (90.5%) 73 (93.6%)
Ethnicity


    HISPANIC OR LATINO 3 (100.0%) 3 (100.0%) 6 (100.0%)
    NOT HISPANIC OR LATINO 62 (74.7%) 72 (88.9%) 71 (91.0%)
1 n/N_s (%)

Code
ard <- gather_ard(tbl)

ard
$tbl_ard_summary
{cards} data frame: 103 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      Placebo   any_ae         Any AE categori…         n          n      65       0                   stat_1
4     ARM      Placebo      SEX              F categori…         n          n      40       0                   stat_1
5     ARM      Placebo      SEX              M categori…         n          n      25       0                   stat_1
6     ARM      Placebo   AGEGR1            >64 categori…         n          n      55       0                   stat_1
7     ARM      Placebo   AGEGR1          18-64 categori…         n          n      10       0                   stat_1
8     ARM      Placebo     RACE      AMERICAN… categori…         n          n       0       0                   stat_1
9     ARM      Placebo     RACE      BLACK OR… categori…         n          n       6       0                   stat_1
10    ARM      Placebo     RACE          WHITE categori…         n          n      59       0                   stat_1
11    ARM      Placebo   ETHNIC      HISPANIC… categori…         n          n       3       0                   stat_1
12    ARM      Placebo   ETHNIC      NOT HISP… categori…         n          n      62       0                   stat_1
13    ARM      Placebo   any_ae         Any AE categori…       N_s        N_s      86       0                   stat_1
14    ARM      Placebo      SEX              F categori…       N_s        N_s      53       0                   stat_1
15    ARM      Placebo      SEX              M categori…       N_s        N_s      33       0                   stat_1
16    ARM      Placebo   AGEGR1            >64 categori…       N_s        N_s      72       0                   stat_1
17    ARM      Placebo   AGEGR1          18-64 categori…       N_s        N_s      14       0                   stat_1
18    ARM      Placebo     RACE      AMERICAN… categori…       N_s        N_s       0       0                   stat_1
19    ARM      Placebo     RACE      BLACK OR… categori…       N_s        N_s       8       0                   stat_1
20    ARM      Placebo     RACE          WHITE categori…       N_s        N_s      78       0                   stat_1
21    ARM      Placebo   ETHNIC      HISPANIC… categori…       N_s        N_s       3       0                   stat_1
22    ARM      Placebo   ETHNIC      NOT HISP… categori…       N_s        N_s      83       0                   stat_1
23    ARM      Placebo   any_ae         Any AE categori…         p          %   0.756    <fn>                   stat_1
24    ARM      Placebo      SEX              F categori…         p          %   0.755    <fn>                   stat_1
25    ARM      Placebo      SEX              M categori…         p          %   0.758    <fn>                   stat_1
26    ARM      Placebo   AGEGR1            >64 categori…         p          %   0.764    <fn>                   stat_1
27    ARM      Placebo   AGEGR1          18-64 categori…         p          %   0.714    <fn>                   stat_1
28    ARM      Placebo     RACE      AMERICAN… categori…         p          %       0    <fn>                   stat_1
29    ARM      Placebo     RACE      BLACK OR… categori…         p          %    0.75    <fn>                   stat_1
30    ARM      Placebo     RACE          WHITE categori…         p          %   0.756    <fn>                   stat_1
31    ARM      Placebo   ETHNIC      HISPANIC… categori…         p          %       1    <fn>                   stat_1
32    ARM      Placebo   ETHNIC      NOT HISP… categori…         p          %   0.747    <fn>                   stat_1
33    ARM    Xanomeli…   any_ae         Any AE categori…         n          n      75       0                   stat_2
34    ARM    Xanomeli…      SEX              F categori…         n          n      36       0                   stat_2
35    ARM    Xanomeli…      SEX              M categori…         n          n      39       0                   stat_2
36    ARM    Xanomeli…   AGEGR1            >64 categori…         n          n      65       0                   stat_2
37    ARM    Xanomeli…   AGEGR1          18-64 categori…         n          n      10       0                   stat_2
38    ARM    Xanomeli…     RACE      AMERICAN… categori…         n          n       1       0                   stat_2
39    ARM    Xanomeli…     RACE      BLACK OR… categori…         n          n       7       0                   stat_2
40    ARM    Xanomeli…     RACE          WHITE categori…         n          n      67       0                   stat_2
ℹ 63 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 <- pharmaverseadam::adae
adsl <- pharmaverseadam::adsl

adsl <- adsl |>
  filter(SAFFL == "Y") |>
  mutate(any_ae = "Any AE")

data <- adae |>
  filter(
    SAFFL == "Y",
    TRTEMFL == "Y"
  ) |>
  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