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

FDA Table 20

Adverse Events of Special Interest Assessment, Safety Population, Pooled Analysis (or Trial X)

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

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)

Code
ard <- gather_ard(tbl) |>
  unlist(recursive = FALSE) |>
  bind_ard(.quiet = TRUE)

ard
{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
Source Code
---
title: FDA Table 20
subtitle: Adverse Events of Special Interest Assessment, Safety Population, Pooled Analysis (or Trial X)
categories: [table, FDA, safety, adverse events]
---

::: panel-tabset
## Table Preview

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

## Setup

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

## Build Table

```{r tbl, results = 'hide'}
## 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)
```

```{r eval=FALSE, include=FALSE}
gt::gtsave(as_gt(tbl), filename = "result.png")
```

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

## Build ARD

```{r ard, message=FALSE, warning=FALSE, results='hide'}
ard <- gather_ard(tbl) |>
  unlist(recursive = FALSE) |>
  bind_ard(.quiet = TRUE)

ard
```

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