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

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

FDA Table 07

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

Code
# Load libraries & data -------------------------------------
library(gtsummary)
library(dplyr)

adsl <- pharmaverseadam::adsl |>
  filter(TRT01A != "Screen Failure")

adae <- pharmaverseadam::adae

# Use safety population only
adsl <- adsl |>
  filter(SAFFL == "Y")

data <- adae |>
  filter(SAFFL == "Y")

set.seed(1)
# this data set doesn't have treatment action recorded. We can generate a variable for demonstration.
aeacn_levels <- c("DRUG INTERRUPTED", "DOSE REDUCED", "DOSE RATE REDUCED", "DOSE INCREASED")
data <- data |>
  mutate(AEACN = factor(sample(aeacn_levels, size = nrow(data), replace = TRUE),
    levels = aeacn_levels
  ))
Code
# --- PART 1: Overview of serious AEs
# Assign a label to each SAE category
sae_vars <- list(
  "SAE" = "AESER",
  "Death" = "AESDTH",
  "Life-threatening" = "AESLIFE",
  "Initial or prolonged hospitalization" = "AESHOSP",
  "Disability or permanent damage" = "AESDISAB"
)

# Summarize SAEs per category
tbl_sae <-
  lapply(
    seq_along(sae_vars),
    function(i) { # apply per category
      data <- data |>
        filter(.data[[sae_vars[[i]]]] == "Y") |>
        mutate(!!sae_vars[[i]] := names(sae_vars)[i]) # convert flag to a meaningful value
      tbl_hierarchical( # calculate rates
        data = data,
        variables = all_of(sae_vars[[i]]),
        by = TRT01A,
        id = USUBJID,
        denominator = adsl,
        label = sae_vars[[i]] ~ "Event"
      )
    }
  ) |>
  tbl_stack() |>
  modify_indent("label", rows = tbl_id1 != 1, indent = 4L)
Column headers among stacked tables differ.
ℹ Use `modify_header()` to update or `quiet = TRUE` to suppress this message.
Code
# --- PART 2: Permanent discontinuation
disc_ae <- adae |>
  # filtering for adverse events with a "discontinued" End of Study Status
  filter(AESER == "Y" & EOSSTT == "DISCONTINUED") |>
  mutate(
    # convert label to a more meaningful value
    AEDISC = "AE leading to permanent discontinuation of treatment"
  )

tbl_disc_ae <- tbl_hierarchical( # calculate rates
  data = disc_ae,
  variables = AEDISC,
  by = TRT01A,
  id = USUBJID,
  denominator = adsl,
  label = AEDISC ~ "Event"
)

# -- PART 3: Dose modification
dose_mod_ae <- data |>
  mutate(
    AEACN = case_when( # convert to meaningful labels
      AEACN == "DRUG INTERRUPTED" ~ "AE leading to interruption of study drug",
      AEACN == "DOSE REDUCED" ~ "AE leading to reduction of study drug",
      AEACN == "DOSE RATE REDUCED" ~ "AE leading to dose delay of study drug",
      AEACN == "DOSE INCREASED" ~ "Other",
      .default = "Other"
    )
  )

tbl_dose_mod_ae <- tbl_hierarchical( # calculate rates
  data = dose_mod_ae,
  denominator = adsl,
  id = "USUBJID",
  by = "TRT01A",
  variables = "AEACN",
  label = list(AEACN ~ "Event", ..ard_hierarchical_overall.. = "AE leading to action taken of treatment"),
  overall_row = TRUE
) |>
  modify_indent(columns = label, rows = variable == "AEACN", indent = 4L)


# -- PART 4: Any AE
tbl_any_ae <- tbl_hierarchical(
  data = adae |> mutate(AESEV = factor(.data$AESEV, ordered = TRUE)),
  variables = AESEV,
  by = TRT01A,
  id = USUBJID,
  denominator = adsl,
  label = list(AESEV ~ "Event", ..ard_hierarchical_overall.. = "Any AE"),
  overall_row = TRUE
) |>
  modify_indent(columns = label, rows = variable == "AESEV", indent = 4L)

