Merck / simtrial

Clinical trial simulation for time-to-event endpoints
https://merck.github.io/simtrial/
GNU General Public License v3.0
16 stars 8 forks source link

Summarize group sequential simulations #265

Closed LittleBeannie closed 3 weeks ago

LittleBeannie commented 1 month ago
 # Parameters for enrollment
 enroll_rampup_duration <- 4 # Duration for enrollment ramp up
 enroll_duration <- 16 # Total enrollment duration
 enroll_rate <- gsDesign2::define_enroll_rate(
   duration = c(
     enroll_rampup_duration, enroll_duration - enroll_rampup_duration),
  rate = c(10, 30))

 # Parameters for treatment effect
 delay_effect_duration <- 3 # Delay treatment effect in months
 median_ctrl <- 9 # Survival median of the control arm
 median_exp <- c(9, 14) # Survival median of the experimental arm
 dropout_rate <- 0.001
 fail_rate <- gsDesign2::define_fail_rate(
   duration = c(delay_effect_duration, 100),
   fail_rate = log(2) / median_ctrl,
   hr = median_ctrl / median_exp,
   dropout_rate = dropout_rate)

 # Other related parameters
 alpha <- 0.025 # Type I error
 beta <- 0.1 # Type II error
 ratio <- 1 # Randomization ratio (experimental:control)

 # Build a one-sided group sequential design
 design <- gsDesign2::gs_design_ahr(
   enroll_rate = enroll_rate, fail_rate = fail_rate,
   ratio = ratio, alpha = alpha, beta = beta,
   analysis_time = c(12, 24, 36),
   upper = gsDesign2::gs_spending_bound,
   upar = list(sf = gsDesign::sfLDOF, total_spend = alpha),
   lower = gsDesign2::gs_b,
   lpar = rep(-Inf, 3))

 # Define cuttings of 2 IAs and 1 FA
 ia1_cut <- simtrial::create_cut(target_event_overall = ceiling(design$analysis$event[1]))
 ia2_cut <- simtrial::create_cut(target_event_overall = ceiling(design$analysis$event[2]))
 fa_cut <- simtrial::create_cut(target_event_overall = ceiling(design$analysis$event[3]))

 # Run simulations
 simulation <- simtrial::sim_gs_n(
   n_sim = 3,
   sample_size = ceiling(design$analysis$n[3]),
   enroll_rate = design$enroll_rate,
   fail_rate = design$fail_rate,
   test = simtrial::wlr,
   cut = list(ia1 = ia1_cut, ia2 = ia2_cut, fa = fa_cut),
   weight = simtrial::fh(rho = 0, gamma = 0.5))

Option 1: summarize simulations WITHOUT comparison to the planned design

 simulation |>
  summary(bound = gsDesign::gsDesign(k = 3, test.type = 1, sfu = gsDesign::sfLDOF)$upper$bound) |>
  simtrial::as_gt()

image

Option 2: summarize simulations WITH comparisons to the planned design

 simulation |>
  summary(design=design) |>
  simtrial::as_gt()

image