Continuous Rankin Simulations

Here, we present the calculations for the initial design of the DEFUSE3 trial based on (Lai, Lavori, and Liao 2014) and (Lai, Lavori, and Tsang 2015). The trial parameters are fixed as follows.

library(ASSISTant)
##Fix randomization vector N, errors, eps
trialParameters <- list(N = c(200, 340, 476), type1Error = 0.025,
                        eps = 1/2, type2Error = 0.1)

The design parameters are the following for various scenarios.

designParameters <- list(
    nul0 = list(prevalence = rep(1/6, 6), mean = matrix(0, 2, 6),
                sd = matrix(1, 2, 6)),
    alt1 = list(prevalence = rep(1/6, 6), mean = rbind(rep(0, 6),
                                                       c(0.5, 0.4, 0.3, 0, 0, 0)),
                sd = matrix(1, 2, 6)),
    alt2 = list(prevalence = rep(1/6, 6), mean = rbind(rep(0, 6),
                                                     c(0.5, 0.5, 0, 0, 0, 0)),
                sd = matrix(1,2, 6)),
    alt3 = list(prevalence = rep(1/6, 6), mean = rbind(rep(0, 6), rep(0.36, 6)),
                sd = matrix(1,2, 6)),
    alt4 = list(prevalence = rep(1/6, 6), mean = rbind(rep(0, 6), rep(0.30, 6)),
                sd = matrix(1,2, 6)),
    alt5 = list(prevalence = rep(1/6, 6), mean = rbind(rep(0, 6),
                                                       c(0.4, 0.3, 0.2, 0, 0, 0)),
                sd = matrix(1,2, 6)),
    alt6 = list(prevalence = rep(1/6, 6), mean = rbind(rep(0, 6),
                                                       c(0.5, 0.5, 0.3, 0.3, 0.1, 0.1)),
                sd = matrix(1,2, 6))
)

The NULL Scenario

defuse3 <- DEFUSE3Design$new(trialParameters = trialParameters,
                             numberOfSimulations = 500,
                             designParameters = designParameters$nul0,
                             showProgress = FALSE)
print(defuse3)
## Design Parameters:
##  Number of Groups: 6
##  Prevalence:
## 
##     Group1      Group2      Group3      Group4      Group5      Group6
## ----------  ----------  ----------  ----------  ----------  ----------
##  0.1666667   0.1666667   0.1666667   0.1666667   0.1666667   0.1666667
## 
##  Using Discrete Rankin scores? FALSE
## 
##  Normal Rankin Distribution means (null row, alt. row):
## 
## 
##         Group1   Group2   Group3   Group4   Group5   Group6
## -----  -------  -------  -------  -------  -------  -------
## Null         0        0        0        0        0        0
## Alt          0        0        0        0        0        0
## 
##  Normal Rankin Distribution SDs (null row, alt. row):
## 
## 
##         Group1   Group2   Group3   Group4   Group5   Group6
## -----  -------  -------  -------  -------  -------  -------
## Null         1        1        1        1        1        1
## Alt          1        1        1        1        1        1
## 
## Trial Parameters:
## List of 6
##  $ N                 : num [1:3] 200 340 476
##  $ type1Error        : num 0.025
##  $ eps               : num 0.5
##  $ type2Error        : num 0.1
##  $ effectSize        : num 0.104
##  $ originalEffectSize: num 0.0858
## 
## Boundaries:
## 
## 
##     btilde          b          c
## ----------  ---------  ---------
##  -1.885434   2.590764   2.758372
result <- defuse3$explore(numberOfSimulations = 500,
                          showProgress = FALSE,
                          rngSeed = 28912)
