Skip to contents

This vignette demonstrates how to generate a static AE summary table reporting - The number and percentage of participants with any AEs by treatment group; - The number and percentage of participants with drug-related AEs by treatment group; - The number and percentage of participants with serious AEs by treatment group.

Overview

Mock tables help reviewers evaluate a proposed table structure before final results are available. The mock argument of format_ae_summary() replaces the analysis values with placeholder values while preserving the AE summary layout.

The mock output is intended as a convenient starting point that resembles the planned table. It is not an all-encompassing mock table template, so additional customization may be needed for study-specific requirements.

Define metadata

This example uses ADSL and ADAE data from the forestly package. The metadata follows the same approach used in the AE Summary in RTF format vignette.

adsl <- forestly::forestly_adsl
adae <- forestly::forestly_adae

adsl$TRT01A <- factor(
  adsl$TRT01A,
  levels = c("Xanomeline Low Dose", "Placebo"),
  labels = c("Low Dose", "Placebo")
)
adae$TRTA <- factor(
  adae$TRTA,
  levels = c("Xanomeline Low Dose", "Placebo"),
  labels = c("Low Dose", "Placebo")
)

analysis_plan <- metalite::plan(
  analysis = "ae_summary",
  population = "apat",
  observation = "wk12",
  parameter = "any;rel;ser"
)

meta <- metalite::meta_adam(observation = adae, population = adsl) |>
  metalite::define_plan(analysis_plan) |>
  metalite::define_population(
    name = "apat",
    var = c("USUBJID", "SAFFL", "TRT01A"),
    group = "TRT01A",
    subset = SAFFL == "Y",
    label = "All Participants as Treated"
  ) |>
  metalite::define_observation(
    name = "wk12",
    var = c(
      "USUBJID", "SAFFL", "TRTA", "AEDECOD", "AEBODSYS", "AEREL",
      "AESER"
    ),
    group = "TRTA",
    subset = SAFFL == "Y",
    label = "Weeks 0 to 12"
  ) |>
  metalite::define_parameter(
    name = "any",
    term1 = "",
    term2 = "",
    var = "AEDECOD",
    soc = "AEBODSYS",
    label = "All AEs"
  ) |>
  metalite::define_parameter(
    name = "rel",
    term1 = "Drug-Related",
    term2 = "",
    subset = AEREL %in% c("POSSIBLE", "PROBABLE"),
    var = "AEDECOD",
    soc = "AEBODSYS",
    label = "Drug-related AEs"
  ) |>
  metalite::define_parameter(
    name = "ser",
    term1 = "Serious",
    term2 = "",
    subset = AESER == "Y",
    var = "AEDECOD",
    soc = "AEBODSYS",
    label = "Serious AEs"
  ) |>
  metalite::define_analysis(
    name = "ae_summary",
    title = "Adverse Event Summary"
  ) |>
  metalite::meta_build()

Prepare a mock table

First, prepare the AE summary analysis. Passing mock = TRUE to format_ae_summary() then creates placeholder values for the formatted table.

The mock table retains the row labels and treatment-group structure derived from the metadata. This allows the layout to be reviewed without presenting the calculated analysis values as final results.

rtf_dir <- if (dir.exists("vignettes/rtf")) "vignettes/rtf" else "rtf"
rtf_file <- file.path(rtf_dir, "ae0summary3.rtf")

prepare_ae_summary(
  meta,
  population = "apat",
  observation = "wk12",
  parameter = "any;rel;ser"
) |>
  format_ae_summary(mock = TRUE) |>
  tlf_ae_summary(
    source = "Source:  [CDISCpilot: adam-adsl; adae]",
    analysis = "ae_summary", # Provide analysis type defined in meta$analysis
    path_outtable = rtf_file
  )
#> any
#> rel
#> ser
#> The output is saved in/home/runner/work/metalite.ae/metalite.ae/vignettes/rtf/ae0summary3.rtf

Generated RTF file: ae0summary3.rtf