Skip to contents

Suppose we are planning a drug development program testing the superiority of an experimental treatment over a control treatment. Our drug development program consists of an exploratory phase II trial which is, in case of promising results, followed by a confirmatory phase III trial.

The drugdevelopR package enables us to optimally plan such programs using a utility-maximizing approach. To get a brief introduction, we presented a very basic example on how the package works in Introduction to planning phase II and phase III trials with drugdevelopR. In the basic setting, only one phase II and one phase III trial were conducted. Contrary to this, we now investigate what happens when multi-arm trials are conducted, where several different treatments or several doses of the same treatment are tested at the same time. The drugdevelopR package enables multi-arm program with two treatment arms and one control arm.

The example setting

Suppose we are developing a new tumor treatment, exper. The patient variable that we want to investigate is how long the patient survives without further progression of the tumor (progression-free survival). This is a time-to-event outcome variable. We want to test two different doses of, exper1 and exper2. Therefore, we will use the function optimal_multiarm, which calculates optimal sample sizes and threshold decisions values for time-to-event outcomes when multi-arm trials are conducted.

Within our drug development program, we will compare our two experimental treatments exper1 and exper2 to the control treatment contro. The treatment effect measure is given by \(\theta = −\log(HR)\), where the hazard ratio \(HR\) is the ratio of hazards of each treatment and the control.

Applying the package to the example

After installing the package according to the installation instructions, we can load it using the following code:

library(drugdevelopR)
#> Loading required package: doParallel
#> Loading required package: foreach
#> Loading required package: iterators
#> Loading required package: parallel

Defining all necessary parameters

As, the parameters in the multi-arm setting differ slightly from the other cases (bias adjustment and multitrial), we will explain them in more detail. Contrary to the basic setting, the treatment effect are always assumed to be fixed, so the option to use prior distributions is not available. Nevertheless, some options to adapt the program to your specific needs are also available in this setting (see More parameters), however, skipping phase II and choosing different treatment effects in phase II and III are not possible.

The following parameters are different to the basic setting, even if the names are the same.

  • hr1 is our hazard ratio for the first dose exper1. As already explained above, we assume that our experimental treatment exper1 leads to unfavorable events occurring only 75% of times compared to the control treatment contro. Therefore, we set hr1 = 0.75. Analogously, hr2 is the hazard ratio for our second dose exper2. For our example, we set hr2 = 0.8.
  • ec is the control arm event rate for phase II and III, how often the unfavorable event occurs in the control group. We assume that 60% of patients in the group contro have an unfavorable event, thus, we set ec = 0.6.
  • n2min and n2max specify the minimal and maximal number of participants for the phase II trial. The package will search for the optimal sample size within this region. For now, we want the program to search for the optimal sample size in the interval between 20 and 400 participants. In addition, we will tell the program to search this region in steps of ten participants at a time by setting stepn2 = 10. This is different to optimal_tte, where the region of events (and not the sample size region) is searched.

One parameter that is not in the basic setting is the following parameter:

  • The parameter strategy allows the user to choose between three strategies. One can select strategy = 1 in which only the best promising candidate of the two doses proceeds to phase III, strategy = 2 in which all promising candidates proceed to phase III or strategy = 3, in which both strategies are explored. For our example we want to explore both settings, so we use strategy = 3.

The other parameters are identical to the basic setting. Let’s plug them into the function:

res <- optimal_multiarm(hr1 = 0.75, hr2 = 0.80, ec = 0.6, # define assumed true HRs and control arm event rate
   n2min = 100, n2max = 200, stepn2 = 10,                 # define optimization set for n2
   hrgomin = 0.76, hrgomax = 0.9, stephrgo = 0.02,        # define optimization set for HRgo
   alpha = 0.025, beta = 0.1,                             # drug development planning parameters
   c2 = 0.75, c3 = 1, c02 = 100, c03 = 150,               # define fixed and variable costs for phase II and III
   b1 = 1000, b2 = 2000, b3 = 3000,                       # gains for each effect size category
   strategy = 3,                                          
   num_cl = 3)

Interpreting the output

After setting all these input parameters and running the function, let’s take a look at the output of the program.