analysis <- defuse3$analyze(result)
print(defuse3$summary(analysis))
## P(Reject H0_ITT) = 0.002000; P(Reject H0_subgp) = 0.014000; P(Reject H0) = 0.016000
## P(Early stop for efficacy [futility]) = 0.008000 [0.662000]
## Mean [SD] Randomized N = 355.760000 [99.759743]
## 
## Stage at exit (proportion)
## 
## 
##  exitStage   proportion
## ----------  -----------
##          1        0.208
##          2        0.462
##          3        0.330
## 
## Mean [SD] Lost N = 131.356000 [66.434089]
## Mean [SD] Analyzed N = 224.404000 [84.921093]
## 
## Mean loss by futility stage and subgroup
## 
## 
##  FutilityStage   selectedGroup        mean          sd
## --------------  --------------  ----------  ----------
##              1               1   167.20359    4.986172
##              1               2   132.76471    6.999185
##              1               3    99.04082    6.304625
##              1               4    67.68750    5.735875
##              1               5    33.23636    5.319300
##              2               1   280.93333    7.362712
##              2               2   226.78947    6.827875
##              2               3   171.25000   11.804963
##              2               4   116.37500    8.309633
##              2               5    55.08000    5.589574
##              3               1   400.50000    7.187953
##              3               2   304.75000   18.300729
##              3               3   233.50000    7.368853
##              3               4   158.33333   10.016653
##              3               5    80.66667    7.679173
## 
## Chance of each subpopulation rejected
## 
## 
##  group   count   proportion
## ------  ------  -----------
##      1       2        0.004
##      2       2        0.004
##      3       2        0.004
##      4       1        0.002
##      6       1        0.002
## 
## Counts by futility stage and subgroup choice
## 
## 
##  FutilityStage    G1   G2   G3   G4   G5
## --------------  ----  ---  ---  ---  ---
##              1   167   68   49   48   55
##              2    15   19    8   16   25
##              3     4    4    6    3   12
## 
## CI Statistics:
## Overall coverage and coverage for rejections:
## 
##  overall   rejection
## --------  ----------
##    0.984           0
## 
## P(theta_test is in the confidence interval)
## 
## 
##   coverage   selectedCount   rejectedCount
## ----------  --------------  --------------
##  0.9892473             186               2
##  0.9780220              91               2
##  0.9682540              63               2
##  0.9850746              67               1
##  1.0000000              92               0
##  0.0000000               1               1
## NULL

The ALT1 Scenario

result1 <- defuse3$explore(numberOfSimulations = 500,
                           trueParameters = designParameters$alt1,
                           showProgress = FALSE,
                           rngSeed = 737218)
analysis1 <- defuse3$analyze(result1)
print(defuse3$summary(analysis1))
## P(Reject H0_ITT) = 0.284000; P(Reject H0_subgp) = 0.558000; P(Reject H0) = 0.842000
## P(Early stop for efficacy [futility]) = 0.436000 [0.018000]
## Mean [SD] Randomized N = 395.776000 [97.950203]
## 
## Stage at exit (proportion)
## 
## 
##  exitStage   proportion
## ----------  -----------
##          1        0.132
##          2        0.322
##          3        0.546
## 
## Mean [SD] Lost N = 135.228000 [109.645375]
## Mean [SD] Analyzed N = 260.548000 [102.724449]
## 
## Mean loss by futility stage and subgroup
## 
## 
##  FutilityStage   selectedGroup        mean          sd
## --------------  --------------  ----------  ----------
##              1               1   167.60417    4.569741
##              1               2   134.41176    7.912850
##              1               3   102.96875    5.474188
##              1               4    68.50000    3.728270
##              1               5    32.28571    3.352327
##              2               1   281.89474    5.404676
##              2               2   226.16667    9.318829
##              2               3   168.87879    8.513803
##              2               4   115.60000    7.604093
##              2               5    57.00000    7.958224
##              3               1   396.46154    6.678515
##              3               2   319.29630    7.700224
##              3               3   236.03125   11.188101
##              3               4   162.05556   10.032138
##              3               5    80.42105    8.408433
## 
## Chance of each subpopulation rejected
## 
## 
##  group   count   proportion
## ------  ------  -----------
##      1      69        0.138
##      2      72        0.144
##      3     105        0.210
##      4      23        0.046
##      5      10        0.020
##      6     142        0.284
## 
## Counts by futility stage and subgroup choice
## 
## 
##  FutilityStage   G1   G2   G3   G4   G5
## --------------  ---  ---  ---  ---  ---
##              1   48   34   32    6    7
##              2   19   24   33   10    4
##              3   13   27   64   18   19
## 
## CI Statistics:
## Overall coverage and coverage for rejections:
## 
##  overall   rejection
## --------  ----------
##    0.158           0
## 
## P(theta_test is in the confidence interval)
## 
## 
##   coverage   selectedCount   rejectedCount
## ----------  --------------  --------------
##  0.1375000              80              69
##  0.1529412              85              72
##  0.1860465             129             105
##  0.3235294              34              23
##  0.6666667              30              10
##  0.0000000             142             142
## NULL