# Put it all together
tbl <- list(tbl_sae, tbl_disc_ae, tbl_dose_mod_ae, tbl_any_ae) |>
  tbl_stack() |>
  modify_header(label = "**Adverse Event Category**")
Column headers among stacked tables differ.
ℹ Use `modify_header()` to update or `quiet = TRUE` to suppress this message.
Code
tbl

Code
ard <- gather_ard(tbl)
ard
[[1]]
[[1]][[1]]
[[1]][[1]]$tbl_hierarchical
{cards} data frame: 15 x 13
   group1 group1_level variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A    Xanomeli…    AESER            SAE hierarch…         n          n     1        1    <fn>                   stat_1
11 TRT01A    Xanomeli…    AESER            SAE hierarch…         N          N    72       72    <fn>                   stat_1
12 TRT01A    Xanomeli…    AESER            SAE hierarch…         p          % 0.014      1.4    <fn>                   stat_1
13 TRT01A    Xanomeli…    AESER            SAE hierarch…         n          n     2        2    <fn>                   stat_2
14 TRT01A    Xanomeli…    AESER            SAE hierarch…         N          N    96       96    <fn>                   stat_2
15 TRT01A    Xanomeli…    AESER            SAE hierarch…         p          % 0.021      2.1    <fn>                   stat_2


[[1]][[2]]
[[1]][[2]]$tbl_hierarchical
{cards} data frame: 15 x 13
   group1 group1_level variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A      Placebo   AESDTH          Death hierarch…         n          n     2        2    <fn>                   stat_1
11 TRT01A      Placebo   AESDTH          Death hierarch…         N          N    86       86    <fn>                   stat_1
12 TRT01A      Placebo   AESDTH          Death hierarch…         p          % 0.023      2.3    <fn>                   stat_1
13 TRT01A    Xanomeli…   AESDTH          Death hierarch…         n          n     1        1    <fn>                   stat_2
14 TRT01A    Xanomeli…   AESDTH          Death hierarch…         N          N    96       96    <fn>                   stat_2
15 TRT01A    Xanomeli…   AESDTH          Death hierarch…         p          %  0.01      1.0    <fn>                   stat_2


[[1]][[3]]
[[1]][[3]]$tbl_hierarchical
{cards} data frame: 15 x 13
   group1 group1_level variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A      Placebo  AESLIFE      Life-thr… hierarch…         n          n     2        2    <fn>                   stat_1
11 TRT01A      Placebo  AESLIFE      Life-thr… hierarch…         N          N    86       86    <fn>                   stat_1
12 TRT01A      Placebo  AESLIFE      Life-thr… hierarch…         p          % 0.023      2.3    <fn>                   stat_1
13 TRT01A    Xanomeli…  AESLIFE      Life-thr… hierarch…         n          n     2        2    <fn>                   stat_2
14 TRT01A    Xanomeli…  AESLIFE      Life-thr… hierarch…         N          N    96       96    <fn>                   stat_2
15 TRT01A    Xanomeli…  AESLIFE      Life-thr… hierarch…         p          % 0.021      2.1    <fn>                   stat_2


[[1]][[4]]
[[1]][[4]]$tbl_hierarchical
{cards} data frame: 18 x 13
   group1 group1_level variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A      Placebo  AESHOSP      Initial … hierarch…         n          n     5        5    <fn>                   stat_1
11 TRT01A      Placebo  AESHOSP      Initial … hierarch…         N          N    86       86    <fn>                   stat_1
12 TRT01A      Placebo  AESHOSP      Initial … hierarch…         p          % 0.058      5.8    <fn>                   stat_1
13 TRT01A    Xanomeli…  AESHOSP      Initial … hierarch…         n          n     7        7    <fn>                   stat_2
14 TRT01A    Xanomeli…  AESHOSP      Initial … hierarch…         N          N    72       72    <fn>                   stat_2
15 TRT01A    Xanomeli…  AESHOSP      Initial … hierarch…         p          % 0.097      9.7    <fn>                   stat_2
16 TRT01A    Xanomeli…  AESHOSP      Initial … hierarch…         n          n     7        7    <fn>                   stat_3
17 TRT01A    Xanomeli…  AESHOSP      Initial … hierarch…         N          N    96       96    <fn>                   stat_3
18 TRT01A    Xanomeli…  AESHOSP      Initial … hierarch…         p          % 0.073      7.3    <fn>                   stat_3


