Reproducibility Supplement

Preemptive tocilizumab to mitigate CRS after CTL019 (NCT02906371)

Stephan Kadauke (Children’s Hospital of Philadelphia) , Regina M. Myers (Children’s Hospital of Philadelphia) , Yimei Li (Children’s Hospital of Philadelphia) , Stephan A. Grupp (Children’s Hospital of Philadelphia)
2021-01-24

Introduction

In this document, we provide the computer code that was used to create the tables, figures, and statistical test results of the primary analysis of the NCT02906371 clinical trial, which we report in our manuscript Risk-Adapted Preemptive Tocilizumab to Prevent Severe Cytokine Release Syndrome after CTL019 for Pediatric B-Cell Acute Lymphoblastic Leukemia: A Prospective Clinical Trial (Kadauke et al, Journal of Clinical Oncology 2020). We provide this document to allow other interested parties to inspect, verify, and reproduce our analytic work.

The first part lists concise descriptions of the Analyses we performed. To view the code (written in the R programming language) that was used to perform a specific analysis, as well as the results, click the black triangle to the left of the description to expand each section. The order of this part follows the order of analyses reported in the text of the main manuscript. The section titles mirror the section titles of the manuscript, and tables and figures are cross-referenced.

The second part of this document is a Data Dictionary, which describes each of the tables of the analytical (“clean”) data set in alphabetical order. Click on the black triangle next to the name of a table to reveal information about the fields of the table. Note: to protect sensitive patient information, some of the contents are hidden.

The final part describes the precise Computational Environment in which the computational analyses were performed. Among other parameters, this part lists the names, versions, and sources of all software packages that were used to generate this document.

Analyses

Loading packages and data and define helper functions
library(tidyverse)
library(conflicted)
library(lubridate)
library(here)
library(glue)
library(survival)
library(survminer)
library(gt)
library(gtsummary)
library(DescTools)
library(tidymodels)
library(naniar)
library(simplecolors)
library(kableExtra)
library(binom)
library(dataMeta)  # devtools::install_github("skadauke/dataMeta")

knitr::opts_chunk$set(
  echo = TRUE,
  warning = FALSE,
  message = FALSE,
  cache = TRUE,
  layout = "l-page"  # by default, allow wide tables
)

conflict_prefer("filter", "dplyr")
conflict_prefer("here", "here")
conflict_prefer("spec", "yardstick")

# Colors optimized for screen, print, and color-blind readers
colors <- list(
  orange = "#E69F00",
  sky_blue = "#56B4E9",
  bluish_green = "#009E73",
  yellow = "#F0E442",
  blue = "#0072B2",
  vermilion = "#D55E00",
  purple = "#CC79A7",
  black = "#000000"
)

# Modifies the header of tbl_summary objects so the N is printed on a new line
fix_table_header <- function(x) {
  # "Overall" column present?
  if ("stat_0" %in% colnames(x$table_body)) {  
    modify_header(
      x,
      stat_by = "**{level}**<br>N = {n}",
      stat_0 = "**Overall**<br>N = {n}"
    )
  } else {
    modify_header(
      x,
      stat_by = "**{level}**<br>N = {n}"
    )
  }
}

# Helper function to load rds file and add data frame of the
# same name to the Environment. Assumes that data files are in
# artifacts/ and fake data files are in artifacts/fake
load_data <- function(
  tbl_names, 
  use_fake_data = params$use_fake_data, 
  envir = rlang::caller_env()
) {
  
  for (tbl_name in tbl_names) {
      rds_path <- if (use_fake_data) { 
        here(glue("artifacts/fake/{tbl_name}.rds")) 
      } else {
        here(glue("artifacts/{tbl_name}.rds"))
      }
      
      data <- read_rds(rds_path)
      
      rlang::env_poke(envir, tbl_name, data)     
  }
}

early_toci_datasets <- c(
  "adverse_events",
  "astct",
  "cart_expansion", 
  "cd19_status_at_relapse", 
  "cohort", 
  "duration_of_remission",
  "cytokines",
  "demographics",
  "disease_assessment",
  "event_free_survival",
  "events",
  "events_validated",
  "infusion",
  "neurotox",
  "overall_survival",
  "time_to_b_cell_recovery", 
  "toci_administration"
)

load_data(early_toci_datasets)

Patients