res
#> Optimization result where only the most promising candidate continues:
#>  Utility: 66.88
#>  Sample size:
#>    phase II: 140, phase III: 393, total: 533
#>  Probability to go to phase III: 0.75
#>  Total cost:
#>    phase II: 205, phase III: 505, cost constraint: Inf
#>  Fixed cost:
#>    phase II: 100, phase III: 150
#>  Variable cost per patient:
#>    phase II: 0.75, phase III: 1
#>  Effect size categories (expected gains):
#>   small: 1 (1000), medium: 0.95 (2000), large: 0.85 (3000)
#>  Success probability: 0.38
#>  Success probability for a trial with:
#>    two arms in phase III: 0.38, three arms in phase III: 0
#>  Significance level: 0.025
#>  Targeted power: 0.9
#>  Decision rule threshold: 0.82 [HRgo] 
#>  Assumed true effects [HR]: 
#>    treatment 1: 0.75,  treatment 2: 0.8
#>  Control arm event rate: 0.6
#> 
#> Optimization result where all promising candidates continue:
#>  Utility: 56.6
#>  Sample size:
#>    phase II: 100, phase III: 481, total: 581
#>  Probability to go to phase III: 0.68
#>  Total cost:
#>    phase II: 175, phase III: 583, cost constraint: Inf
#>  Fixed cost:
#>    phase II: 100, phase III: 150
#>  Variable cost per patient:
#>    phase II: 0.75, phase III: 1
#>  Effect size categories (expected gains):
#>   small: 1 (1000), medium: 0.95 (2000), large: 0.85 (3000)
#>  Success probability: 0.4
#>  Success probability for a trial with:
#>    two arms in phase III: 0.18, three arms in phase III: 0.22
#>  Significance level: 0.025
#>  Targeted power: 0.9
#>  Decision rule threshold: 0.78 [HRgo] 
#>  Assumed true effects [HR]: 
#>    treatment 1: 0.75,  treatment 2: 0.8
#>  Control arm event rate: 0.6

The program returns a data frame, where the output for all implemented strategies is listed. For strategy 1 (only the best promising proceeds to phase III) we get:

  • res[1,]$n2 is the optimal number of participants for phase II and res$n3 the resulting number of events for phase III. We see that the optimal scenario requires 140 participants in phase II and 393 participants in phase III.
  • res[1,]$HRgo is the optimal threshold value for the go/no-go decision rule. We see that we need a hazard ratio of less than 0.82 in phase II in order to proceed to phase III.
  • res[1,]$u is the expected utility of the program for the optimal sample size and threshold value. In our case it amounts to 66.88, i.e. we have an expected utility of 6 688 000$.

The results for strategy 2 (all promising proceed to phase III) are:

  • res[2,]$n2 is the optimal number of participants for phase II and res$n3 the resulting number of events for phase III. We see that the optimal scenario requires 100 participants in phase II and 481 participants in phase III.
  • res[2,]$HRgo is the optimal threshold value for the go/no-go decision rule. We see that we need a hazard ratio of less than 0.78 in phase II in order to proceed to phase III.
  • res[2,]$u is the expected utility of the program for the optimal sample size and threshold value. In our case it amounts to 56.6, i.e. we have an expected utility of 5 660 000$.

Furthermore, consider the return values sProg, sProg2 and sProg3. Contrary to the basic setting, sProg2 is the probability of a successful program with only one treatment in phase III (i.e. two arms) and sProg3 is the probability of a successful program with two treatments in phase III (i.e. three arms). Hence, for strategy 1 (only the most promising treatment in phase II proceeds to phase III) sProg = sProg2 = 0.38. With strategy 2 (all promising treatments proceed to phase III), the success probability sProg is the sum of the probability that both treatments go to phase III sProg3 = 0.22 and the probability that only one treatment proceeds to phase III sProg2 = 0.18.

Where to go from here

In this article, we presented an example where multi-arm trials are conducted. Note that this example is not restricted to time-to-event endpoints but can also be applied to binary and normally distributed endpoints by using the functions optimal_multiarm_binary and optimal_multiarm_normal.

For more information on how to use the package, see: