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

Add regression tests for summary.simtrial_gs_wlr() #282

Open jdblischak opened 4 days ago

jdblischak commented 4 days ago

I am starting to convert summary.simtrial_gs_wlr() to data.table (https://github.com/Merck/simtrial/pull/268/files#r1727564684). In order to ensure I don't change the results, I need regression tests.

jdblischak commented 4 days ago

Unfortunately our coverage results were not uploaded to Codecov:

[1] "Rate limit reached. Please upload with the Codecov repository upload token to resolve issue. Expected time to availability: 2408s.
jdblischak commented 4 days ago

I ran covr locally

x <- covr::package_coverage()
covr::report(x)

I converted the examples to tests, but there are large gaps in the code coverage. Thus I can't know if my conversion to data.table is being done correctly. @LittleBeannie could you please provide example code that uses these code paths?

image

image

image

image

jdblischak commented 4 days ago

Also, in the example code, there are no rows where cross_upper = -z >= upper_bound is TRUE, and thus the entire pipe below evaluates to an empty table. Could you please provide an example where sim_upper_prob is not returned as NA?

https://github.com/Merck/simtrial/blob/5fe51b957c3eee08cf2ba05e789a06c7b3aac837/R/summary.R#L103-L113

LittleBeannie commented 18 hours ago

Hi @jdblischak, could you please confirm if the following example is something you are looking for?

library(gsDesign2)
library(simtrial)

# Parameters for enrollment
enroll_rampup_duration <- 4 # Duration for enrollment ramp up
enroll_duration <- 16 # Total enrollment duration
enroll_rate <- 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 <- 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 <- gs_design_ahr(
  enroll_rate = enroll_rate, fail_rate = fail_rate,
  ratio = ratio, alpha = alpha, beta = beta,
  analysis_time = c(12, 24, 36),
  upper = gs_spending_bound,
  upar = list(sf = gsDesign::sfLDOF, total_spend = alpha),
  lower = gs_spending_bound,
  lpar = list(sf = gsDesign::sfLDOF, total_spend = beta))

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

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

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

# Summarize simulation and compare with the planned design
simulation |> summary(design = design)