Multiarm - methods for multi-arm programs

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)

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.

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

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:

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

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:

mirror server hosted at Truenetwork, Russian Federation.