The ALT2 Scenario

result2 <- defuse3$explore(numberOfSimulations = 500,
                           trueParameters = designParameters$alt2,
                           showProgress = FALSE,
                          rngSeed = 928812)
analysis2 <- defuse3$analyze(result2)
print(defuse3$summary(analysis2))
## P(Reject H0_ITT) = 0.226000; P(Reject H0_subgp) = 0.620000; P(Reject H0) = 0.846000
## P(Early stop for efficacy [futility]) = 0.438000 [0.014000]
## Mean [SD] Randomized N = 402.488000 [89.064712]
## 
## Stage at exit (proportion)
## 
## 
##  exitStage   proportion
## ----------  -----------
##          1        0.086
##          2        0.366
##          3        0.548
## 
## Mean [SD] Lost N = 165.346000 [118.444978]
## Mean [SD] Analyzed N = 237.142000 [103.804569]
## 
## Mean loss by futility stage and subgroup
## 
## 
##  FutilityStage   selectedGroup        mean          sd
## --------------  --------------  ----------  ----------
##              1               1   166.85294    5.105745
##              1               2   134.47674    6.722616
##              1               3   100.66667    9.232448
##              1               4    67.75000    4.267820
##              1               5    32.00000    2.943920
##              2               1   282.35294    4.872643
##              2               2   227.91935    8.218927
##              2               3   170.80000    7.450578
##              2               4   117.00000    6.164414
##              2               5    60.66667    8.386497
##              3               1   400.30769    8.606050
##              3               2   316.87368   10.026817
##              3               3   242.84211    7.581140
##              3               4   165.00000    8.194074
##              3               5    80.55556    5.052502
## 
## Chance of each subpopulation rejected
## 
## 
##  group   count   proportion
## ------  ------  -----------
##      1      54        0.108
##      2     216        0.432
##      3      27        0.054
##      4      11        0.022
##      5       2        0.004
##      6     113        0.226
## 
## Counts by futility stage and subgroup choice
## 
## 
##  FutilityStage   G1   G2   G3   G4   G5
## --------------  ---  ---  ---  ---  ---
##              1   34   86   15    8    4
##              2   17   62   10    4    3
##              3   13   95   19    8    9
## 
## CI Statistics:
## Overall coverage and coverage for rejections:
## 
##  overall   rejection
## --------  ----------
##    0.154           0
## 
## P(theta_test is in the confidence interval)
## 
## 
##   coverage   selectedCount   rejectedCount
## ----------  --------------  --------------
##  0.1562500              64              54
##  0.1111111             243             216
##  0.3863636              44              27
##  0.4500000              20              11
##  0.8750000              16               2
##  0.0000000             113             113
## NULL

Discrete Rankin Simulations

The Discretized Scenarios

The discretized scenarios are designed to generally mimic the trends above in the alternatives. However, we have a problem: we cannot simulatenously match the mean and sd of the alternatives above. (Actually, we can, but not with Rankin scores 0 through 6. The software can easily be modified to generate discrete values where the values are 0 to 6 divided by the standard deviation of the respective distribution, for example.)

Also in future versions, I need to allow for more general support values for the scores, not just 0 through 6. Easy to do, but not done yet.

Some types of distributions:

null.uniform <- rep(1, 7L) ## uniform on 7 support points
hourglass <- c(1, 2, 2, 1, 2, 2, 1)
inverted.hourglass <- c(2, 1, 1, 2, 1, 1, 2)
bottom.heavy <- c(2, 2, 2, 1, 1, 1, 1)
bottom.heavier <- c(3, 3, 2, 2, 1, 1, 1)
bottom.loaded <- c(4, 4, 3, 3, 2, 1, 1)
top.heavy <- c(1, 1, 1, 1, 2, 2, 2)
top.heavier <- c(1, 1, 1, 2, 2, 3, 3)
top.loaded <- c(1, 1, 2, 3, 3, 4, 4)

It is instructive to see what the means and standard deviations are.

knitr::kable(
           sapply(list(null = null.uniform,
                       hourglass = hourglass,
                       inv.hourglass = inverted.hourglass,
                       bot.heavy = bottom.heavy,
                       bot.heavier = bottom.heavier,
                       bot.loaded = bottom.loaded,
                       top.heavy = top.heavy,
                       top.heavier = top.heavier,
                       top.loaded = top.loaded),
                  computeMeanAndSD)
       )
