The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

Multiple - methods for trials with multiple endpoints

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. Contrary to the basic setting, where only one phase II and one phase III trial were conducted, in this scenario we investigate what happens when multiple endpoints are of interest. The functions currently implemented only allow for the conduction of trials with up to two different endpoints. The drugdevelopR package enables programs where only one endpoints has to show a significant positive treatment effect or all endpoints have to show a significant positive treatment effect.

After installing the package according to the installation instructions, we can load it using the following code, and start right into the two examples:

library(drugdevelopR)

Only one endpoint has to be significant

Suppose we are developing a new tumor treatment, exper. The two endpoints we consider interesting are overall survival (OS) and progression-free survival (PFS). These are time-to-event outcome variables. Therefore, we will use the function optimal_multiple_tte, which calculates optimal sample sizes and threshold decisions values for time-to-event outcomes when multiple endpoints are investigated.

Within our drug development program, we will compare our experimental treatment to the control treatment contro. The treatment effect measure of exper for each endpoint \(i \in \{1,2\}\) is given by \(\theta_i = −\log(HR_i)\), where the hazard ratio \(HR_i\) is the ratio of the hazard rates between the experimental treatment and the control treatment, for each endpoint. For more information on the hazard ratio, see the vignette on time-to-event endpoints.

Defining all necessary parameters

The parameters in the setting with multiple endpoints differ slightly from the other cases (bias adjustment and multitrial). As in the basic setting, the treatment effect may be fixed (as in this example) or may follow a prior distribution (see Fixed or Prior) Note that in this case, contrary to the other settings, the second treatment effect describes the effect of the second endpoint and is also relevant for fixed = TRUE. Furthermore, 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.

set.seed(123)
res1 <- optimal_multiple_tte(hr1 = 0.8, hr2 = 0.75,                   # define assumed true HRs
                    id1 = NULL, id2 = NULL,
                    n2min = 20, n2max = 400, stepn2 = 10,             # define optimization set for n2
                    hrgomin = 0.7, hrgomax = 0.9, stephrgo = 0.05,    # 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 costs for phase II and III
                    K = Inf, N = Inf, S = -Inf,                       # set constraints
                    steps1 = 1,  stepm1 = 0.95,  stepl1 = 0.85,       # effect size categories
                    b11 = 1000, b21 = 2000, b31 = 3000,
                    b12 = 1000, b22 = 1500, b32 = 2000,               # define expected benefits (both categories)
                    rho = 0.6, fixed = TRUE,                          # correlation and treatment effect
                    num_cl = 2)

Interpreting the output

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

res1
#> Optimization result:
#>  Utility: 106.61
#>  Sample size:
#>    phase II: 90, phase III: 301, total: 391
#>  Probability to go to phase III: 0.79
#>  Total cost:
#>    phase II: 168, phase III: 420, 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:
#>   small: 1 medium: 0.95 large: 0.85
#>  Expected gains if endpoint 1 is significant:
#>   small: 1000 medium: 2000 large: 3000
#>  Expected gains if only endpoint 2 is significant:
#>   small: 1000 medium: 1500 large: 2000
#>  Success probability: 0.4
#>  Success probability for a trial with:
#>    two arms in phase III: 0.21, three arms in phase III: 0.07
#>  Probability of endpoint 1 being significant in phase III: 0.71
#>  Significance level: 0.025
#>  Targeted power: 0.9
#>  Decision rule threshold: 0.85 [HRgo] 
#>  Assumed true effects [HR]: 
#>    endpoint 1: 0.8,  endpoint2 2: 0.75
#>  Correlation between endpoints: 0.6

The program returns a data frame, with the following results:

Both endpoints have to be significant

In this scenario, suppose we are developing a new Alzheimer medication, exper. The two endpoints we consider interesting are improving cognition (cognitive endpoint) and improving activities of daily living (functional endpoint). We want both outcomes to be show statistically significant differences for the trial to be successful. These are normally distributed outcome variables. Therefore, we will use the function optimal_multiple_normal, which calculates optimal sample sizes and threshold decisions values for normally distributed outcomes when multiple endpoints are investigated.

Within our drug development program, we will compare our experimental treatment to the control treatment contro. The treatment effect measure of exper for each endpoint \(i \in \{1,2\}\) is given by \(\Delta_i = \mu_{exper} - \mu_{contro}\), which is the difference in mean between the experimental treatment and the control treatment, for both endpoints. Note that this is not divided by the standard deviation, hence is it not standardized. For more information, see the vignette on normally distributed outcomes.

Defining all necessary parameters

Again, the parameters in the setting with multiple endpoints differ slightly from the other cases (bias adjustment and multitrial). As in the basic setting, the treatment effect may be fixed (as in this example) or may follow a prior distribution (see Fixed or Prior) Note, that in this case, contrary to the other settings, the second treatment effect describes the effect of the second endpoint and is also relevant for fixed = TRUE. Furthermore, 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.

set.seed(123)
res2 <- optimal_multiple_normal(Delta1 = 0.8, Delta2 = 0.5,  # define assumed true treatment effects
   in1= NULL, in2= NULL, sigma1 = 2, sigma2= 1,              # standard deviations
   n2min = 20, n2max = 200, stepn2 = 10,                     # define optimization set for n2
   kappamin = 0.02, kappamax = 0.2, stepkappa = 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
   K = Inf, N = Inf, S = -Inf,                               # set constraints
   steps1 = 0,  stepm1 = 0.5, stepl1 = 0.8,                  # benefit categories
   b1 = 1000, b2 = 2000, b3 = 3000,                          # define expected benefits 
   rho = 0.5, relaxed = TRUE,                                # relaxed "TRUE"
   fixed = TRUE,                                             # fixed treatment effect 
   num_cl = 2)

Interpreting the output

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

res2
#> Optimization result:
#>  Utility: 342.07
#>  Sample size:
#>    phase II: 120, phase III: 171, total: 291
#>  Probability to go to phase III: 0.98
#>  Total cost:
#>    phase II: 190, phase III: 318, 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: 0 (1000), medium: 0.5 (2000), large: 0.8 (3000)
#>  Success probability: 0.824
#>  Success probability by effect size:
#>    small: 0.798, medium: 0.026, large: 0
#>  Significance level: 0.025
#>  Targeted power: 0.9
#>  Decision rule threshold: 0.02 [Kappa] 
#>  Assumed true effects [Delta]: 
#>    endpoint 1: 0.8, endpoint 2: 0.5
#>  Correlation between endpoints: 0.5

The program returns a data frame, with the following results:

Where to go from here

In this article we presented examples when multiple endpoints are of interest.

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

These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.