Tabulate and compare CTL019 infusion doses by cohorts.
infusion %>%
  group_by(subject_id) %>%
  summarize(
    total_cart = sum(available_cart_dose, na.rm = TRUE),
    total_cart_per_kg = sum(total_cart_per_kg, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  select(-subject_id) %>%
  tbl_summary(
    by = cohort,
    statistic = list(all_continuous() ~ "{median} ({min} - {max})")
  ) %>%
  add_p() %>%
  add_overall() %>%
  fix_table_header()
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
total_cart 195,300,000 (18,000,000 - 1,152,000,000) 134,800,000 (18,000,000 - 237,000,000) 200,000,000 (24,930,000 - 1,152,000,000) 0.025
total_cart_per_kg 5,000,000 (563,000 - 18,790,000) 5,000,000 (1,072,000 - 14,530,000) 5,000,000 (563,000 - 18,790,000) 0.5

1 Statistics presented: Median (Range)

2 Statistical tests performed: Wilcoxon rank-sum test

Tabulate duration of follow-up by cohort.
overall_survival %>%
  mutate(
    time = time / 365 * 12
  ) %>%  
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  ungroup() %>%
  #
  # Exclude patients who have died
  #
  filter(event == 0) %>%
  select(time, cohort) %>%
  tbl_summary(
    by = cohort,
    statistic = list(everything() ~ "{median} ({min}, {max})")
  ) %>%
  add_overall() %>%
  fix_table_header()
Characteristic Overall
N = 581
High tumor burden cohort
N = 91
Low tumor burden cohort
N = 491
time 24 (5, 36) 27 (17, 35) 24 (5, 36)

1 Statistics presented: Median (Range)

Create the baseline characteristics table (Table 1).
demographics %>%
  left_join(
    cohort %>%
      select(
        subject_id,
        blasts_in_bm,
        cohort),
    by = "subject_id"
  ) %>%
  left_join(
    infusion %>%
      filter(visit_id == "Infusion #1") %>%
      mutate(first_infusion_date = date) %>%
      select(
        subject_id,
        first_infusion_date),
    by = "subject_id"
  ) %>%
  mutate(
    first_infusion_age = (birthday %--% first_infusion_date) / years()
  ) %>%
  filter(cohort != "Not Assigned") %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  transmute(
    cohort,
    first_infusion_age,
    male_gender = gender %>% 
      recode("Male" = TRUE, "Female" = FALSE),
    prior_bmt = prior_bmt %>% 
      recode("Yes" = TRUE, "No" = FALSE),
    indication,
    blasts_in_bm,
    cns,
    high_risk_cytogenetics = high_risk_cytogenetics %>%
      recode("Yes" = TRUE, "No" = FALSE),
    trisomy21 = trisomy21 %>% 
      recode("Yes" = TRUE, "No" = FALSE)
  ) %>%
  mutate(
    blasts_in_bm = case_when(
      blasts_in_bm == 0 ~ "MRD negative",
      blasts_in_bm < 5 ~ "MRD positive, < 5%",
      blasts_in_bm < 40 ~ "5 - 40%",
      blasts_in_bm >= 40 ~ "≥ 40%",
      TRUE ~ as.character(blasts_in_bm)
    ) %>% factor(levels = c(
      "MRD negative",
      "MRD positive, < 5%",
      "5 - 40%",
      "≥ 40%"
    ))
  ) %>%
  tbl_summary(
    by = cohort,
    type = list(c("male_gender", "prior_bmt", "high_risk_cytogenetics") ~ "dichotomous"),
    label = list(
      vars(first_infusion_age) ~ "Age at infusion, years",
      vars(male_gender) ~ "Male",
      vars(prior_bmt) ~ "Prior alloHSCT",
      vars(indication) ~ "Disease status",
      vars(blasts_in_bm) ~ "Percent bone marrow blasts",
      vars(cns) ~ "CNS status",
      vars(high_risk_cytogenetics) ~ "High-risk genomic lesions",
      vars(trisomy21) ~ "Trisomy 21"
    ),
    statistic = list(
      vars(first_infusion_age) ~ "{median} ({min}, {max})"
    ),
    digits = list(vars(first_infusion_age) ~ c(1, 1, 1))
  )  %>%
  add_overall() %>%
  add_p() %>%
  fix_table_header()
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
Age at infusion, years 11.2 (1.4, 29.1) 6.9 (1.4, 23.4) 12.6 (1.8, 29.1) 0.045
Male 41 (59%) 7 (47%) 34 (62%) 0.4
Prior alloHSCT 25 (36%) 7 (47%) 18 (33%) 0.5
Disease status 0.7
Primary refractory 14 (20%) 2 (13%) 12 (22%)
Relapsed 56 (80%) 13 (87%) 43 (78%)
Percent bone marrow blasts <0.001
MRD negative 27 (39%) 0 (0%) 27 (49%)
MRD positive, < 5% 17 (24%) 0 (0%) 17 (31%)
5 - 40% 11 (16%) 0 (0%) 11 (20%)
≥ 40% 15 (21%) 15 (100%) 0 (0%)
CNS status 0.009
CNS1 61 (87%) 10 (67%) 51 (93%)
CNS2A 8 (11%) 5 (33%) 3 (5.5%)
CNS3 1 (1.4%) 0 (0%) 1 (1.8%)
High-risk genomic lesions 26 (37%) 5 (33%) 21 (38%) >0.9
Trisomy 21 6 (8.6%) 0 (0%) 6 (11%) 0.3

1 Statistics presented: Median (Range); n (%)

2 Statistical tests performed: Wilcoxon rank-sum test; chi-square test of independence; Fisher's exact test

Cytokine release syndrome

Create the cytokine release syndrome (CRS) table (Table 2).
crs_highest_grade <- adverse_events %>%
  filter(adverse_event == "Cytokine release syndrome") %>%
  select(
    subject_id,
    grade
  ) %>%
  group_by(subject_id) %>%
  summarize(highest_grade = max(grade), .groups="drop")

infusion %>%
  select(subject_id) %>%
  unique() %>%
  #
  # Add cohort column
  #
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  #
  # Add highest_grade column
  #
  left_join(
    crs_highest_grade
    , by = "subject_id"
  ) %>%
  mutate(
    highest_grade = case_when(
      is.na(highest_grade) ~ "None",
      highest_grade == 1 ~ "Grade 1",
      highest_grade == 2 ~ "Grade 2",
      highest_grade == 3 ~ "Grade 3",
      highest_grade == 4 ~ "Grade 4"
    )
  ) %>%
  #
  # Add days_to_first_crs column
  #
  left_join(
    infusion %>%
      filter(visit_id == "Infusion #1") %>%
      transmute(
        subject_id,
        infusion_date = date
      ) %>%
      left_join(
        adverse_events %>%
          filter(adverse_event == "Cytokine release syndrome") %>%
          group_by(subject_id) %>%
          arrange(start_date) %>%
          slice(1) %>%
          ungroup() %>%
          select(
            subject_id,
            crs_start_date = start_date
          ),
        by = "subject_id"
      ) %>%
      transmute(
        subject_id,
        days_to_first_crs = infusion_date %--% crs_start_date / days()
      ),
    by = "subject_id"
  ) %>%
  #
  # Add days_to_first_toci column
  #
  left_join(
    toci_administration %>%
      filter(!is.na(dose_administered_mg)) %>%
      arrange(toci_administration_time) %>%
      group_by(subject_id) %>%
      slice(1) %>%
      ungroup() %>%
      transmute(
        subject_id,
        days_to_first_toci = crs_onset_time %--% toci_administration_time / ddays()
      ),
    by = "subject_id"
  ) %>%
  #
  # Add received_toci column 
  #
  mutate(
    received_toci = !is.na(days_to_first_toci)
  ) %>%
  transmute(
    cohort,
    highest_grade,
    days_to_first_crs,
    received_toci,
    days_to_first_toci
  ) %>%
  tbl_summary(
    by = cohort,
    type = list(
      starts_with("days") ~ "continuous"
    ),
    label = list(
      "highest_grade" = "CRS maximum grade",
      "days_to_first_crs" = "Time to CRS onset, days",
      "received_toci" = "Received tocilizumab",
      "days_to_first_toci" = "Time from CRS onset to first tocilizumab, days"
    ),
    digits = list(everything() ~ 0, "days_to_first_toci" ~ 1),
    missing = "no"
  ) %>%
  add_p() %>%
  add_overall() %>%
  fix_table_header() %>%
  as_gt() %>%
  tab_footnote(
    footnote = "One patient died from intracerebral hemorrhage in the context of resolving grade 4 CRS 19 days after CTL019 infusion.",
    locations = cells_body(
      columns = vars(stat_1),
      rows = label == "Grade 4"
    )
  )
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
CRS maximum grade <0.001
Grade 1 4 (6%) 0 (0%) 4 (7%)
Grade 2 36 (51%) 6 (40%) 30 (55%)
Grade 3 6 (9%) 5 (33%) 1 (2%)
Grade 4 6 (9%) 4 (27%)3 2 (4%)
None 18 (26%) 0 (0%) 18 (33%)
Time to CRS onset, days 4 (2, 7) 2 (1, 3) 5 (2, 8) 0.021
Received tocilizumab 18 (26%) 15 (100%) 3 (5%) <0.001
Time from CRS onset to first tocilizumab, days 0.6 (0.4, 1.3) 0.5 (0.4, 0.8) 2.2 (1.5, 2.7) 0.076

1 Statistics presented: n (%); Median (IQR)

2 Statistical tests performed: Fisher's exact test; Wilcoxon rank-sum test

3 One patient died from intracerebral hemorrhage in the context of resolving grade 4 CRS 19 days after CTL019 infusion.

Calculate 95% confidence interval for grade 4 CRS in HTBC (4 / 15 subjects).
binom.confint(
  x = 4,
  n = 15,
  conf.level = 0.95,
  method = c("exact")
)
  method x  n      mean      lower     upper
1  exact 4 15 0.2666667 0.07787155 0.5510032

Calculate 95% confidence interval for grade 4 CRS in LTBC (2 / 55 subjects).

binom.confint(
  x = 2,
  n = 55,
  conf.level = 0.95,
  method = c("exact")
)
  method x  n       mean       lower     upper
1  exact 2 55 0.03636364 0.004434547 0.1252643
Tabulate CRS, retrospectively re-graded according to ASTCT (Table S2).
astct_time <- infusion %>%
  #
  # Add first_infusion_date column
  #
  filter(visit_id == "Infusion #1") %>%
  mutate(infusion_date = date) %>%
  select(
    subject_id,
    infusion_date
  ) %>%
  #
  # Add crs_start_date, crs_end_date columns
  #
  left_join(
    astct %>%
      select(
        subject_id,
        crs_start_date = start_date,
        crs_end_date = end_date
      ), 
    by = "subject_id"
  ) %>%
  #
  # Calculate days_to_first_crs and crs_duration columns
  #
  mutate(
    days_to_first_crs = infusion_date %--% crs_start_date / ddays(),
    crs_duration = crs_start_date %--% crs_end_date / ddays()
  ) %>%
  #
  # Remove patients who did not have CRS
  #
  drop_na(crs_start_date)

astct %>%
  #
  # Add cohort column
  #
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  #
  #
  #
  left_join(
    astct_time %>%
      select(
        subject_id,
        days_to_first_crs,
        crs_duration
      ),
    by = "subject_id"
  ) %>%
  mutate(
    grade = case_when(
      grade == 0 ~ "None",
      grade == 1 ~ "Grade 1",
      grade == 2 ~ "Grade 2",
      grade == 3 ~ "Grade 3",
      grade == 4 ~ "Grade 4"
    )
  ) %>%
  select(
    cohort,
    grade,
    days_to_first_crs,
    crs_duration
  ) %>%
  tbl_summary(
    by = cohort,
    type = list(
      starts_with("days") ~ "continuous"
    ),
    label = list(
      grade = "CRS maximum grade",
      days_to_first_crs = "Time to first CRS, days",
      crs_duration = "Duration of CRS, days"
    ),
    digits = list(everything() ~ 0),
    missing = "no"
  ) %>%
  add_p() %>%
  add_overall() %>%
  fix_table_header()
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
CRS maximum grade <0.001
Grade 1 31 (44%) 5 (33%) 26 (47%)
Grade 2 6 (9%) 3 (20%) 3 (5%)
Grade 3 3 (4%) 2 (13%) 1 (2%)
Grade 4 7 (10%) 5 (33%) 2 (4%)
None 23 (33%) 0 (0%) 23 (42%)
Time to first CRS, days 4 (2, 6) 2 (1, 6) 4 (2, 5) 0.6
Duration of CRS, days 4 (2, 6) 10 (5, 12) 3 (2, 5) <0.001

1 Statistics presented: n (%); Median (IQR)

2 Statistical tests performed: Fisher's exact test; Wilcoxon rank-sum test

Tabulate CRS in low tumor burden cohort (LTBC) patients by minimal residual disease (MRD) status at time of CTL019 infusion (Table S3).
crs_events <- adverse_events %>%
  filter(adverse_event == "Cytokine release syndrome")

crs_highest_grade <- infusion %>%
  select(subject_id) %>%
  unique() %>%
  left_join(crs_events) %>%
  group_by(subject_id) %>%
  summarize(highest_grade = max(grade)) %>%
  left_join(cohort) %>%
  select(
    subject_id,
    cohort,
    highest_grade
  )

first_crs_event <- adverse_events %>%
  filter(
    adverse_event == "Cytokine release syndrome"
  ) %>%
  #
  # Keep the first record of CRS for every patient
  #
  group_by(subject_id) %>%
  arrange(start_date) %>% 
  slice(1) %>%
  ungroup()  

first_infusion <- infusion %>%
  filter(visit_id == "Infusion #1") %>%
  rename(infusion_date = date)

crs_time <- first_infusion %>%
  left_join(first_crs_event) %>%
  left_join(cohort) %>%
  select(
    subject_id,
    cohort,
    infusion_date,
    crs_start_date = start_date
  ) %>%
  mutate(
    days_to_first_crs = infusion_date %--% crs_start_date / ddays()
  ) %>%
  drop_na(crs_start_date)

first_toci_administration <- toci_administration %>%
  filter(!is.na(dose_administered_mg)) %>%
  arrange(toci_administration_time) %>%
  #
  # Keep the first record of toci for every patient.
  # 
  group_by(subject_id) %>%
  slice(1) %>%
  ungroup()  

toci_time <- first_toci_administration %>%
  left_join(cohort) %>%
  select(
    subject_id,
    cohort,
    crs_onset_time,   # time of the FIRST fever
    toci_administration_time
  ) %>%   # n = 18
  mutate(
    days_to_first_toci = crs_onset_time %--% toci_administration_time / ddays()
  )

crs_highest_grade %>%
  left_join(
    cohort %>%
      select(subject_id, blasts_in_bm),
    by = "subject_id"
  ) %>%
  left_join(
    crs_time %>%
      select(subject_id, days_to_first_crs)
  ) %>%
  left_join(
    toci_time %>%
      select(subject_id, days_to_first_toci)
  ) %>%
  filter(cohort == "Cohort B") %>%
  mutate(
    mrd_status = case_when(
      blasts_in_bm == 0 ~ "MRD-negative",
      TRUE ~ "MRD-positive"
    ),
    highest_grade = case_when(
      is.na(highest_grade) ~ "None",
      highest_grade == 1 ~ "Grade 1",
      highest_grade == 2 ~ "Grade 2",
      highest_grade == 3 ~ "Grade 3",
      highest_grade == 4 ~ "Grade 4"
    ),
    received_toci = !is.na(days_to_first_toci)
  ) %>%
  select(
    mrd_status,
    highest_grade,
    days_to_first_crs,
    received_toci,
  ) %>%
  tbl_summary(
    by = mrd_status,
    type = list(
      starts_with("days") ~ "continuous"
    ),
    label = list(
      "highest_grade" = "CRS maximum grade",
      "days_to_first_crs" = "Time to CRS onset, days",
      "received_toci" = "Received tocilizumab"
    ),
    digits = list(everything() ~ 0),
    missing = "no"
  ) %>%
  fix_table_header() %>%
  add_p()
Characteristic MRD-negative
N = 271
MRD-positive
N = 281
p-value2
CRS maximum grade 0.2
Grade 1 4 (15%) 0 (0%)
Grade 2 15 (56%) 15 (54%)
Grade 3 0 (0%) 1 (4%)
Grade 4 1 (4%) 1 (4%)
None 7 (26%) 11 (39%)
Time to CRS onset, days 4 (2, 8) 5 (2, 7) 0.7
Received tocilizumab 1 (4%) 2 (7%) >0.9

1 Statistics presented: n (%); Median (IQR)

2 Statistical tests performed: Fisher's exact test; Wilcoxon rank-sum test

Tumor response

Create the tumor response table (Table 3).
disease_assessment <- disease_assessment %>%
    left_join(
    infusion %>%
      filter(visit_id == "Infusion #1") %>%
      select(
        subject_id, 
        infusion_date = date
      )
  ) %>%
  mutate(
    study_day = date - infusion_date
  )

# Construct first_response column
  
disease_assessment <- disease_assessment %>%
  group_by(subject_id) %>%
  filter(
    study_day > 0,
    current_response %in% c(
      "Complete Remission with incomplete blood count recovery (CRi)",
      "Complete Remission (CR)"
    )
  ) %>%
  summarize(
    first_response_date = min(date)
  ) %>%
  right_join(
    disease_assessment
  ) %>%
  mutate(
    first_response = date == first_response_date
  )

# Construct best_response column

disease_assessment <- disease_assessment %>%
  group_by(subject_id) %>%
  filter(
    study_day > 0
  ) %>%
  summarize(
    best_response = max(current_response)
  ) %>%
  right_join(
    disease_assessment
  ) %>%
  filter(
    study_day > 0
  ) %>%
  group_by(subject_id) %>%
  filter(
    current_response == best_response
  ) %>%
  summarize(
    best_response_date = min(date)
  ) %>%
  right_join(
    disease_assessment
  ) %>%
  mutate(
    best_response = date == best_response_date
  ) %>%
  select(
    subject_id,
    visit_id,
    date,
    infusion_date,
    study_day,
    current_response,
    first_response,
    best_response
  )

infusion %>%
  select(subject_id) %>%
  distinct() %>%
  #
  # Add cohort column
  #
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  #
  # Add day28, day28_overall, best, and best_overall columns
  #
  mutate(
    day28 = (.) %>%
      left_join(disease_assessment, by = "subject_id") %>%
      filter(visit_id == "28 Day Follow-Up") %>%
      pull(current_response),
    day28_overall = ifelse(
      day28 != "No Response (Treatment failure)", 
      TRUE,
      FALSE),
    best = (.) %>%
      left_join(disease_assessment, by = "subject_id") %>%
      filter(best_response == TRUE) %>%
      pull(current_response),
    best_overall = ifelse(
      best != "No Response (Treatment failure)", 
      TRUE,
      FALSE),
  ) %>%
  transmute(
    cohort,
    day28_overall,
    day28 = day28 %>% as.character(),
    best_overall,
    best = best %>% as.character()
  ) %>%
  tbl_summary(
    by = cohort,
    label = list(
      day28_overall ~ "Day 28 Overall Response Rate (ORR)",
      day28 ~ "Day 28 Response",
      best_overall ~ "Best Overall Response Rate (ORR)",
      best ~ "Best Response"
    )
  ) %>%
  add_overall() %>%
  add_p() %>%
  fix_table_header() %>%
  as_gt() %>%
  tab_footnote(
    footnote = "One patient with a day 28 and best response of CRi had minimal residual disease-positive bone marrow on day 28.",
    locations = cells_body(
      columns = vars(stat_0, stat_1),
      rows = 
        label %in% c(
          "Complete Remission with incomplete blood count recovery (CRi)",
          "Day 28 Overall Response Rate (ORR)",
          "Best Overall Response Rate (ORR)"
          )
    )
  ) %>%
  tab_footnote(
    footnote = "Two patients (one in each cohort) had MRD-negative bone marrow at 28 days but were scored as \"No Response\" due to detection of low numbers of blasts in the cerebrospinal fluid (CNS2 disease). Both patients were found to be in complete remission by 3-month follow-up.",
    locations = cells_body(
      columns = vars(stat_0, stat_1, stat_2),
      rows = 
        label == "No Response (Treatment failure)" &
        variable == "day28"
    )
  )
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
Day 28 Overall Response Rate (ORR) 66 (94%)3 12 (80%)3 54 (98%) 0.029
Day 28 Response <0.001
Complete Remission (CR) 31 (44%) 1 (6.7%) 30 (55%)
Complete Remission with incomplete blood count recovery (CRi) 35 (50%)3 11 (73%)3 24 (44%)
No Response (Treatment failure) 4 (5.7%)4 3 (20%)4 1 (1.8%)4
Best Overall Response Rate (ORR) 68 (97%)3 13 (87%)3 55 (100%) 0.043
Best Response 0.002
Complete Remission (CR) 54 (77%) 7 (47%) 47 (85%)
Complete Remission with incomplete blood count recovery (CRi) 14 (20%)3 6 (40%)3 8 (15%)
No Response (Treatment failure) 2 (2.9%) 2 (13%) 0 (0%)

1 Statistics presented: n (%)

2 Statistical tests performed: Fisher's exact test

3 One patient with a day 28 and best response of CRi had minimal residual disease-positive bone marrow on day 28.

4 Two patients (one in each cohort) had MRD-negative bone marrow at 28 days but were scored as "No Response" due to detection of low numbers of blasts in the cerebrospinal fluid (CNS2 disease). Both patients were found to be in complete remission by 3-month follow-up.

Calculate the p value for difference in duration of remission by cohort (HTBC vs LTBC).
duration_of_remission <- duration_of_remission %>%
  mutate(
    time = time / 365
  )

dor_diff <- survdiff(
  Surv(time, event) ~ cohort,
  data = duration_of_remission
)

# Calculate p value for use in the plot
dor_diff_p <- 1 - pchisq(dor_diff$chisq, length(dor_diff$n) - 1)

dor_diff_p
[1] 0.0001172347
Create a Kaplan-Meier plot for duration of remission, overall, and by cohort (Figure 2A).
dor_km <- survfit(
  Surv(time, event) ~ 1,
  data = duration_of_remission
)

dor_km_by_cohort <- survfit(
  Surv(time, event) ~ cohort,
  data = duration_of_remission
)

duration_of_remission_plot <- ggsurvplot_combine(
  fit = list(
    dor_km_by_cohort,
    dor_km
  ),
  data = duration_of_remission,
  conf.int = FALSE,
  legend = "none",
  title = "Duration of Remission",
  ylab = "Probability of Continued Remission",
  xlab = "Years since Onset of Remission",
  palette = c(colors$vermilion,
              colors$sky_blue,
              colors$black),
  risk.table = "absolute",
  legend.labs = c("HTBC", "LTBC", "Overall"),
  break.time.by = 0.5,
  xlim = c(0, 2)
)

duration_of_remission_plot$plot <- duration_of_remission_plot$plot +
  annotate(
    "text",
    x = 1.2, y = 0.9, hjust = 0,
    label = "Low tumor burden cohort"
  ) +
  annotate(
    "text",
    x = 1.2, y = 0.3, hjust = 0,
    label = "High tumor burden cohort"
  ) +
  annotate(
    "text",
    x = 1.2, y = 0.67, hjust = 0,
    label = "Overall"
  ) +
  annotate(
    "text",
    x = -.05, y = 0, hjust = 0,
    label = glue("P < 0.001")    
)

duration_of_remission_plot

Calculate 12 and 24 month probabilities of continued remission overall.
summary(dor_km, times = c(1, 2))
Call: survfit(formula = Surv(time, event) ~ 1, data = duration_of_remission)

 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1     39      13    0.790  0.0522        0.694        0.899
    2     18       4    0.704  0.0617        0.593        0.836
Calculate 12 and 24 month probabilities of continued remission by cohort. Note: Cohort A is HTBC, and cohort B is LTBC.
summary(dor_km_by_cohort, times = c(1, 2))
Call: survfit(formula = Surv(time, event) ~ cohort, data = duration_of_remission)

                cohort=Cohort A 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1      5       6    0.486   0.148        0.268        0.883
    2      3       1    0.389   0.147        0.185        0.816

                cohort=Cohort B 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1     34       7    0.861  0.0489        0.770        0.962
    2     15       3    0.779  0.0630        0.665        0.913
Tabulate the number of relapses within the first 24 months by cohort.
events <- events %>%
  #
  # Add cohort column
  #
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "HTBC",
    "Cohort B" = "LTBC")
  ) %>%
  select(
    subject_id,
    cohort,
    everything()
  )

events %>%
  #
  # Add column for "best response" and remove if best response
  # was "No response"
  #
  left_join(
    disease_assessment %>% 
      filter(best_response == TRUE) %>%
      select(
        subject_id, 
        best_response = current_response
      ),
    by = "subject_id"
  ) %>%
  filter(best_response %in% c(
    "Complete Remission (CR)", 
    "Complete Remission with incomplete blood count recovery (CRi)")
  ) %>%
  #
  # Identify relapsed disease events
  # 
  filter(event == "Relapsed disease") %>%
  #
  # Only include data from first 24 months
  #
  #  filter(study_day <= 730) %>%
  select(event, cohort) %>%
  tbl_summary(by = cohort, statistic = everything() ~ "{n}")
Characteristic HTBC, N = 61 LTBC, N = 61
event
Relapsed disease 6 6

1 Statistics presented: n

Tabulate CD19 phenotype at relapse (Table S4).
cd19_status_at_relapse <- cd19_status_at_relapse %>%
  #
  # Add cohort column
  #
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  )

cd19_status_at_relapse %>%
  mutate(
    cd19_relapse_phenotype = factor(
      cd19_relapse_phenotype,
      levels = c(
        "CD19 positive",
        "CD19 negative",
        "CD19 subset negative",
        "Lineage switch to AML"
      )
    )
  ) %>%
  select(
    cohort,
    cd19_relapse_phenotype
  ) %>%
  tbl_summary(
    by = cohort,
    label = list(
      vars(cd19_relapse_phenotype) ~ "Leukemia cell phenotype at relapse"
    )
  ) %>%
  add_overall() %>%
  fix_table_header() %>%
  as_gt()
Characteristic Overall
N = 191
High tumor burden cohort
N = 91
Low tumor burden cohort
N = 101
Leukemia cell phenotype at relapse
CD19 positive 7 (37%) 1 (11%) 6 (60%)
CD19 negative 9 (47%) 6 (67%) 3 (30%)
CD19 subset negative 1 (5.3%) 1 (11%) 0 (0%)
Lineage switch to AML 2 (11%) 1 (11%) 1 (10%)

1 Statistics presented: n (%)

Collapse the prior table to combine CD19-negative, subset-negative, and lineage-switched into “CD19 negative” and compare to CD19-positive.
cd19_status_at_relapse %>%
  select(cohort, cd19_relapse_pos_neg) %>%
    tbl_summary(
    by = cohort
  ) %>%
  add_overall() %>%
  add_p() %>%
  fix_table_header() %>%
  as_gt()
Characteristic Overall
N = 191
High tumor burden cohort
N = 91
Low tumor burden cohort
N = 101
p-value2
cd19_relapse_pos_neg 0.057
CD19 negative 12 (63%) 8 (89%) 4 (40%)
CD19 positive 7 (37%) 1 (11%) 6 (60%)

1 Statistics presented: n (%)

2 Statistical tests performed: Fisher's exact test

Calculate the p value for difference in event-free survival by cohort.
event_free_survival <- event_free_survival %>%
  mutate(
    time = time / 365
  )  

efs_diff <- survdiff(
  Surv(time, event) ~ cohort,
  data = event_free_survival
)

# For some reason the p-value is not a component of the
# value list of the survdiff object, so calculate here
# for use in the plot
efs_diff_p <- 1 - pchisq(efs_diff$chisq, length(efs_diff$n) - 1)

efs_diff
Call:
survdiff(formula = Surv(time, event) ~ cohort, data = event_free_survival)

                 N Observed Expected (O-E)^2/E (O-E)^2/V
cohort=Cohort A 15       11     3.38     17.16      20.7
cohort=Cohort B 55       10    17.62      3.29      20.7

 Chisq= 20.7  on 1 degrees of freedom, p= 5e-06 
Create a Kaplan-Meier plot for event-free survival, overall, and by cohort (Figure 2B).
efs_km <- survfit(
  Surv(time, event) ~ 1,
  data = event_free_survival
)

efs_km_by_cohort <- survfit(
  Surv(time, event) ~ cohort,
  data = event_free_survival
)

event_free_survival_plot <- ggsurvplot_combine(
  fit = list(
    efs_km_by_cohort,
    efs_km
  ),
  data = event_free_survival,
  #  conf.int = TRUE,
  legend = "none",
  title = "Event-free Survival",
  ylab = "Probability",
  xlab = "Years since CTL019 Infusion",
  palette = c(colors$vermilion,
              colors$sky_blue,
              colors$black),
  risk.table = "absolute",
  legend.labs = c("HTBC", "LTBC", "Overall"),
  break.time.by = 0.5,
  xlim = c(0, 2)
)