null hourglass inv.hourglass bot.heavy bot.heavier bot.loaded top.heavy top.heavier top.loaded
mean 3 3.000000 3.000000 2.400000 2.153846 2.111111 3.600000 3.846154 3.888889
sd 2 1.858641 2.144761 1.959592 1.874778 1.760331 1.959592 1.874778 1.760331

With this in mind, we can reel off some runs. Phil, you mentioned you wanted \(J = 2\), which I adhere to, below.

designParameters <- list(
    nul0 = list(prevalence = rep(1, 2),
                ctlDist = null.uniform,
                trtDist = cbind(null.uniform,
                                null.uniform)),
    alt1 = list(prevalence = rep(1, 2), 
                ctlDist = null.uniform,
                trtDist = cbind(top.loaded,
                                null.uniform)),
    alt2 = list(prevalence = rep(1, 2), 
                ctlDist = null.uniform,
                trtDist = cbind(null.uniform,
                                top.loaded))
)

The NULL Scenario

discDefuse3 <- DEFUSE3Design$new(trialParameters = trialParameters,
                                 numberOfSimulations = 5000,
                                 discreteData = TRUE,
                                 designParameters = designParameters$nul0,
                                 showProgress = FALSE)
print(discDefuse3)
## Design Parameters:
##  Number of Groups: 2
##  Prevalence:
## 
##  Group1   Group2
## -------  -------
##     0.5      0.5
## 
##  Using Discrete Rankin scores? TRUE
## 
##  Null Rankin Distribution:
## 
##           Prob.
## ---  ----------
## 0     0.1428571
## 1     0.1428571
## 2     0.1428571
## 3     0.1428571
## 4     0.1428571
## 5     0.1428571
## 6     0.1428571
##  Null Distribution Mean: 3.000000, SD: 2.000000
## 
##  Alternative Rankin Distribution:
## 
## 
##          Group1      Group2
## ---  ----------  ----------
## 0     0.1428571   0.1428571
## 1     0.1428571   0.1428571
## 2     0.1428571   0.1428571
## 3     0.1428571   0.1428571
## 4     0.1428571   0.1428571
## 5     0.1428571   0.1428571
## 6     0.1428571   0.1428571
##  Alternative Mean and SD
## 
##         Group1   Group2
## -----  -------  -------
## mean         3        3
## sd           2        2
## 
## Trial Parameters:
## List of 6
##  $ N                 : num [1:3] 200 340 476
##  $ type1Error        : num 0.025
##  $ eps               : num 0.5
##  $ type2Error        : num 0.1
##  $ effectSize        : num 0.106
##  $ originalEffectSize: num 0.0858
## 
## Boundaries:
## 
## 
##     btilde         b          c
## ----------  --------  ---------
##  -1.875887   2.48671   2.467753
result <- discDefuse3$explore(numberOfSimulations = 50,
                              showProgress = FALSE,
                              rngSeed = 3783)
analysis <- discDefuse3$analyze(result)
print(discDefuse3$summary(analysis))
## P(Reject H0_ITT) = 0.000000; P(Reject H0_subgp) = 0.020000; P(Reject H0) = 0.020000
## P(Early stop for efficacy [futility]) = 0.000000 [0.800000]
## Mean [SD] Randomized N = 305.600000 [106.616995]
## 
## Stage at exit (proportion)
## 
## 
##  exitStage   proportion
## ----------  -----------
##          1         0.44
##          2         0.36
##          3         0.20
## 
## Mean [SD] Lost N = 116.780000 [38.398709]
## Mean [SD] Analyzed N = 188.820000 [86.822054]
## 
## Mean loss by futility stage and subgroup
## 
## 
##  FutilityStage   selectedGroup       mean         sd
## --------------  --------------  ---------  ---------
##              1               1    99.5000   7.452413
##              2               1   165.4286   9.589180
##              3               1   233.6667   4.041452
## 
## Chance of each subpopulation rejected
## 
## 
##  group   count   proportion
## ------  ------  -----------
##      1       1         0.02
## 
## Counts by futility stage and subgroup choice
## 
## 
##  FutilityStage   G1
## --------------  ---
##              1   40
##              2    7
##              3    3
## 
## CI Statistics:
## Overall coverage and coverage for rejections:
## 
##  overall   rejection
## --------  ----------
##        1           1
## 
## P(theta_test is in the confidence interval)
## 
## 
##  coverage   selectedCount   rejectedCount
## ---------  --------------  --------------
##         1              50               1
## NULL

