Skip to contents

simfix() provide simulations of a single endpoint two-arm trial where the enrollment, hazard ratio, and failure and dropout rates change over time.

Usage

simfix(
  nsim = 1000,
  sampleSize = 500,
  target_event = 350,
  strata = tibble(Stratum = "All", p = 1),
  enroll_rate = tibble(duration = c(2, 2, 10), rate = c(3, 6, 9)),
  failRates = tibble(Stratum = "All", duration = c(3, 100), failRate = log(2)/c(9, 18),
    hr = c(0.9, 0.6), dropoutRate = rep(0.001, 2)),
  totalDuration = 30,
  block = rep(c("Experimental", "Control"), 2),
  timingType = 1:5,
  rg = tibble(rho = 0, gamma = 0),
  seed = NULL
)

Arguments

nsim

Number of simulations to perform.

sampleSize

Total sample size per simulation.

target_event

Targeted event count for analysis.

strata

A tibble with strata specified in Stratum, probability (incidence) of each stratum in p.

enroll_rate

Piecewise constant enrollment rates by time period. Note that these are overall population enrollment rates and the strata argument controls the random distribution between strata.

failRates

Piecewise constant control group failure rates, hazard ratio for experimental vs control, and dropout rates by stratum and time period.

totalDuration

Total follow-up from start of enrollment to data cutoff.

block

As in simtrial::sim_pw_surv(). Vector of treatments to be included in each block.

timingType

A numeric vector determining data cutoffs used; see details. Default is to include all available cutoff methods.

rg

As in simtrial::tenFHCorr(). A tibble with variables rho and gamma, both greater than equal to zero, to specify one Fleming-Harrington weighted logrank test per row.

seed

Optional. Initial seed for simulations

Value

A tibble including columns Events (event count), lnhr (log-hazard ratio), Z (normal test statistic; < 0 favors experimental) cut (text describing cutoff used), Duration (duration of trial at cutoff for analysis) and sim (sequential simulation id). One row per simulated dataset per cutoff specified in timingType, per test statistic specified. If multiple Fleming-Harrington tests are specified in rg, then columns rho,gamma

are also included.

Details

timingType has up to 5 elements indicating different options for data cutoff. 1 uses the planned study duration, 2 the time the targeted event count is achieved, 3 the planned minimum follow-up after enrollment is complete, 4 the maximum of planned study duration and targeted event count cuts (1 and 2), 5 the maximum of targeted event count and minimum follow-up cuts (2 and 3).

Examples

library(tidyr)
library(dplyr)
library(doParallel)
#> Loading required package: foreach
#> Loading required package: iterators
#> Loading required package: parallel
library(tibble)

# example 1
# Show output structure
simfix(nsim = 3)
#>    Events        lnhr          Z                              cut Duration Sim
#> 1     101 -0.35596354 -1.7807528                 Planned duration 30.00000   1
#> 2     350 -0.58842899 -5.4347050                  Targeted events 70.66627   1
#> 3     345 -0.59304284 -5.4369767                Minimum follow-up 69.99847   1
#> 4     350 -0.58842899 -5.4347050 Max(planned duration, event cut) 70.66627   1
#> 5     350 -0.58842899 -5.4347050    Max(min follow-up, event cut) 70.66627   1
#> 6      99 -0.57115488 -2.7933633                 Planned duration 30.00000   2
#> 7     350 -0.54403037 -5.0405514                  Targeted events 70.40724   2
#> 8     358 -0.56738099 -5.3181052                Minimum follow-up 73.09564   2
#> 9     350 -0.54403037 -5.0405514 Max(planned duration, event cut) 70.40724   2
#> 10    358 -0.56738099 -5.3181052    Max(min follow-up, event cut) 73.09564   2
#> 11    100 -0.05129625 -0.2550474                 Planned duration 30.00000   3
#> 12    350 -0.22755298 -2.1235342                  Targeted events 68.31636   3
#> 13    375 -0.26792061 -2.5879234                Minimum follow-up 75.28638   3
#> 14    350 -0.22755298 -2.1235342 Max(planned duration, event cut) 68.31636   3
#> 15    375 -0.26792061 -2.5879234    Max(min follow-up, event cut) 75.28638   3