event_free_survival_plot$plot <- event_free_survival_plot$plot +
  annotate(
    "text",
    x = 1.25, y = 0.9, hjust = 0,
    label = "Low tumor burden cohort"
  ) +
  annotate(
    "text",
    x = 1, y = 0.28, hjust = 0,
    label = "High tumor burden cohort"
  ) +
  annotate(
    "text",
    x = 1.15, y = 0.68, hjust = 0,
    label = "Overall"
  ) +
  annotate(
    "text",
    x = -.05, y = 0, hjust = 0,
    label = glue("P < 0.001")    
  )

event_free_survival_plot

Calculate 12 and 24 month probabilities of event-free survival.
summary(efs_km_by_cohort, times = c(1, 2))
Call: survfit(formula = Surv(time, event) ~ cohort, data = event_free_survival)

                cohort=Cohort A 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1      5       8    0.421   0.135        0.225        0.791
    2      4       1    0.337   0.132        0.157        0.726

                cohort=Cohort B 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1     34       7    0.861  0.0489        0.770        0.962
    2     24       3    0.780  0.0627        0.666        0.913
Compute the median event-free survival by cohort.
efs_km_by_cohort
Call: survfit(formula = Surv(time, event) ~ cohort, data = event_free_survival)

                 n events median 0.95LCL 0.95UCL
cohort=Cohort A 15     11  0.964   0.205      NA
cohort=Cohort B 55     10     NA      NA      NA
Calculate the p value for difference in overall survival by cohort.
overall_survival <- overall_survival %>%
  mutate(
    time = time / 365
  )

os_diff <- survdiff(
  Surv(time, event) ~ cohort,
  data = overall_survival
)

# Calculate p value for use in the plot
os_diff_p <- 1 - pchisq(os_diff$chisq, length(os_diff$n) - 1)

os_diff_p
[1] 0.004377156
Create a Kaplan-Meier plot for overall survival, overall, and by cohort (Figure 2C).
os_km <- survfit(
  Surv(time, event) ~ 1,
  data = overall_survival
)

os_km_by_cohort <- survfit(
  Surv(time, event) ~ cohort,
  data = overall_survival
)

overall_survival_plot <- ggsurvplot_combine(
  fit = list(
    os_km_by_cohort,
    os_km
  ),
  data = overall_survival,
  conf.int = FALSE,
  legend = "none",
  title = "Overall Survival",
  ylab = "Probability of Survival",
  xlab = "Years since CTL019 Infusion",
  ylim = c(0, 1.05),
  palette = c(colors$vermilion,
              colors$sky_blue,
              colors$black),
  risk.table = "absolute",
  legend.labs = c("HTBC", "LTBC", "Overall"),
  break.time.by = 0.5,
  xlim = c(0, 2)
)

overall_survival_plot$plot <- overall_survival_plot$plot +
  annotate(
    "text",
    x = 1, y = 1.02, hjust = 0,
    label = "Low tumor burden cohort"
  ) +
  annotate(
    "text",
    x = 1.29, y = 0.65, hjust = 0,
    label = "High tumor burden cohort"
  ) +
  annotate(
    "text",
    x = 1.18, y = 0.8, hjust = 0,
    label = "Overall"
  ) +
  annotate(
    "text",
    x = -.05, y = 0, hjust = 0,
    label = glue("P = {format(os_diff_p, digits = 1)}")    
  )

overall_survival_plot

Calculate 12 and 24 month probabilities of overall survival.
summary(os_km_by_cohort, times = c(1, 2))
Call: survfit(formula = Surv(time, event) ~ cohort, data = overall_survival)

                cohort=Cohort A 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1     10       5    0.667   0.122        0.466        0.953
    2      6       1    0.600   0.126        0.397        0.907

                cohort=Cohort B 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
    1     46       2    0.963  0.0255        0.915        1.000
    2     33       2    0.920  0.0388        0.846        0.999

B cell aplasia

Calculate the p value for difference in time to B cell recovery by cohort.
time_to_b_cell_recovery <- time_to_b_cell_recovery %>%
  mutate(
    time = time / 365
  )

bca_diff <- survdiff(
  Surv(time, event) ~ cohort,
  data = time_to_b_cell_recovery
)

# Calculate p value for use in the plot
bca_diff_p <- 1 - pchisq(bca_diff$chisq, length(bca_diff$n) - 1)

bca_diff_p
[1] 0.7340685
Create a Kaplan-Meier plot for continued B cell aplasia (Figure 2D).
bca_km <- survfit(
  Surv(time, event) ~ 1,
  data = time_to_b_cell_recovery
)

bca_km_by_cohort <- survfit(
  Surv(time, event) ~ cohort,
  data = time_to_b_cell_recovery
)

b_cell_aplasia_by_cohort_plot <- ggsurvplot_combine(
  fit = list(
    bca_km_by_cohort,
    bca_km
  ),
  data = time_to_b_cell_recovery,
  conf.int = FALSE,
  legend = "none",
  title = "B Cell Aplasia",
  ylab = "Probability of B Cell Aplasia",
  xlab = "Years since Onset of Remission",
  palette = c(colors$vermilion,
              colors$sky_blue,
              colors$black),
  risk.table = "absolute",
  legend.labs = c("HTBC", "LTBC", "Overall"),
  break.time.by = 0.5,
  xlim = c(0, 2)
)

b_cell_aplasia_by_cohort_plot$plot <- b_cell_aplasia_by_cohort_plot$plot +
  annotate(
    "text",
    x = 1, y = 0.45, hjust = 0,
    label = "High tumor burden cohort"
  ) +
  annotate(
    "text",
    x = 1 , y = 0.7, hjust = 0,
    label = "Low tumor burden cohort, Overall"
  ) +
  annotate(
    "text",
    x = -.05, y = 0, hjust = 0,
    label = glue("P = {format(bca_diff_p, digits = 2)}")    
  )

b_cell_aplasia_by_cohort_plot

Calculate 12 and 24 month probabilities of continued B cell aplasia.
summary(bca_km_by_cohort, times = c(0.5, 1, 2))
Call: survfit(formula = Surv(time, event) ~ cohort, data = time_to_b_cell_recovery)

                cohort=Cohort A 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
  0.5      4       2    0.686   0.186        0.403            1
  1.0      2       1    0.514   0.204        0.236            1
  2.0      1       0    0.514   0.204        0.236            1

                cohort=Cohort B 
 time n.risk n.event survival std.err lower 95% CI upper 95% CI
  0.5     32      18    0.653  0.0664        0.535        0.797
  1.0     24       1    0.632  0.0675        0.513        0.779
  2.0     12       1    0.603  0.0703        0.480        0.758

CTL019 expansion

Set up the cart_expansion data frame and create a plot template.
cart_expansion <- cart_expansion %>%
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  #
  # Add highest_grade column
  #
  left_join(
    crs_highest_grade %>%
      select(
        subject_id, 
        highest_grade
      ) %>%
      mutate(highest_grade = factor(case_when(
        is.na(highest_grade) ~ "None",
        TRUE ~ as.character(highest_grade)
        ),
        levels = c("None", "1", "2", "3", "4")
      )
    ),
    by = "subject_id"
  ) %>%
  mutate(
    highest_grade = replace_na(highest_grade, "None")
  )

# General plot object for flow and qPCR graphs, grouped by different variables
set.seed(1000) # jitter
cart_expansion_plot <- cart_expansion %>%
  ggplot(aes(x = day_post_infusion)) +
  geom_jitter(alpha = 0.4, width = 0.3) +
  geom_smooth(se = FALSE) +
  theme_pubr() +
  xlim(5,30) +
  xlab("Days after CTL019 infusion")
Create a scatter plot showing CAR-T expansion, as measured by flow cytometry (flow), by cohort (Figure 3A).
cart_expansion_plot +
  aes(
    y = cart_per_ul,
    color = cohort
  ) +
  labs(
    y = expression("CAR-T cells (cells/" * mu * "L)"),
    color = "Cohort"
  ) +
  scale_color_manual(values = c(colors$vermilion, colors$sky_blue))

Calculate the time to peak CAR-T expansion, as measured by flow.
cart_expansion %>%
  group_by(subject_id) %>%
  filter(
    cart_per_ul == max(cart_per_ul, na.rm = TRUE)
  ) %>%
  ungroup() %>%
  select(
    cohort,
    day_post_infusion
  ) %>%
  tbl_summary(
    by = cohort
  ) %>%
  add_p() %>%
  add_overall() %>%
  fix_table_header()
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
day_post_infusion 10.0 (10.0, 13.8) 10.0 (10.0, 17.0) 10.0 (10.0, 11.5) 0.2

1 Statistics presented: Median (IQR)

2 Statistical tests performed: Wilcoxon rank-sum test

Create a scatter plot showing CAR-T expansion, as measured by quantitative polymerase chain reaction (qPCR), by cohort (Figure 3B).
cart_expansion_plot +
  aes(
    y = bbz_copies,
    color = cohort
  ) +
  labs(
    y = expression("CAR-T transgene (copies/" * mu * "g DNA)"),
    color = "Cohort"
  ) +
  scale_color_manual(values = c(colors$vermilion, colors$sky_blue))

Calculate the time to peak CAR-T expansion, as measured by qPCR.
cart_expansion %>%
  group_by(subject_id) %>%
  filter(
    bbz_copies == max(bbz_copies, na.rm = TRUE)
  ) %>%
  ungroup() %>%
  select(
    cohort,
    day_post_infusion
  ) %>%
  tbl_summary(
    by = cohort
  ) %>%
  add_p() %>%
  add_overall()
Characteristic Overall, N = 701 High tumor burden cohort, N = 151 Low tumor burden cohort, N = 551 p-value2
day_post_infusion 10.0 (10.0, 14.0) 10.0 (10.0, 17.5) 10.0 (9.5, 11.5) 0.027

1 Statistics presented: Median (IQR)

2 Statistical tests performed: Wilcoxon rank-sum test

Create a line plot showing CAR-T expansion, measured by flow, for patients who had grade 4 CRS (Figure 3C).
cart_expansion %>%
  filter(highest_grade == 4) %>%
  drop_na(cart_per_ul) %>%
  ggplot(
    aes(x = day_post_infusion,
        y = cart_per_ul,
        color = cohort)
  ) +
  geom_point() +
  geom_line(
    aes(group = subject_id),
    size = 0.75
  ) +
  theme_pubr() +
  xlab("Days after CTL019 infusion") +
  ylab("CAR-T cells (cells/uL)") +
  labs(
    color = guide_legend("Cohort")
  ) +
  scale_color_manual(values = c(colors$vermilion, colors$sky_blue)) +
  annotate(
    "text",
    x = 9, y = 350, hjust = 0,
    label = "Patient 21"
  ) +
  annotate(
    "text",
    x = 0, y = 7000, hjust = 0, size = 6,
    label = "CRS 4 only"
  )

Create a line plot showing CAR-T expansion, measured by qPCR, for patients who had grade 4 CRS (Figure 3D).
cart_expansion %>%
  filter(highest_grade == 4) %>%
  drop_na(bbz_copies) %>%
  ggplot(
    aes(x = day_post_infusion,
        y = bbz_copies,
        color = cohort)
  ) +
  geom_point() +
  geom_line(
    aes(group = subject_id),
    size = 0.75
  ) +
  theme_pubr() +
  labs(
    x = "Days after CTL019 infusion",
    y = expression("CAR-T transgene (copies/" * mu * "g DNA)"),
    color = "Cohort"
  ) +
  scale_color_manual(values = c(colors$vermilion, colors$sky_blue)) +
  annotate(
    "text",
    x = 9, y = 22000, hjust = 0,
    label = "Patient 21"
  ) +
  annotate(
    "text",
    x = 0, y = 150000, hjust = 0, size = 6,
    label = "CRS 4 only"
  )