The ALT1 Scenario

result1 <- discDefuse3$explore(numberOfSimulations = 50,
                               trueParameters = designParameters$alt1,
                               showProgress = FALSE,
                               rngSeed = 28912)
analysis1 <- discDefuse3$analyze(result1)
print(discDefuse3$summary(analysis1))
## P(Reject H0_ITT) = 0.520000; P(Reject H0_subgp) = 0.400000; P(Reject H0) = 0.920000
## P(Early stop for efficacy [futility]) = 0.560000 [0.000000]
## Mean [SD] Randomized N = 374.640000 [103.343643]
## 
## Stage at exit (proportion)
## 
## 
##  exitStage   proportion
## ----------  -----------
##          1         0.18
##          2         0.38
##          3         0.44
## 
## Mean [SD] Lost N = 83.040000 [97.380164]
## Mean [SD] Analyzed N = 291.600000 [89.833860]
## 
## Mean loss by futility stage and subgroup
## 
## 
##  FutilityStage   selectedGroup       mean          sd
## --------------  --------------  ---------  ----------
##              1               1   100.5556    9.951270
##              2               1   169.2500    9.673848
##              3               1   233.6364   15.298841
## 
## Chance of each subpopulation rejected
## 
## 
##  group   count   proportion
## ------  ------  -----------
##      1      20         0.40
##      2      26         0.52
## 
## Counts by futility stage and subgroup choice
## 
## 
##  FutilityStage   G1
## --------------  ---
##              1    9
##              2    4
##              3   11
## 
## CI Statistics:
## Overall coverage and coverage for rejections:
## 
##  overall   rejection
## --------  ----------
##        1           1
## 
## P(theta_test is in the confidence interval)
## 
## 
##  coverage   selectedCount   rejectedCount
## ---------  --------------  --------------
##         1              24              20
##         1              26              26
## NULL

The ALT2 Scenario

result2 <- discDefuse3$explore(numberOfSimulations = 50,
                               trueParameters = designParameters$alt2,
                               showProgress = FALSE,
                               rngSeed = 931)
analysis2 <- discDefuse3$analyze(result2)
print(discDefuse3$summary(analysis2))
## P(Reject H0_ITT) = 0.560000; P(Reject H0_subgp) = 0.000000; P(Reject H0) = 0.560000
## P(Early stop for efficacy [futility]) = 0.380000 [0.340000]
## Mean [SD] Randomized N = 336.080000 [106.155035]
## 
## Stage at exit (proportion)
## 
## 
##  exitStage   proportion
## ----------  -----------
##          1         0.30
##          2         0.42
##          3         0.28
## 
## Mean [SD] Lost N = 68.340000 [86.598442]
## Mean [SD] Analyzed N = 267.740000 [129.424757]
## 
## Mean loss by futility stage and subgroup
## 
## 
##  FutilityStage   selectedGroup    mean         sd
## --------------  --------------  ------  ---------
##              1               1   100.8   8.011103
##              2               1   171.0   5.567764
##              3               1   242.4   5.856620
## 
## Chance of each subpopulation rejected
## 
## 
##  group   count   proportion
## ------  ------  -----------
##      2      28         0.56
## 
## Counts by futility stage and subgroup choice
## 
## 
##  FutilityStage   G1
## --------------  ---
##              1   10
##              2    7
##              3    5
## 
## CI Statistics:
## Overall coverage and coverage for rejections:
## 
##  overall   rejection
## --------  ----------
##        1           1
## 
## P(theta_test is in the confidence interval)
## 
## 
##  coverage   selectedCount   rejectedCount
## ---------  --------------  --------------
##         1              22               0
##         1              28              28
## NULL

References

Lai, Tze Leung, Philip W. Lavori, and Olivia Yueh-Wen Liao. 2014. “Adaptive Choice of Patient Subgroup for Comparing Two Treatments.” Contemporary Clinical Trials 39 (2): 191–200. doi:10.1016/j.cct.2014.09.001.

Lai, Tze Leung, Philip W. Lavori, and Ka Wai Tsang. 2015. “Adaptive Design of Confirmatory Trials: Advances and Challenges.” Contemporary Clinical Trials 45, Part A: 93–102. doi:10.1016/j.cct.2015.06.007.