# example 2
# Example with 2 tests: logrank and FH(0,1)
simfix(nsim = 1,rg = tibble(rho = 0, gamma = c(0, 1)))
#>    Events       lnhr rho gamma         Z        V1        V2
#> 1      79 -0.4531215   0     0 -1.998291 1.0000000 0.8273014
#> 2      79 -0.4531215   0     1 -2.319715 0.8273014 1.0000000
#> 3     350 -0.4268443   0     0 -3.965361 1.0000000 0.8504254
#> 4     350 -0.4268443   0     1 -3.694219 0.8504254 1.0000000
#> 5     357 -0.4368910   0     0 -4.104925 1.0000000 0.8522037
#> 6     357 -0.4368910   0     1 -3.921844 0.8522037 1.0000000
#> 7     350 -0.4268443   0     0 -3.965361 1.0000000 0.8504254
#> 8     350 -0.4268443   0     1 -3.694219 0.8504254 1.0000000
#> 9     357 -0.4368910   0     0 -4.104925 1.0000000 0.8522037
#> 10    357 -0.4368910   0     1 -3.921844 0.8522037 1.0000000
#>                                 cut Duration Sim
#> 1                  Planned duration 30.00000   1
#> 2                  Planned duration 30.00000   1
#> 3                   Targeted events 71.51114   1
#> 4                   Targeted events 71.51114   1
#> 5                 Minimum follow-up 73.51266   1
#> 6                 Minimum follow-up 73.51266   1
#> 7  Max(planned duration, event cut) 71.51114   1
#> 8  Max(planned duration, event cut) 71.51114   1
#> 9     Max(min follow-up, event cut) 73.51266   1
#> 10    Max(min follow-up, event cut) 73.51266   1

# example 3
# Power by test
# Only use cuts for events, events + min follow-up
xx <- simfix(nsim = 100,
             timingType = c(2, 5),
             rg = tibble(rho = 0, gamma = c(0, 1)))
# Get power approximation for FH, data cutoff combination
xx %>%
  group_by(cut, rho, gamma) %>%
  summarise(mean(Z <= qnorm(.025)))
#> `summarise()` has grouped output by 'cut', 'rho'. You can override using the
#> `.groups` argument.
#> # A tibble: 4 × 4
#> # Groups:   cut, rho [2]
#>   cut                             rho gamma `mean(Z <= qnorm(0.025))`
#>   <chr>                         <dbl> <dbl>                     <dbl>
#> 1 Max(min follow-up, event cut)     0     0                      0.94
#> 2 Max(min follow-up, event cut)     0     1                      0.98
#> 3 Targeted events                   0     0                      0.94
#> 4 Targeted events                   0     1                      0.97

# MaxCombo power estimate for cutoff at max of targeted events, minimum follow-up
p <- xx %>%
  filter(cut != "Targeted events") %>%
  group_by(Sim) %>%
  group_map(pvalue_maxcombo) %>%
  unlist()

mean(p < .025)
#> [1] 0.98

# MaxCombo estimate for targeted events cutoff
p <- xx %>%
  filter(cut == "Targeted events") %>%
  group_by(Sim) %>%
  group_map(pvalue_maxcombo) %>%
  unlist()

mean(p < .025)
#> [1] 0.95