Create a dot plot to compare CAR-T expansion (maximum or area under the curve) by cohort (Figures 3E and 3F).
cart_expansion_models <- cart_expansion %>%
  select(
    subject_id,
    cohort,
    highest_grade,
    day_post_infusion,
    bbz_copies,
  ) %>%
  nest(
    data = c(
      day_post_infusion,
      bbz_copies
    )
  ) %>%   # n = 70
  #
  # na.rm = FALSE to remove incomplete time series
  #
  mutate(
    qpcr_auc = map_dbl(data, ~ AUC(.$day_post_infusion, .$bbz_copies, na.rm = FALSE)),
    qpcr_max = map_dbl(data, ~ max(.$bbz_copies, na.rm = FALSE))
  )

# Use Wilcox rank sum test to compare cohorts in terms of qPCR AUC and Cmax values.

qpcr_auc_test <- cart_expansion_models %>%
  wilcox.test(qpcr_auc ~ cohort, data = .) %>%
  tidy()

kable(qpcr_auc_test)
statistic p.value method alternative
720 7e-07 Wilcoxon rank sum test with continuity correction two.sided
qpcr_max_test <- cart_expansion_models %>%
  wilcox.test(qpcr_max ~ cohort, data = .) %>%
  tidy()

kable(qpcr_max_test)
statistic p.value method alternative
690 6.6e-06 Wilcoxon rank sum test with continuity correction two.sided
# Set up a plot template
set.seed(1000) # jitter
cart_expansion_qpcr_plot_template <- cart_expansion_models %>%
  ggplot(aes(
    x = cohort,
    color = highest_grade)
  ) +
  geom_jitter(width = 0.12, alpha = 0.8, size = 3) +
  stat_summary(aes(group = cohort),
    fun = median,
    fun.min = median,
    fun.max = median,
    geom = "crossbar",
    width = 0.3,
    show.legend = FALSE # removes boxplot outline
  ) +  
  scale_color_manual(values = sc_blue(1:5)) +
  theme_pubr() +
  labs(
    x = "Cohort",
    color = "Highest CRS grade"
  )

cart_expansion_qpcr_plot_template +
  aes(y = qpcr_max) +
  labs(y = expression("CAR-T transgene maximum (copies/" * mu * "g)")) +
  geom_bracket(
    xmin = 1,
    xmax = 2,
    y.position = 170000,
    label = "p < 0.001",
    color = "black"
  )
cart_expansion_qpcr_plot_template +
  aes(y = qpcr_auc) +
  labs(y = expression("CAR-T transgene AUC (copies/" * mu * "g" %*% "days)")) +
  geom_bracket(
    xmin = 1,
    xmax = 2,
    y.position = 2000000,
    label = "p < 0.001",
    color = "black"
  )

Early cytokine response to CTL019 infusion

Create faceted scatter plots to show which cytokines associated with grade 4 CRS in the LTBC (Figure S1).
cytokine_models <- cytokines %>%
  select(
    subject_id,
    sample_date,
    cytokine_name,
    result
  ) %>%
  #
  # Select LTBC patients
  #
  left_join(
    cohort %>%
      select(
        subject_id,
        cohort
      ),
    by = "subject_id"
  ) %>%
  filter(cohort == "Cohort B") %>%
  select(-cohort) %>%
  #
  # Add day_post_infusion column and select days 0-3
  #
  left_join(
    infusion %>%
      filter(study_day == 0) %>%
      select(
        subject_id,
        infusion_date = date
      ),
    by = "subject_id"
  ) %>%
  mutate(
    day_post_infusion = infusion_date %--% sample_date / ddays(1)
  ) %>%
  filter(
    day_post_infusion %in% 0:3
  ) %>%
  #
  # Calculate 3-day Cmax for each cytokine-patient
  #
  group_by(
    subject_id,
    cytokine_name
  ) %>%
  summarize(
    cmax = max(result, na.rm = TRUE),
    .groups = "drop"
  ) %>%
  # max() with na.rm = TRUE will return -Inf if *all* values were NA
  mutate(
    cmax = ifelse(cmax == -Inf, NA, cmax)
  ) %>%
  #
  # Add severe_crs column
  #
  left_join(
    crs_highest_grade %>%
      mutate(severe_crs = factor(case_when(
        highest_grade == 4 ~ "Yes",
        TRUE ~ "No"
      ))) %>%
      select(
        subject_id,
        severe_crs,
      ),
    by = "subject_id"
  ) %>%
  mutate(
    severe_crs = replace_na(severe_crs, "No")
  ) %>%
  #
  # Add Wilcox models with Holm's adjustment for multiple comparisons
  # (one model per cytokine)
  #
  nest(
    data = c(subject_id, cmax, severe_crs)
  ) %>%
  mutate(
    p_value = data %>%
      map_dbl(~ wilcox.test(cmax ~ severe_crs, data = .) %>%
        tidy() %>%
        pull(p.value) %>%
        p.adjust(method = "holm", n = 30) # we are considering 30 cytokines
      )
  ) %>%
  #
  # Order by p-value for the plot
  #
  mutate(
    cytokine_name = cytokine_name %>%
      fct_reorder(p_value)
  ) %>%
  unnest(cols = data)

set.seed(1000) # jitter
cytokine_models %>%
  mutate(
    crs_grade = recode(
      severe_crs,
      "Yes" = "4",
      "No" = "0-3"
    )
  ) %>%
  ggplot(aes(
    x = crs_grade,
    y = cmax)
  ) +
  geom_blank(aes(y = cmax * 1.3)) + # expand y axis
  geom_jitter(
    width = 0.12,
    alpha = 0.8,
    size = 2) +
  stat_summary(aes(group = crs_grade),
    fun = median,
    fun.min = median,
    fun.max = median,
    geom = "crossbar",
    width = 0.3,
    show.legend = FALSE    # removes boxplot outline
  ) +
  facet_wrap(
    ~cytokine_name,
    scales = "free",
    nrow = 6
  ) +
  scale_color_manual(values = c(colors$orange, colors$sky_blue)) +
  theme_pubr() +
  labs(
    x = "CRS grade",
    y = "Day 0-3 maximum serum concentration (pg/mL)",
    color = element_blank()
  ) +
  stat_pvalue_manual(
    cytokine_models %>%
      group_by(cytokine_name) %>%
      mutate(
        group1 = "0-3",
        group2 = "4",
        y.position = max(cmax, na.rm = TRUE) * 1.15  # make space for p-value
      ) %>%
      select(
        cytokine_name,
        group1,
        group2,
        p_value,
        y.position
      ) %>%
      distinct() %>%
      ungroup(),
    label = "p = {signif(p_value, 1)}") +
    theme(
      axis.title.x = element_text(size = rel(1.3)),
      axis.title.y = element_text(size = rel(1.3))
    )

Use prediction models previously described in Teachey et al, Cancer Discovery 2016, to predict which LTBC patients may develop grade 4 CRS.

Model “C” is a logistic regression with IFN-γ, IL-13, and MIP-1α levels as predictors.

result = expit(8.483 * log10(IFNg) - 5.599 * log10(IL13) - 16.343 * log10(MIP1a) + 15.742)
predict low risk if result ≤ 0.3288

Model “E” is a simple decision tree with IFN-γ and and MIP-1α as predictors.

if (IFN-γ < 27.6732): NOT severe CRS
else if (MIP-1α < 30.1591): severe CRS
else if (IFN-γ < 94.8873): NOT severe CRS
else: severe CRS
Create a figure that shows confusion matrices and key performance metrics for models C and E applied to the LTBC patients (Figure S2).
model_data <- cytokine_models %>%
  #
  # Exclude patient #20 who had grade 4 CRS on day 2 after infusion
  # which is too early for the models to detect and also very unusual
  #
  filter(
    subject_id != "16CT022-20"
  ) %>%
  filter(
    cytokine_name %in% c("IL-10", "IL-13", "IFN-γ", "MIP-1α")
  ) %>%
  select(
    subject_id,
    cytokine_name,
    cmax,
    severe_crs
  ) %>%
  mutate(severe_crs = severe_crs %>% factor(levels = c("Yes", "No"))) %>%
  pivot_wider(
    names_from = cytokine_name,
    values_from = cmax
  )

expit <- function(x) {
  exp(x)/(1+exp(x))
}

model_c_predict <- function(ifng, il13, mip1a) {
  if (is.na(ifng) | is.na(il13) | is.na(mip1a)) { NA }
  else {
    result <- expit(8.483 * log10(ifng) - 5.599 * log10(il13) - 16.343 * log10(mip1a) + 15.742)
    if (result <= 0.3288) { "No" }
    else { "Yes" }
  }
}

model_data <- model_data %>%
  mutate(
    model_c_prediction = pmap_chr(
      list(`IFN-γ`, `IL-13`, `MIP-1α`), 
      model_c_predict) %>% 
      factor(levels = c("Yes", "No"))
  )

model_e_predict <- function(ifng, mip1a) {
  if (is.na(ifng) | is.na(mip1a)) { NA }
  else {
    if (ifng < 27.6732) { "No" }
    else if (mip1a < 30.1591) { "Yes" }
    else if (ifng < 94.8873) { "No" }
    else { "Yes" }
  }
}

model_data <- model_data %>%
  mutate(
    model_e_prediction = map2_chr(`IFN-γ`, `MIP-1α`, model_e_predict) %>% 
      factor(levels = c("Yes", "No"))
  )

# Model C metrics

model_c_conf_mat <- model_data %>%
  conf_mat(
    estimate = model_c_prediction,
    truth = severe_crs
  ) 

model_c_conf_mat_plot <- model_c_conf_mat %>%
  autoplot(type = "heatmap")

model_c_sens <- model_c_conf_mat$table %>% 
  sens() %>%
  pull(.estimate)
  
model_c_spec <- model_c_conf_mat$table %>%
  spec() %>%
  pull(.estimate)

model_c_ppv <- model_c_conf_mat$table %>%
  ppv() %>%
  pull(.estimate)

model_c_npv <- model_c_conf_mat$table %>%
  npv() %>%
  pull(.estimate)

model_c_stats <- ggplot() +
  xlim(0, 4) +
  ylim(-.3, 1) +
  annotate(
    "text",
    x = 0, y = 0.75, hjust = 0, size = 5,
    label = glue("Sensitivity = {signif(model_c_sens, 2)}")
  ) +
  annotate(
    "text",
    x = 0, y = 0.25, hjust = 0, size = 5,
    label = glue("Specificity = {signif(model_c_spec, 2)}")
  ) +
  annotate(
    "text",
    x = 2.25, y = 0.75, hjust = 0, size = 5,
    label = glue("PPV = {signif(model_c_ppv, 2)}")
  ) +
  annotate(
    "text",
    x = 2.25, y = 0.25, hjust = 0, size = 5,
    label = glue("NPV = {signif(model_c_npv, 2)}")
  ) +
  theme_void()