[[1]][[5]]
[[1]][[5]]$tbl_hierarchical
{cards} data frame: 12 x 13
   group1 group1_level variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A    Xanomeli… AESDISAB      Disabili… hierarch…         n          n     1        1    <fn>                   stat_1
11 TRT01A    Xanomeli… AESDISAB      Disabili… hierarch…         N          N    96       96    <fn>                   stat_1
12 TRT01A    Xanomeli… AESDISAB      Disabili… hierarch…         p          %  0.01      1.0    <fn>                   stat_1



[[2]]
[[2]]$tbl_hierarchical
{cards} data frame: 15 x 13
   group1 group1_level variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A    Xanomeli…   AEDISC      AE leadi… hierarch…         n          n     1        1    <fn>                   stat_1
11 TRT01A    Xanomeli…   AEDISC      AE leadi… hierarch…         N          N    72       72    <fn>                   stat_1
12 TRT01A    Xanomeli…   AEDISC      AE leadi… hierarch…         p          % 0.014      1.4    <fn>                   stat_1
13 TRT01A    Xanomeli…   AEDISC      AE leadi… hierarch…         n          n     2        2    <fn>                   stat_2
14 TRT01A    Xanomeli…   AEDISC      AE leadi… hierarch…         N          N    96       96    <fn>                   stat_2
15 TRT01A    Xanomeli…   AEDISC      AE leadi… hierarch…         p          % 0.021      2.1    <fn>                   stat_2


[[3]]
[[3]]$tbl_hierarchical
{cards} data frame: 54 x 13
   group1 group1_level                     variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                                    TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                                    TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                                    TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                                    TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                                    TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                                    TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                                    TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                                    TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                                    TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A      Placebo ..ard_hierarchical_overall..           TRUE hierarch…         n          n    69       69    <fn>                   stat_1
ℹ 44 more rows
ℹ Use `print(n = ...)` to see more rows


[[4]]
[[4]]$tbl_hierarchical
{cards} data frame: 45 x 13
   group1 group1_level                     variable variable_level   context stat_name stat_label  stat stat_fmt fmt_fun warning error gts_column
1    <NA>                                    TRT01A        Placebo  tabulate         n          n    86       86       0                   stat_1
2    <NA>                                    TRT01A        Placebo  tabulate         N          N   254      254       0                   stat_1
3    <NA>                                    TRT01A        Placebo  tabulate         p          % 0.339     33.9    <fn>                   stat_1
4    <NA>                                    TRT01A      Xanomeli…  tabulate         n          n    72       72       0                   stat_2
5    <NA>                                    TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_2
6    <NA>                                    TRT01A      Xanomeli…  tabulate         p          % 0.283     28.3    <fn>                   stat_2
7    <NA>                                    TRT01A      Xanomeli…  tabulate         n          n    96       96       0                   stat_3
8    <NA>                                    TRT01A      Xanomeli…  tabulate         N          N   254      254       0                   stat_3
9    <NA>                                    TRT01A      Xanomeli…  tabulate         p          % 0.378     37.8    <fn>                   stat_3
10 TRT01A      Placebo ..ard_hierarchical_overall..           TRUE hierarch…         n          n    69       69    <fn>                   stat_1
ℹ 35 more rows
ℹ Use `print(n = ...)` to see more rows
Source Code
---
title: Overview of Adverse Events, Safety Population, Pooled Analysis (or Trial X) 
subtitle: FDA Table 07
categories: [table, FDA, safety, adverse events] 
---

::: panel-tabset
## Table Preview

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

## Setup

