The hardware and bandwidth for this mirror is donated by METANET, the Webhosting and Full Service-Cloud Provider.
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[@]metanet.ch.

Time-to-event outcome variables

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 introduction, the observed outcome variable “tumor growth” was normally distributed. However, the drugdevelopR package is not only restricted to normally distributed outcome variables but also binary distributed outcome variables and a time-to-event outcome variables. In this article we want explain how the setting with time-to-event variables works.

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.

Within our drug development program, we will compare our experimental treatment exper to the control treatment contro. The treatment effect measure is given by \(\theta = −\log(HR)\), which is the negative logarithm of the hazard ratio \(HR\), which in turn is the ratio of the hazard rates. The hazard ratio is a little difficult to understand. A hazard ratio of 0.75 would mean that the momentary rate of experiencing (the “hazard”) at any point in time is reduced by 75% in the experimental group.

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

In order to apply the package to the setting from our example, we need to specify the following parameters:

As in the setting with normally distributed outcomes, the treatment effect may be fixed (as in this example) or may be distributed with respect to a prior distribution. Furthermore, all options to adapt the program to your specific needs are also available in this setting.

Now that we have defined all parameters needed for our example, we are ready to feed them to the package. We will use the function optimal_tte(), which calculates the optimal sample size and the optimal threshold value for a time-to-event outcome variable.

res <- optimal_tte(w = 0.3,                               # define parameters for prior
   hr1 = 0.75, hr2 = 0.8, id1 = 210, id2 = 420,           # (https://web.imbi.uni-heidelberg.de/prior/)
   d2min = 20, d2max = 400, stepd2 = 5,                   # define optimization set for d2
   hrgomin = 0.7, hrgomax = 0.9, stephrgo = 0.01,         # define optimization set for HRgo
   alpha = 0.025, beta = 0.1, xi2 = 0.7, xi3 = 0.7,        # drug development planning parameters
   c2 = 0.75, c3 = 1, c02 = 100, c03 = 150,               # define fixed and variable costs
   K = Inf, N = Inf, S = -Inf,                            # set constraints
   steps1 = 1,  stepm1 = 0.95, stepl1 = 0.85,             # define boundary for  effect size categories
   b1 = 1000, b2 = 2000, b3 = 3000,                       # define expected benefits
   gamma = 0,                                             # assume different/same population structures 
   fixed = TRUE,                                          # choose if  effects are fixed or random
   skipII = FALSE,                                        # more parameters
   num_cl = 1)

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:
#>  Utility: 377.1
#>  Sample size:
#>    phase II: 236, phase III: 614, total: 850
#>  Expected number of events:
#>    phase II: 165, phase III: 430, total: 595
#>  Assumed event rate:
#>    phase II: 0.7, phase III: 0.7
#>  Probability to go to phase III: 0.81
#>  Total cost:
#>    phase II: 277, phase III: 736, 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.62
#>  Success probability by effect size:
#>    small: 0.09, medium: 0.29, large: 0.24
#>  Significance level: 0.025
#>  Targeted power: 0.9
#>  Decision rule threshold: 0.86 [HRgo] 
#>  Assumed true effect: 0.75 [hr] 
#>  Treatment effect offset between phase II and III: 0 [gamma]

The program returns a total of sixteen output values and the input parameters. For now, we will only look at the most important ones:

Where to go from here

In this article we introduced the setting, when the outcome is a time-to-event variable. 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.