model_c_plot <- ggarrange(model_c_conf_mat_plot, model_c_stats, widths = c(1, 2.5)) %>%
  annotate_figure(
    top = text_grob(
      "Model C: IFN-γ + IL-13 + MIP-1α (logistic regression)",
      face = "bold", size = 16
    )
  )

# Model E metrics

model_e_conf_mat <- model_data %>%
  conf_mat(
    estimate = model_e_prediction,
    truth = severe_crs
  ) 

model_e_conf_mat_plot <- model_e_conf_mat %>%
  autoplot(type = "heatmap")

model_e_sens <- model_e_conf_mat$table %>% 
  sens() %>%
  pull(.estimate)
  
model_e_spec <- model_e_conf_mat$table %>%
  spec() %>%
  pull(.estimate)

model_e_ppv <- model_e_conf_mat$table %>%
  ppv() %>%
  pull(.estimate)

model_e_npv <- model_e_conf_mat$table %>%
  npv() %>%
  pull(.estimate)

model_e_stats <- ggplot() +
  xlim(0, 4) +
  ylim(-.3, 1) +
  annotate(
    "text",
    x = 0, y = 0.75, hjust = 0, size = 5,
    label = glue("Sensitivity = {signif(model_e_sens, 2)}")
  ) +
  annotate(
    "text",
    x = 0, y = 0.25, hjust = 0, size = 5,
    label = glue("Specificity = {signif(model_e_spec, 2)}")
  ) +
  annotate(
    "text",
    x = 2.25, y = 0.75, hjust = 0, size = 5,
    label = glue("PPV = {signif(model_e_ppv, 2)}")
  ) +
  annotate(
    "text",
    x = 2.25, y = 0.25, hjust = 0, size = 5,
    label = glue("NPV = {signif(model_e_npv, 2)}")
  ) +
  theme_void()

model_e_plot <- ggarrange(model_e_conf_mat_plot, model_e_stats, widths = c(1, 2.5)) %>%
  annotate_figure(
    top = text_grob(
      "Model E: IFN-γ + MIP-1α (decision tree)",
      face = "bold", size = 16
    )
  )

ggarrange(
  model_c_plot, 
  model_e_plot, 
  nrow = 2, 
  labels = c("A", "B")
)

Safety

Tabulate the incidence of neurotoxicity, graded both by CTCAE and ASTCT ICANS, by cohort (Table S5).
neurotox %>%
  #
  # Add cohort column
  #
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  mutate(
    grade_conventional = case_when(
      grade_conventional == 0 ~ "None",
      grade_conventional == 1 ~ "Grade 1",
      grade_conventional == 2 ~ "Grade 2",
      grade_conventional == 3 ~ "Grade 3",
      grade_conventional == 4 ~ "Grade 4"
    ),
    grade_icans = case_when(
      grade_icans %in% c("0", "1", "2") ~ "Unable to grade",
      grade_icans == 3 ~ "Grade 3",
      grade_icans == 4 ~ "Grade 4"
    ),
    duration = start_date %--% end_date / ddays(1)
  ) %>%
  select(
    cohort,
    grade_conventional,
    duration,
    grade_icans
  ) %>%
  tbl_summary(
    by = cohort,
    type = list(
      starts_with("days") ~ "continuous"
    ),
    label = list(
      grade_conventional = "Neurotoxicity, CTCAE 4.03 grading, maximum grade",
      duration = "Neurotoxicity, CTCAE 4.03 grading, duration, days",
      grade_icans = "Neurotoxicity, ASTCT ICANS grading, maximum grade"
    ),
    digits = list(everything() ~ 0),
    missing = c("no")
  ) %>%
  add_p() %>%
  add_overall() %>%
  fix_table_header()
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
Neurotoxicity, CTCAE 4.03 grading, maximum grade 0.006
Grade 1 5 (7%) 2 (13%) 3 (5%)
Grade 2 9 (13%) 4 (27%) 5 (9%)
Grade 3 4 (6%) 2 (13%) 2 (4%)
Grade 4 1 (1%) 1 (7%) 0 (0%)
None 51 (73%) 6 (40%) 45 (82%)
Neurotoxicity, CTCAE 4.03 grading, duration, days 5 (3, 6) 6 (4, 8) 4 (2, 6) 0.3
Neurotoxicity, ASTCT ICANS grading, maximum grade 0.010
Grade 3 3 (5%) 2 (22%) 1 (2%)
Grade 4 1 (2%) 1 (11%) 0 (0%)
Unable to grade 55 (93%) 6 (67%) 49 (98%)

1 Statistics presented: n (%); Median (IQR)

2 Statistical tests performed: Fisher's exact test; Wilcoxon rank-sum test

Tabulate grade 3-4 adverse events that occurred in 3 or more patients (Table S6).
adverse_events_table <- adverse_events %>%
  #
  # Remove AEs judged to be unrelated to CTL019
  #
  filter(related != "Unrelated") %>%
  filter(grade %in% 3:4) %>%
  select(
    subject_id,
    adverse_event
  ) %>%
  distinct() %>%
  #
  # Remove adverse events with fewer than 3 patients
  #
  add_count(adverse_event) %>%
  filter(n > 2) %>%
  #
  # Convert adverse_event into dummy columns
  #
  mutate(dummy = 1) %>%
  pivot_wider(
    id_cols = subject_id,
    names_from = adverse_event,
    values_from = dummy,
    values_fill = list(dummy = 0)
  ) %>%
  #
  # Make sure we have a row for each infused patient
  #
  right_join(
    infusion %>%
      select(subject_id) %>%
      distinct(),
    by = "subject_id"
  ) %>% 
  mutate_all(~ replace_na(., 0)) %>%
  #
  # Add cohort column
  #
  left_join(
    cohort %>%
      select(subject_id, cohort),
    by = "subject_id"
  ) %>%
  mutate(cohort = recode(
    cohort,
    "Cohort A" = "High tumor burden cohort",
    "Cohort B" = "Low tumor burden cohort")
  ) %>%
  select(-subject_id) %>%
  tbl_summary(
    by = cohort
  ) %>%
  add_overall() %>%
  add_p() %>%  
  sort_p() %>%
  fix_table_header() %>%
  as_gt()

adverse_events_table
Characteristic Overall
N = 701
High tumor burden cohort
N = 151
Low tumor burden cohort
N = 551
p-value2
Cytokine release syndrome 12 (17%) 9 (60%) 3 (5.5%) <0.001
Hypoxia 9 (13%) 7 (47%) 2 (3.6%) <0.001
Febrile neutropenia 40 (57%) 15 (100%) 25 (45%) <0.001
Hypophosphatemia 10 (14%) 6 (40%) 4 (7.3%) 0.005
Aspartate aminotransferase increased 10 (14%) 6 (40%) 4 (7.3%) 0.005
Anorexia 5 (7.1%) 4 (27%) 1 (1.8%) 0.006
Fibrinogen decreased 3 (4.3%) 3 (20%) 0 (0%) 0.008
Hypotension 8 (11%) 5 (33%) 3 (5.5%) 0.009
Acidosis 4 (5.7%) 3 (20%) 1 (1.8%) 0.029
Blood bilirubin increased 4 (5.7%) 3 (20%) 1 (1.8%) 0.029
Anemia 10 (14%) 5 (33%) 5 (9.1%) 0.031
Neutrophil count decreased 38 (54%) 12 (80%) 26 (47%) 0.050
White blood cell decreased 38 (54%) 12 (80%) 26 (47%) 0.050
Platelet count decreased 19 (27%) 7 (47%) 12 (22%) 0.10
Activated partial thromboplastin time prolonged 3 (4.3%) 2 (13%) 1 (1.8%) 0.11
Hyperglycemia 3 (4.3%) 2 (13%) 1 (1.8%) 0.11
Hyperkalemia 3 (4.3%) 2 (13%) 1 (1.8%) 0.11
Lymphocyte count decreased 42 (60%) 12 (80%) 30 (55%) 0.14
Encephalopathy 4 (5.7%) 2 (13%) 2 (3.6%) 0.2
Hypokalemia 8 (11%) 3 (20%) 5 (9.1%) 0.4
Alanine aminotransferase increased 9 (13%) 3 (20%) 6 (11%) 0.4
Fever 4 (5.7%) 1 (6.7%) 3 (5.5%) >0.9
Upper respiratory infection 3 (4.3%) 0 (0%) 3 (5.5%) >0.9

1 Statistics presented: n (%)

2 Statistical tests performed: chi-square test of independence; Fisher's exact test

Data Dictionary