```{r setup, message=FALSE}
# Load libraries & data -------------------------------------
library(gtsummary)
library(dplyr)

adsl <- pharmaverseadam::adsl |>
  filter(TRT01A != "Screen Failure")

adae <- pharmaverseadam::adae

# Use safety population only
adsl <- adsl |>
  filter(SAFFL == "Y")

data <- adae |>
  filter(SAFFL == "Y")

set.seed(1)
# this data set doesn't have treatment action recorded. We can generate a variable for demonstration.
aeacn_levels <- c("DRUG INTERRUPTED", "DOSE REDUCED", "DOSE RATE REDUCED", "DOSE INCREASED")
data <- data |>
  mutate(AEACN = factor(sample(aeacn_levels, size = nrow(data), replace = TRUE),
    levels = aeacn_levels
  ))
```

## Build Table

```{r tbl, results='hide'}
# --- PART 1: Overview of serious AEs
# Assign a label to each SAE category
sae_vars <- list(
  "SAE" = "AESER",
  "Death" = "AESDTH",
  "Life-threatening" = "AESLIFE",
  "Initial or prolonged hospitalization" = "AESHOSP",
  "Disability or permanent damage" = "AESDISAB"
)

# Summarize SAEs per category
tbl_sae <-
  lapply(
    seq_along(sae_vars),
    function(i) { # apply per category
      data <- data |>
        filter(.data[[sae_vars[[i]]]] == "Y") |>
        mutate(!!sae_vars[[i]] := names(sae_vars)[i]) # convert flag to a meaningful value
      tbl_hierarchical( # calculate rates
        data = data,
        variables = all_of(sae_vars[[i]]),
        by = TRT01A,
        id = USUBJID,
        denominator = adsl,
        label = sae_vars[[i]] ~ "Event"
      )
    }
  ) |>
  tbl_stack() |>
  modify_indent("label", rows = tbl_id1 != 1, indent = 4L)

# --- PART 2: Permanent discontinuation
disc_ae <- adae |>
  # filtering for adverse events with a "discontinued" End of Study Status
  filter(AESER == "Y" & EOSSTT == "DISCONTINUED") |>
  mutate(
    # convert label to a more meaningful value
    AEDISC = "AE leading to permanent discontinuation of treatment"
  )

tbl_disc_ae <- tbl_hierarchical( # calculate rates
  data = disc_ae,
  variables = AEDISC,
  by = TRT01A,
  id = USUBJID,
  denominator = adsl,
  label = AEDISC ~ "Event"
)

# -- PART 3: Dose modification
dose_mod_ae <- data |>
  mutate(
    AEACN = case_when( # convert to meaningful labels
      AEACN == "DRUG INTERRUPTED" ~ "AE leading to interruption of study drug",
      AEACN == "DOSE REDUCED" ~ "AE leading to reduction of study drug",
      AEACN == "DOSE RATE REDUCED" ~ "AE leading to dose delay of study drug",
      AEACN == "DOSE INCREASED" ~ "Other",
      .default = "Other"
    )
  )

tbl_dose_mod_ae <- tbl_hierarchical( # calculate rates
  data = dose_mod_ae,
  denominator = adsl,
  id = "USUBJID",
  by = "TRT01A",
  variables = "AEACN",
  label = list(AEACN ~ "Event", ..ard_hierarchical_overall.. = "AE leading to action taken of treatment"),
  overall_row = TRUE
) |>
  modify_indent(columns = label, rows = variable == "AEACN", indent = 4L)


# -- PART 4: Any AE
tbl_any_ae <- tbl_hierarchical(
  data = adae |> mutate(AESEV = factor(.data$AESEV, ordered = TRUE)),
  variables = AESEV,
  by = TRT01A,
  id = USUBJID,
  denominator = adsl,
  label = list(AESEV ~ "Event", ..ard_hierarchical_overall.. = "Any AE"),
  overall_row = TRUE
) |>
  modify_indent(columns = label, rows = variable == "AESEV", indent = 4L)

# Put it all together
tbl <- list(tbl_sae, tbl_disc_ae, tbl_dose_mod_ae, tbl_any_ae) |>
  tbl_stack() |>
  modify_header(label = "**Adverse Event Category**")

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='60%'}
```

## Build ARD

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

```{r, echo=FALSE}
# Print full ARD
withr::local_options(width = 9999)
print(ard, columns = "all")
```
:::
 
  • This website as well as code examples are licensed under the Apache License, Version 2.0.
Cookie Preferences