# example 3
# Use two cores
registerDoParallel(2)
simfix(nsim = 10, seed = 2022)
#> Using 2 cores with backend doParallelMC
#>    Events        lnhr           Z                              cut Duration Sim
#> 1     109 -0.39889743 -2.06986755                 Planned duration 30.00000   1
#> 2     350 -0.49422311 -4.60390065                  Targeted events 68.10765   1
#> 3     361 -0.46996411 -4.44698855                Minimum follow-up 70.94601   1
#> 4     350 -0.49422311 -4.60390065 Max(planned duration, event cut) 68.10765   1
#> 5     361 -0.46996411 -4.44698855    Max(min follow-up, event cut) 70.94601   1
#> 6      92  0.13030304  0.62455481                 Planned duration 30.00000   2
#> 7     350 -0.06380056 -0.59576098                  Targeted events 71.15880   2
#> 8     369 -0.12986489 -1.24394980                Minimum follow-up 74.20194   2
#> 9     350 -0.06380056 -0.59576098 Max(planned duration, event cut) 71.15880   2
#> 10    369 -0.12986489 -1.24394980    Max(min follow-up, event cut) 74.20194   2
#> 11    109 -0.35042569 -1.81806443                 Planned duration 30.00000   3
#> 12    350 -0.30340153 -2.82469678                  Targeted events 69.68286   3
#> 13    353 -0.30661159 -2.86687105                Minimum follow-up 71.40394   3
#> 14    350 -0.30340153 -2.82469678 Max(planned duration, event cut) 69.68286   3
#> 15    353 -0.30661159 -2.86687105    Max(min follow-up, event cut) 71.40394   3
#> 16    107 -0.32400212 -1.66943391                 Planned duration 30.00000   4
#> 17    350 -0.38322625 -3.56929885                  Targeted events 70.15615   4
#> 18    361 -0.40035000 -3.78355568                Minimum follow-up 73.04033   4
#> 19    350 -0.38322625 -3.56929885 Max(planned duration, event cut) 70.15615   4
#> 20    361 -0.40035000 -3.78355568    Max(min follow-up, event cut) 73.04033   4
#> 21     99 -0.13790150 -0.68382782                 Planned duration 30.00000   5
#> 22    350 -0.43925467 -4.08974448                  Targeted events 71.52825   5
#> 23    369 -0.44486563 -4.25463983                Minimum follow-up 76.21111   5
#> 24    350 -0.43925467 -4.08974448 Max(planned duration, event cut) 71.52825   5
#> 25    369 -0.44486563 -4.25463983    Max(min follow-up, event cut) 76.21111   5
#> 26    105 -0.18871020 -0.96580373                 Planned duration 30.00000   6
#> 27    350 -0.32895353 -3.07323368                  Targeted events 68.56574   6
#> 28    358 -0.33990896 -3.21127927                Minimum follow-up 69.61403   6
#> 29    350 -0.32895353 -3.07323368 Max(planned duration, event cut) 68.56574   6
#> 30    358 -0.33990896 -3.21127927    Max(min follow-up, event cut) 69.61403   6
#> 31     91 -0.32023796 -1.51269632                 Planned duration 30.00000   7
#> 32    350 -0.30003853 -2.79088836                  Targeted events 74.43009   7
#> 33    348 -0.30041840 -2.78367764                Minimum follow-up 73.88934   7
#> 34    350 -0.30003853 -2.79088836 Max(planned duration, event cut) 74.43009   7
#> 35    350 -0.30003853 -2.79088836    Max(min follow-up, event cut) 74.43009   7
#> 36    108 -0.06740129 -0.34998515                 Planned duration 30.00000   8
#> 37    350 -0.34760754 -3.23571976                  Targeted events 70.79181   8
#> 38    360 -0.36258193 -3.42179494                Minimum follow-up 73.10338   8
#> 39    350 -0.34760754 -3.23571976 Max(planned duration, event cut) 70.79181   8
#> 40    360 -0.36258193 -3.42179494    Max(min follow-up, event cut) 73.10338   8
#> 41    101 -0.51016154 -2.54286277                 Planned duration 30.00000   9
#> 42    350 -0.37603601 -3.50384516                  Targeted events 68.74117   9
#> 43    364 -0.37361232 -3.55001459                Minimum follow-up 74.54110   9
#> 44    350 -0.37603601 -3.50384516 Max(planned duration, event cut) 68.74117   9
#> 45    364 -0.37361232 -3.55001459    Max(min follow-up, event cut) 74.54110   9
#> 46     79  0.01209188  0.05336003                 Planned duration 30.00000  10
#> 47    350 -0.18922477 -1.76159151                  Targeted events 73.00188  10
#> 48    361 -0.19779690 -1.86989858                Minimum follow-up 76.39085  10
#> 49    350 -0.18922477 -1.76159151 Max(planned duration, event cut) 73.00188  10
#> 50    361 -0.19779690 -1.86989858    Max(min follow-up, event cut) 76.39085  10
stopImplicitCluster()
registerDoSEQ()