adverse_events
adverse_events
Adverse events. Each row represents an adverse event.
Variable Name Description Variable options
adverse_event Adverse event description Abdominal pain to White blood cell decreased
grade Adverse event grade 1 to 5
related Is the event related to the CTL019 infusion? Possibly
Probably
Unrelated
Definitely
start_date Date on which the adverse event started hidden
subject_id Subject identification number hidden
astct
astct
Retrospective re-grading of CRS according to ASTCT scale. Each row represents one subject.
Variable Name Description Variable options
end_date CRS end date hidden
grade CRS grade 0 to 4
start_date CRS start date hidden
subject_id Subject identification number hidden
cart_expansion
cart_expansion
CAR T-cell expansion in vivo after infusion, measured by flow cytometry (flow) and quantitative polymerase chain reaction (qPCR). Each row represents a lab sample.
Variable Name Description Variable options
bbz_copies CAR-T concentration in peripheral blood, measured by qPCR (genome copies/μg DNA) 0 to 149883.804550858
cart_per_ul CAR-T concentration in peripheral blood, measured by flow (cells/μL) 0 to 7074
day_post_infusion Day of sample collection (days post CTL019 infusion) 0 to 30
subject_id Subject identification number hidden
cd19_status_at_relapse
cd19_status_at_relapse
Leukemic phenotype at relapse with respect to CD19. Each row represents one subject.
Variable Name Description Variable options
cd19_relapse_phenotype CD19 relapse phenotype CD19 negative
CD19 positive
Lineage switch to AML
CD19 subset negative
cd19_relapse_pos_neg CD19 positivity status CD19 negative
CD19 positive
subject_id Subject identification number hidden
cohort
cohort
Cohort assignment. Each row represents one subject.
Variable Name Description Variable options
blasts_in_bm Bone marrow blast percentage 0 to 100
cohort Cohort (A = high tumor burden, B = low tumor burden) Cohort A
Cohort B
Not Assigned
date Date of cohort assignment hidden
subject_id Subject identification number hidden
duration_of_remission
duration_of_remission
Each row represents one subject.
Variable Name Description Variable options
cohort Cohort (A = high tumor burden, B = low tumor burden) Cohort A
Cohort B
event Event class (0 = censored, 1 = event) 0
1
event_type Event type Alternative treatment
Last follow-up
Relapsed disease
alloSCT
Death
subject_id Subject identification number hidden
time Time to event (days) 35 to 1077
cytokines
cytokines
Cytokine measurements. Each row represents one subject.
Variable Name Description Variable options
cytokine_name Name of cytokine FGF-Basic
IL-1β
G-CSF
IL-10
IL-13
IL-6
IL-12
RANTES
Eotaxin
IL-17
MIP-1α
GM-CSF
MIP-1β
MCP-1
IL-15
EGF
IL-5
HGF
VEGF
IFN-γ
IFN-α
IL-1RA
TNF-α
IL-2
IL-7
IP-10
IL-2R
MIG
IL-4
IL-8
result Concentration of cytokine in peripheral blood (pg/mL) 2.40542044472357e-05 to 136437.286926523
sample_date Date of sample collection hidden
subject_id Subject identification number hidden
demographics
demographics
Baseline characteristics. Each row represents one subject. Data missing for subjects that were not assigned to a cohort.
Variable Name Description Variable options
birthday Date of birth hidden
cns CNS disease status CNS1
NA
CNS2A
CNS3
gender Gender Male
Female
high_risk_cytogenetics Presence of high-risk cytogenetics? No
Yes
NA
indication Indication for CAR-T19 therapy (B-ALL type) Relapsed
NA
Primary refractory
prior_bmt Prior stem cell transplant? Yes
No
NA
subject_id Subject identification number hidden
trisomy21 Presence of trisomy 21? No
NA
Yes
disease_assessment
disease_assessment
Disease assessment. Each row represents one study visit.
Variable Name Description Variable options
current_response Current response at time of visit Relapsed Disease
Complete Remission with incomplete blood count recovery (CRi)
Complete Remission (CR)
No Response (Treatment failure)
date Date of visit hidden
subject_id Subject identification number hidden
visit_id Visit category Pre-Infusion
28 Day Follow-Up
3 Month Follow-Up
6 Month Follow-Up
9 Month Follow-Up
12 Month Follow-Up
Unscheduled
event_free_survival
event_free_survival
Each row represents one subject.
Variable Name Description Variable options
cohort Cohort (A = high tumor burden, B = low tumor burden) Cohort A
Cohort B
event Event class (0 = censored, 1 = event) 0
1
event_type Event type Alternative treatment
Last follow-up
No response
Relapsed disease
alloSCT
Death
subject_id Subject identification number hidden
time Time to event (days) 19 to 1105
events
events
Cohort assignment. Each row represents one subject.
Variable Name Description Variable options
blasts_in_bm Bone marrow blast percentage 0 to 100
cohort Cohort (A = high tumor burden, B = low tumor burden) Cohort A
Cohort B
Not Assigned
date Date of cohort assignment hidden
subject_id Subject identification number hidden
infusion
infusion
Information about CTL019 infusions. Each row represents one infusion.
Variable Name Description Variable options
available_cart_dose CAR-T cell dose (cells) 4500000 to 8.64e+08
date Date of infusion hidden
study_day Day of study (day 0 = day of Infusion #1) 0 to 2
subject_id Subject identification number hidden
total_cart_per_kg CAR-T cell dose (cells/kg body weight) 268000 to 14100000
visit_id Visit Information Infusion #1
Infusion #2
neurotox
neurotox
Neurotoxicity graded prospectively on the CTCAE scale and retrospectively on the ASTCT-ICANS scale. Each row represents one subject.
Variable Name Description Variable options
end_date Neurotoxicity end date hidden
grade_conventional CTCAE grade 0 to 4
grade_icans ASTCT-ICANS grade 0 to Unable to grade
start_date Neurotoxicity start date hidden
subject_id Subject identification number hidden
overall_survival
overall_survival
Each row represents one subject.
Variable Name Description Variable options
cohort Cohort (A = high tumor burden, B = low tumor burden) Cohort A
Cohort B
event Event class (0 = censored, 1 = event) 1
0
event_type Event type Death
Last follow-up
subject_id Subject identification number hidden
time Time to event (days) 19 to 1105
time_to_b_cell_recovery
time_to_b_cell_recovery
Each row represents one subject.
Variable Name Description Variable options
cohort Cohort (A = high tumor burden, B = low tumor burden) Cohort A
Cohort B
event Event class (0 = censored, 1 = event) 0
1
event_type Event type Last B cell assessment by flow
B cell recovery
Relapsed disease
subject_id Subject identification number hidden
time Time to event (days) 0 to 1077
toci_administration
toci_administration
Tocilizumab administration. Each row represents one subject.
Variable Name Description Variable options
crs_onset_time Date and time of CRS onset (time of first fever) hidden
dose_administered_mg Tocilizumab dose given (mg) 128 to 720
subject_id Subject identification number hidden
toci_administration_time Date and time of tocilizumab administration hidden

Computational Environment

Computational Environment
devtools::session_info()
─ Session info ───────────────────────────────────────────────────────────────────────────────────
 setting  value                       
 version  R version 4.0.1 (2020-06-06)
 os       macOS Catalina 10.15.7      
 system   x86_64, darwin17.0          
 ui       RStudio                     
 language (EN)                        
 collate  en_US.UTF-8                 
 ctype    en_US.UTF-8                 
 tz       America/New_York            
 date     2020-12-14                  

─ Packages ───────────────────────────────────────────────────────────────────────────────────────
 package       * version    date       lib source                            
 abind           1.4-5      2016-07-21 [1] CRAN (R 4.0.0)                    
 assertthat      0.2.1      2019-03-21 [2] CRAN (R 4.0.0)                    
 backports       1.1.10     2020-09-15 [1] CRAN (R 4.0.2)                    
 base64enc       0.1-3      2015-07-28 [1] CRAN (R 4.0.0)                    
 bayesplot       1.7.2      2020-05-28 [1] CRAN (R 4.0.0)                    
 binom         * 1.1-1      2014-01-02 [1] CRAN (R 4.0.2)                    
 blob            1.2.1      2020-01-20 [1] CRAN (R 4.0.0)                    
 boot            1.3-25     2020-04-26 [2] CRAN (R 4.0.1)                    
 broom         * 0.7.0      2020-07-09 [1] CRAN (R 4.0.2)                    
 callr           3.5.1      2020-10-13 [1] CRAN (R 4.0.2)                    
 car             3.0-8      2020-05-21 [1] CRAN (R 4.0.0)                    
 carData         3.0-4      2020-05-22 [1] CRAN (R 4.0.0)                    
 cellranger      1.1.0      2016-07-27 [1] CRAN (R 4.0.0)                    
 checkmate       2.0.0      2020-02-06 [1] CRAN (R 4.0.0)                    
 class           7.3-17     2020-04-26 [2] CRAN (R 4.0.1)                    
 cli             2.1.0      2020-10-12 [1] CRAN (R 4.0.2)                    
 codetools       0.2-16     2018-12-24 [2] CRAN (R 4.0.1)                    
 colorspace      1.4-1      2019-03-18 [1] CRAN (R 4.0.0)                    
 colourpicker    1.0        2017-09-27 [1] CRAN (R 4.0.0)                    
 commonmark      1.7        2018-12-01 [1] CRAN (R 4.0.0)                    
 conflicted    * 1.0.4      2019-06-21 [1] CRAN (R 4.0.0)                    
 cowplot         1.0.0      2019-07-11 [1] CRAN (R 4.0.0)                    
 crayon          1.3.4      2017-09-16 [2] CRAN (R 4.0.0)                    
 crosstalk       1.1.0.1    2020-03-13 [1] CRAN (R 4.0.0)                    
 curl            4.3        2019-12-02 [1] CRAN (R 4.0.0)                    
 data.table      1.12.8     2019-12-09 [1] CRAN (R 4.0.0)                    
 dataMeta      * 0.1.1.9000 2020-10-06 [1] Github (skadauke/dataMeta@2e8c85a)
 DBI             1.1.0      2019-12-15 [1] CRAN (R 4.0.0)                    
 dbplyr          1.4.4      2020-05-27 [1] CRAN (R 4.0.0)                    
 desc            1.2.0      2018-05-01 [2] CRAN (R 4.0.0)                    
 DescTools     * 0.99.36    2020-05-23 [1] CRAN (R 4.0.0)                    
 devtools        2.3.0      2020-04-10 [1] CRAN (R 4.0.0)                    
 dials         * 0.0.6      2020-04-03 [1] CRAN (R 4.0.0)                    
 DiceDesign      1.8-1      2019-07-31 [1] CRAN (R 4.0.0)                    
 digest          0.6.25     2020-02-23 [2] CRAN (R 4.0.0)                    
 distill         1.1        2020-12-02 [1] CRAN (R 4.0.1)                    
 downlit         0.2.1      2020-11-04 [1] CRAN (R 4.0.2)                    
 dplyr         * 1.0.2      2020-08-18 [1] CRAN (R 4.0.2)                    
 DT              0.15       2020-08-05 [1] CRAN (R 4.0.2)                    
 dygraphs        1.1.1.6    2018-07-11 [1] CRAN (R 4.0.0)                    
 ellipsis        0.3.1      2020-05-15 [2] CRAN (R 4.0.0)                    
 evaluate        0.14       2019-05-28 [2] CRAN (R 4.0.0)                    
 expm            0.999-4    2019-03-21 [1] CRAN (R 4.0.0)                    
 fansi           0.4.1      2020-01-08 [2] CRAN (R 4.0.0)                    
 farver          2.0.3      2020-01-16 [1] CRAN (R 4.0.0)                    
 fastmap         1.0.1      2019-10-08 [1] CRAN (R 4.0.0)                    
 forcats       * 0.5.0      2020-03-01 [1] CRAN (R 4.0.0)                    
 foreach         1.5.0      2020-03-30 [1] CRAN (R 4.0.0)                    
 foreign         0.8-80     2020-05-24 [2] CRAN (R 4.0.1)                    
 fs              1.5.0      2020-07-31 [1] CRAN (R 4.0.2)                    
 furrr           0.1.0      2018-05-16 [1] CRAN (R 4.0.0)                    
 future          1.17.0     2020-04-18 [1] CRAN (R 4.0.0)                    
 generics        0.0.2      2018-11-29 [2] CRAN (R 4.0.0)                    
 ggplot2       * 3.3.1      2020-05-28 [1] CRAN (R 4.0.0)                    
 ggpubr        * 0.3.0      2020-05-04 [1] CRAN (R 4.0.0)                    
 ggridges        0.5.2      2020-01-12 [1] CRAN (R 4.0.0)                    
 ggsignif        0.6.0      2019-08-08 [1] CRAN (R 4.0.0)                    
 globals         0.12.5     2019-12-07 [1] CRAN (R 4.0.0)                    
 glue          * 1.4.2      2020-08-27 [1] CRAN (R 4.0.2)                    
 gower           0.2.2      2020-06-23 [1] CRAN (R 4.0.2)                    
 GPfit           1.0-8      2019-02-08 [1] CRAN (R 4.0.0)                    
 gridExtra       2.3        2017-09-09 [1] CRAN (R 4.0.0)                    
 gt            * 0.2.2      2020-08-05 [1] CRAN (R 4.0.2)                    
 gtable          0.3.0      2019-03-25 [1] CRAN (R 4.0.0)                    
 gtools          3.8.2      2020-03-31 [1] CRAN (R 4.0.0)                    
 gtsummary     * 1.3.5      2020-09-29 [1] CRAN (R 4.0.1)                    
 haven           2.3.1      2020-06-01 [1] CRAN (R 4.0.0)                    
 here          * 0.1        2017-05-28 [1] CRAN (R 4.0.0)                    
 highr           0.8        2019-03-20 [1] CRAN (R 4.0.0)                    
 hms             0.5.3      2020-01-08 [1] CRAN (R 4.0.0)                    
 htmltools       0.5.0      2020-06-16 [1] CRAN (R 4.0.2)                    
 htmlwidgets     1.5.1      2019-10-08 [1] CRAN (R 4.0.0)                    
 httpuv          1.5.4      2020-06-06 [1] CRAN (R 4.0.1)                    
 httr            1.4.2      2020-07-20 [1] CRAN (R 4.0.2)                    
 igraph          1.2.5      2020-03-19 [1] CRAN (R 4.0.0)                    
 infer         * 0.5.1      2019-11-19 [1] CRAN (R 4.0.0)                    
 inline          0.3.15     2018-05-18 [1] CRAN (R 4.0.0)                    
 ipred           0.9-9      2019-04-28 [1] CRAN (R 4.0.0)                    
 iterators       1.0.12     2019-07-26 [1] CRAN (R 4.0.0)                    
 janeaustenr     0.1.5      2017-06-10 [1] CRAN (R 4.0.0)                    
 jsonlite        1.7.1      2020-09-07 [1] CRAN (R 4.0.2)                    
 kableExtra    * 1.2.1      2020-08-27 [1] CRAN (R 4.0.2)                    
 km.ci           0.5-2      2009-08-30 [1] CRAN (R 4.0.0)                    
 KMsurv          0.1-5      2012-12-03 [1] CRAN (R 4.0.0)                    
 knitr           1.30       2020-09-22 [1] CRAN (R 4.0.2)                    
 labeling        0.3        2014-08-23 [1] CRAN (R 4.0.0)                    
 later           1.1.0.1    2020-06-05 [1] CRAN (R 4.0.1)                    
 lattice         0.20-41    2020-04-02 [2] CRAN (R 4.0.1)                    
 lava            1.6.8      2020-09-26 [1] CRAN (R 4.0.2)                    
 lhs             1.0.2      2020-04-13 [1] CRAN (R 4.0.0)                    
 lifecycle       0.2.0      2020-03-06 [1] CRAN (R 4.0.0)                    
 listenv         0.8.0      2019-12-05 [1] CRAN (R 4.0.0)                    
 lme4            1.1-23     2020-04-07 [1] CRAN (R 4.0.0)                    
 loo             2.2.0      2019-12-19 [1] CRAN (R 4.0.0)                    
 lubridate     * 1.7.9      2020-06-08 [2] CRAN (R 4.0.1)                    
 magrittr        1.5        2014-11-22 [2] CRAN (R 4.0.0)                    
 markdown        1.1        2019-08-07 [1] CRAN (R 4.0.0)                    
 MASS            7.3-51.6   2020-04-26 [2] CRAN (R 4.0.1)                    
 Matrix          1.2-18     2019-11-27 [2] CRAN (R 4.0.1)                    
 matrixStats     0.56.0     2020-03-13 [1] CRAN (R 4.0.0)                    
 memoise         1.1.0      2017-04-21 [1] CRAN (R 4.0.0)                    
 mgcv            1.8-31     2019-11-09 [2] CRAN (R 4.0.1)                    
 mime            0.9        2020-02-04 [1] CRAN (R 4.0.0)                    
 miniUI          0.1.1.1    2018-05-18 [1] CRAN (R 4.0.0)                    
 minqa           1.2.4      2014-10-09 [1] CRAN (R 4.0.0)                    
 modelr          0.1.8      2020-05-19 [1] CRAN (R 4.0.0)                    
 munsell         0.5.0      2018-06-12 [1] CRAN (R 4.0.0)                    
 mvtnorm         1.1-0      2020-02-24 [1] CRAN (R 4.0.0)                    
 naniar        * 0.5.1      2020-04-30 [1] CRAN (R 4.0.0)                    
 nlme            3.1-148    2020-05-24 [2] CRAN (R 4.0.1)                    
 nloptr          1.2.2.1    2020-03-11 [1] CRAN (R 4.0.0)                    
 nnet            7.3-14     2020-04-26 [2] CRAN (R 4.0.1)                    
 openxlsx        4.1.5      2020-05-06 [1] CRAN (R 4.0.0)                    
 parsnip       * 0.1.1      2020-05-06 [1] CRAN (R 4.0.0)                    
 pillar          1.4.6      2020-07-10 [1] CRAN (R 4.0.2)                    
 pkgbuild        1.1.0      2020-07-13 [1] CRAN (R 4.0.2)                    
 pkgconfig       2.0.3      2019-09-22 [1] CRAN (R 4.0.0)                    
 pkgload         1.1.0      2020-05-29 [2] CRAN (R 4.0.0)                    
 plyr            1.8.6      2020-03-03 [1] CRAN (R 4.0.0)                    
 prettyunits     1.1.1      2020-01-24 [2] CRAN (R 4.0.0)                    
 pROC            1.16.2     2020-03-19 [1] CRAN (R 4.0.0)                    
 processx        3.4.4      2020-09-03 [1] CRAN (R 4.0.2)                    
 prodlim         2019.11.13 2019-11-17 [1] CRAN (R 4.0.0)                    
 promises        1.1.1      2020-06-09 [1] CRAN (R 4.0.2)                    
 ps              1.3.3      2020-05-08 [2] CRAN (R 4.0.0)                    
 purrr         * 0.3.4      2020-04-17 [1] CRAN (R 4.0.0)                    
 R6              2.4.1      2019-11-12 [2] CRAN (R 4.0.0)                    
 Rcpp            1.0.5      2020-07-06 [1] CRAN (R 4.0.2)                    
 readr         * 1.3.1      2018-12-21 [1] CRAN (R 4.0.0)                    
 readxl          1.3.1      2019-03-13 [1] CRAN (R 4.0.0)                    
 recipes       * 0.1.13     2020-06-23 [1] CRAN (R 4.0.2)                    
 remotes         2.2.0      2020-07-21 [1] CRAN (R 4.0.2)                    
 reprex          0.3.0      2019-05-16 [1] CRAN (R 4.0.0)                    
 reshape2        1.4.4      2020-04-09 [1] CRAN (R 4.0.0)                    
 rio             0.5.16     2018-11-26 [1] CRAN (R 4.0.0)                    
 rlang           0.4.8      2020-10-08 [1] CRAN (R 4.0.2)                    
 rmarkdown       2.5        2020-10-21 [1] CRAN (R 4.0.1)                    
 rpart           4.1-15     2019-04-12 [2] CRAN (R 4.0.1)                    
 rprojroot       1.3-2      2018-01-03 [2] CRAN (R 4.0.0)                    
 rsample       * 0.0.7      2020-06-04 [1] CRAN (R 4.0.1)                    
 rsconnect       0.8.16     2019-12-13 [1] CRAN (R 4.0.0)                    
 rstan           2.19.3     2020-02-11 [1] CRAN (R 4.0.0)                    
 rstanarm        2.19.3     2020-02-11 [1] CRAN (R 4.0.0)                    
 rstantools      2.1.0      2020-06-01 [1] CRAN (R 4.0.0)                    
 rstatix         0.5.0      2020-04-28 [1] CRAN (R 4.0.0)                    
 rstudioapi      0.11       2020-02-07 [2] CRAN (R 4.0.0)                    
 rvest           0.3.5      2019-11-08 [1] CRAN (R 4.0.0)                    
 sass            0.2.0      2020-03-18 [1] CRAN (R 4.0.0)                    
 scales        * 1.1.1      2020-05-11 [1] CRAN (R 4.0.0)                    
 sessioninfo     1.1.1      2018-11-05 [1] CRAN (R 4.0.0)                    
 shiny           1.5.0      2020-06-23 [1] CRAN (R 4.0.2)                    
 shinyjs         1.1        2020-01-13 [1] CRAN (R 4.0.0)                    
 shinystan       2.5.0      2018-05-01 [1] CRAN (R 4.0.0)                    
 shinythemes     1.1.2      2018-11-06 [1] CRAN (R 4.0.0)                    
 simplecolors  * 0.1.0      2020-02-01 [1] CRAN (R 4.0.0)                    
 SnowballC       0.7.0      2020-04-01 [1] CRAN (R 4.0.0)                    
 StanHeaders     2.21.0-3   2020-05-28 [1] CRAN (R 4.0.0)                    
 statmod         1.4.34     2020-02-17 [1] CRAN (R 4.0.0)                    
 stringi         1.5.3      2020-09-09 [1] CRAN (R 4.0.2)                    
 stringr       * 1.4.0      2019-02-10 [1] CRAN (R 4.0.0)                    
 survival      * 3.1-12     2020-04-10 [1] CRAN (R 4.0.0)                    
 survminer     * 0.4.7      2020-05-28 [1] CRAN (R 4.0.0)                    
 survMisc        0.5.5      2018-07-05 [1] CRAN (R 4.0.0)                    
 testthat        2.3.2      2020-03-02 [2] CRAN (R 4.0.0)                    
 threejs         0.3.3      2020-01-21 [1] CRAN (R 4.0.0)                    
 tibble        * 3.0.4      2020-10-12 [1] CRAN (R 4.0.2)                    
 tidymodels    * 0.1.0      2020-02-16 [1] CRAN (R 4.0.0)                    
 tidyposterior   0.0.2      2018-11-15 [1] CRAN (R 4.0.0)                    
 tidypredict     0.4.5      2020-02-10 [1] CRAN (R 4.0.0)                    
 tidyr         * 1.1.2      2020-08-27 [1] CRAN (R 4.0.2)                    
 tidyselect      1.1.0      2020-05-11 [1] CRAN (R 4.0.0)                    
 tidytext        0.2.4      2020-04-17 [1] CRAN (R 4.0.0)                    
 tidyverse     * 1.3.0      2019-11-21 [1] CRAN (R 4.0.2)                    
 timeDate        3043.102   2018-02-21 [1] CRAN (R 4.0.0)                    
 tokenizers      0.2.1      2018-03-29 [1] CRAN (R 4.0.0)                    
 tune          * 0.1.0      2020-04-02 [1] CRAN (R 4.0.0)                    
 usethis         1.6.3      2020-09-17 [1] CRAN (R 4.0.2)                    
 vctrs           0.3.4      2020-08-29 [1] CRAN (R 4.0.2)                    
 viridisLite     0.3.0      2018-02-01 [1] CRAN (R 4.0.0)                    
 visdat          0.5.3      2019-02-15 [1] CRAN (R 4.0.0)                    
 webshot         0.5.2      2019-11-22 [1] CRAN (R 4.0.0)                    
 withr           2.3.0      2020-09-22 [1] CRAN (R 4.0.2)                    
 workflows     * 0.1.1      2020-03-17 [1] CRAN (R 4.0.0)                    
 xfun            0.18       2020-09-29 [1] CRAN (R 4.0.1)                    
 xml2            1.3.2      2020-04-23 [1] CRAN (R 4.0.0)                    
 xtable          1.8-4      2019-04-21 [1] CRAN (R 4.0.0)                    
 xts             0.12-0     2020-01-19 [1] CRAN (R 4.0.0)                    
 yaml            2.2.1      2020-02-01 [1] CRAN (R 4.0.0)                    
 yardstick     * 0.0.6      2020-03-17 [1] CRAN (R 4.0.0)                    
 zip             2.1.1      2020-08-27 [1] CRAN (R 4.0.2)                    
 zoo             1.8-8      2020-05-02 [1] CRAN (R 4.0.0)                    

[1] /Users/kadaukes/Library/R/4.0/library
[2] /Library/Frameworks/R.framework/Versions/4.0/Resources/library