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.
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. However, there are many more parameters, which you can provide to adapt the program to your specific needs. In this article, we therefore want to present the options you have.
We are in the same setting as in the introduction, i.e. we suppose we are developing a new tumor treatment, exper. The patient variable that we want to investigate is the difference in tumor width between the one-year visit and baseline. This is a normally distributed outcome variable.
The parameters we insert into the function
optimum_normal
are the same parameters we also inserted in
the basic setting. Thus, for more information on the input values we
refer to the introduction.
We start by loading the drugdevelopR package.
Back then, we got the following output:
res
#> Optimization result:
#> Utility: 2946.07
#> Sample size:
#> phase II: 92, phase III: 192, total: 284
#> Probability to go to phase III: 1
#> Total cost:
#> phase II: 77, phase III: 158, cost constraint: Inf
#> Fixed cost:
#> phase II: 15, phase III: 20
#> Variable cost per patient:
#> phase II: 0.675, phase III: 0.72
#> Effect size categories (expected gains):
#> small: 0 (3000), medium: 0.5 (8000), large: 0.8 (10000)
#> Success probability: 0.85
#> Success probability by effect size:
#> small: 0.72, medium: 0.12, large: 0
#> Significance level: 0.025
#> Targeted power: 0.9
#> Decision rule threshold: 0.06 [Kappa]
#> Assumed true effect: 0.625 [Delta]
#> Treatment effect offset between phase II and III: 0 [gamma]
We now want to see how different modifications, i.e. using more parameters change the outcome of the program.
Setting the parameter fixed
to be FALSE
models the assumed true treatment effect using a prior distribution.
This is explained in detail in the article Fixed
effect estimates and prior distributions.
The are three options how to include constrained optimization, by setting maximum cost limits, by setting a maximum number of participants or by demanding a minimum probability of a successful program. These options can be applied separately or combined, as it is best suited to your specific needs.
The total costs are given as sum of the cost in phase II and phase
III, i.e. as \(K2\) + \(K3\). In our example we get total costs of
\(72+139=211\) (in 10^5 $). Let’s
assume an investor in your drug or a pharmaceutical company is only
willing to pay 20,000,000 $. You can now set a maximum cost constraint
by providing an parameter value of K = 200
into the
optimum_normal
function. The default value for
K
is Inf
.
resK <- optimal_normal(Delta1 = 0.625, fixed = TRUE, # treatment effect
n2min = 20, n2max = 400, # sample size region
stepn2 = 4, # sample size step size
kappamin = 0.02, kappamax = 0.2, # threshold region
stepkappa = 0.02, # threshold step size
c2 = 0.675, c3 = 0.72, # maximal total trial costs
c02 = 15, c03 = 20, # maximal per-patient costs
b1 = 3000, b2 = 8000, b3 = 10000, # gains for patients
alpha = 0.025, # one-sided significance level
beta = 0.1, # 1 - power
Delta2 = NULL, w = NULL, in1 = NULL, in2 = NULL,
a = NULL,b = NULL, # setting all unneeded parameters to NULL
K = 200 # cost constraint
)
We get the following results:
resK
#> Optimization result:
#> Utility: 2846.69
#> Sample size:
#> phase II: 76, phase III: 158, total: 234
#> Probability to go to phase III: 0.97
#> Total cost:
#> phase II: 66, phase III: 133, cost constraint: 200
#> Fixed cost:
#> phase II: 15, phase III: 20
#> Variable cost per patient:
#> phase II: 0.675, phase III: 0.72
#> Effect size categories (expected gains):
#> small: 0 (3000), medium: 0.5 (8000), large: 0.8 (10000)
#> Success probability: 0.82
#> Success probability by effect size:
#> small: 0.7, medium: 0.11, large: 0
#> Significance level: 0.025
#> Targeted power: 0.9
#> Decision rule threshold: 0.18 [Kappa]
#> Assumed true effect: 0.625 [Delta]
#> Treatment effect offset between phase II and III: 0 [gamma]
We see that due to the cost constraint the cost in phase II decreases from 77 to 66 and the cost in phase III decreases from 158 to 133, so overall the constraint is met. Moreover, the expected utility at the optimum decreases from 294 607 000 to 284 669 000 dollars.
Very similarly to the cost constraint, we can set a constraint on the
maximum number of participants in our trial. Without constraints, we
need a total number of 250 participants in the optimum. However, one can
certainly imagine a situation, where the only 200 persons willing to
participate in a trial, for example because the incidence of the illness
is not very high within the target population. To model this, we can
easily set a sample size constraint, in this case of
N = 200
. This allows for an optimal allocation of the
participants between phase II and III. The default value for
N
is Inf
.
resN <- optimal_normal(Delta1 = 0.625, fixed = TRUE, # treatment effect
n2min = 20, n2max = 400, # sample size region
stepn2 = 4, # sample size step size
kappamin = 0.02, kappamax = 0.2, # threshold region
stepkappa = 0.02, # threshold step size
c2 = 0.675, c3 = 0.72, # maximal total trial costs
c02 = 15, c03 = 20, # maximal per-patient costs
b1 = 3000, b2 = 8000, b3 = 10000, # gains for patients
alpha = 0.025, # significance level
beta = 0.1, # 1 - power
Delta2 = NULL, w = NULL, in1 = NULL, in2 = NULL,
a = NULL,b = NULL, # setting all unneeded parameters to NULL
N = 200 # sample size constraint
)
We get the following results:
resN
#> Optimization result:
#> Utility: 2658.9
#> Sample size:
#> phase II: 48, phase III: 150, total: 198
#> Probability to go to phase III: 0.93
#> Total cost:
#> phase II: 47, phase III: 127, cost constraint: Inf
#> Fixed cost:
#> phase II: 15, phase III: 20
#> Variable cost per patient:
#> phase II: 0.675, phase III: 0.72
#> Effect size categories (expected gains):
#> small: 0 (3000), medium: 0.5 (8000), large: 0.8 (10000)
#> Success probability: 0.76
#> Success probability by effect size:
#> small: 0.65, medium: 0.11, large: 0
#> Significance level: 0.025
#> Targeted power: 0.9
#> Decision rule threshold: 0.2 [Kappa]
#> Assumed true effect: 0.625 [Delta]
#> Treatment effect offset between phase II and III: 0 [gamma]
Due to our sample size constraint to optimal number of participants in phase II is 48 and 150 in phase III (down from 92 and 192 respectively) within this framework. The expected utility in the optimum decreases to 265 890 000$.
The last option provided for constraint optimization is the minimum
probability of a successful program. In our basic setting without
constraints, we had a probability that the program was successful of
0.85, i.e. we had a probability of 0.85 that the program would proceed
from phase II to phase III and that a positive treatment effect could be
detected in phase III. Let’s say, you are willing to have higher costs
and in return want this probability to be 0.87. You can include this
within the framework, by including the parameter S
and by
setting it to S = 0.87
. The default value for
S
is -Inf
.
resS <- optimal_normal(Delta1 = 0.625, fixed = TRUE, # treatment effect
n2min = 20, n2max = 400, # sample size region
stepn2 = 4, # sample size step size
kappamin = 0.02, kappamax = 0.2, # threshold region
stepkappa = 0.02, # threshold step size
c2 = 0.675, c3 = 0.72, # maximal total trial costs
c02 = 15, c03 = 20, # maximal per-patient costs
b1 = 3000, b2 = 8000, b3 = 10000, # gains for patients
alpha = 0.025, # significance level
beta = 0.1, # 1 - power
Delta2 = NULL, w = NULL, in1 = NULL, in2 = NULL,
a = NULL,b = NULL, # setting all unneeded parameters to NULL
S = 0.87 #minimum success probability
)
We get the following results:
resS
#> Optimization result:
#> Utility: 2906.94
#> Sample size:
#> phase II: 172, phase III: 138, total: 310
#> Probability to go to phase III: 1
#> Total cost:
#> phase II: 131, phase III: 119, cost constraint: Inf
#> Fixed cost:
#> phase II: 15, phase III: 20
#> Variable cost per patient:
#> phase II: 0.675, phase III: 0.72
#> Effect size categories (expected gains):
#> small: 0 (3000), medium: 0.5 (8000), large: 0.8 (10000)
#> Success probability: 0.87
#> Success probability by effect size:
#> small: 0.76, medium: 0.11, large: 0
#> Significance level: 0.025
#> Targeted power: 0.9
#> Decision rule threshold: 0.06 [Kappa]
#> Assumed true effect: 0.625 [Delta]
#> Treatment effect offset between phase II and III: 0 [gamma]
The probability of a successful program now increased from 0.85 to 0.87, mainly by increasing the number of participants in phase II. The expected utility decreased to 290 694 000 $.
Up until now, the effect size categories for a small, medium or large
treatment effect were predefined and set to \(0-0.5\) for a small treatment effect, \(0.5-0.8\) for a medium treatment effect and
\(\geq 0.8\) for a large treatment
effect (each in standardized differences in mean). These parameter
values were taken from Cohen (1988). However, one can easily customize
the effect size categories by inserting threshold values for each effect
size. Let’s say you only consider a program successful if the treatment
effect is above 0.1. Furthermore, you want to assign a medium benefit if
the treatment effect is between 0.6 and 1 and a large benefit if the
treatment effect is above 1. Note that there is a one-to-one relation
between effect size categories and benefit categories, i.e. the large
treatment effect corresponds to the large benefit and so on. If you want
to implement this scenario you can do this by defining the parameters
steps1
, stepm1
and stepl1
. Here,
we set them to steps1 = 0.1
, stepm1 = 0.6
and
stepl1 = 1
.
res <- optimal_normal(Delta1 = 0.625, fixed = TRUE, # treatment effect
n2min = 20, n2max = 400, # sample size region
stepn2 = 4, # sample size step size
kappamin = 0.02, kappamax = 0.2, # threshold region
stepkappa = 0.02, # threshold step size
c2 = 0.675, c3 = 0.72, # maximal total trial costs
c02 = 15, c03 = 20, # maximal per-patient costs
b1 = 3000, b2 = 8000, b3 = 10000, # gains for patients
alpha = 0.025, # significance level
beta = 0.1, # 1 - power
Delta2 = NULL, w = NULL, in1 = NULL, in2 = NULL,
a = NULL,b = NULL, # setting all unneeded parameters to NULL
steps1 = 0.1, stepm1 = 0.6, stepl1 = 1 # step sizes for effect size categories
)
Due to different population structures in phase II and phase III, the
assumed true treatment effect Delta1
may not be the same in
both phases. Phase III trials are often conducted in populations that
are more heterogeneous than those of the preceding phase II trials
(Kirby et al., 2012), so the effect in phase III may differ from that in
phase II. In order to model these differences, one can use the parameter
gamma
. The treatment effect in phase III is then calculated
as follows: \(\Delta_3 = \Delta_2 +
\gamma\). Values of gamma below zero indicate a more pessimistic
view, values above zero indicate a more optimistic view about the
treatment effect in the confirmatory phase. The default value of
gamma
is zero.
If enough information is available, one may decide to skip the phase
II trial and move directly to a confirmatory trial. This can be
integrated in the framework by using the parameter skipII
.
If we set the parameter TRUE
, the program calculates the
expected utility for the case when phase II is skipped and compares it
to the situation when phase II is not skipped. When skipping phase II,
the assumed treatment effect used for planning the phase III trial is
calculated as the median of the prior distribution. The results are then
returned as a two-row data frame, res[1, ]
being the
results when including phase II and res[2, ]
when skipping
phase II. The default value is skipII = FALSE
.
resII <- optimal_normal(Delta1 = 0.625, fixed = TRUE, # treatment effect
n2min = 20, n2max = 400, # sample size region
stepn2 = 4, # sample size step size
kappamin = 0.02, kappamax = 0.2, # threshold region
stepkappa = 0.02, # threshold step size
c2 = 0.675, c3 = 0.72, # maximal total trial costs
c02 = 15, c03 = 20, # maximal per-patient costs
b1 = 3000, b2 = 8000, b3 = 10000, # gains for patients
alpha = 0.025, # significance level
beta = 0.1, # 1 - power
Delta2 = NULL, w = NULL, in1 = NULL, in2 = NULL,
a = NULL,b = NULL, # setting all unneeded parameters to NULL
skipII = TRUE #skipping phase II
)
We get the following results:
resII
#> Optimization result including phase II:
#> Utility: 2946.07
#> Sample size:
#> phase II: 92, phase III: 192, total: 284
#> Probability to go to phase III: 1
#> Total cost:
#> phase II: 77, phase III: 158, cost constraint: Inf
#> Fixed cost:
#> phase II: 15, phase III: 20
#> Variable cost per patient:
#> phase II: 0.675, phase III: 0.72
#> Effect size categories (expected gains):
#> small: 0 (3000), medium: 0.5 (8000), large: 0.8 (10000)
#> Success probability: 0.85
#> Success probability by effect size:
#> small: 0.72, medium: 0.12, large: 0
#> Significance level: 0.025
#> Targeted power: 0.9
#> Decision rule threshold: 0.06 [Kappa]
#> Assumed true effect: 0.625 [Delta]
#> Treatment effect offset between phase II and III: 0 [gamma]
#>
#> Result when skipping phase II:
#> Utility: 3080.46
#> Sample size:
#> phase II: 0, phase III: 108, total: 108
#> Probability to go to phase III: 1
#> Total cost:
#> phase II: 0, phase III: 98, cost constraint: Inf
#> Fixed cost:
#> phase II: 0, phase III: 20
#> Variable cost per patient:
#> phase II: 0, phase III: 0.72
#> Effect size categories (expected gains):
#> small: 0 (3000), medium: 0.5 (8000), large: 0.8 (10000)
#> Success probability: 0.9
#> Success probability by effect size:
#> small: 0.81, medium: 0.09, large: 0
#> Significance level: 0.025
#> Targeted power: 0.9
#> Decision rule threshold: -Inf [Kappa]
#> Assumed true effect: 0.62 [Delta]
#> Treatment effect offset between phase II and III: 0 [gamma]
#>
#> Skipping phase II is the optimal option with respect to the maximal expected utility.
It can be seen that in this case skipping phase II yields a higher
utility than including phase II. Skipping phase II automatically sets
n2 = O
which leads to costs K2 = 0
. Hence,
overall costs are smaller in our example. Furthermore, note that the
optimal threshold value Kappa
is also automatically set to
-Inf
and the probability to go to phase III
pgo = 1
, as we go to phase III every time, when skipping
phase II.
As some of the programs may have very long run-times, especial more
complex ones, faster computing is enabled by parallel programming. The
parameter num_cl
allows you to set the number of cores for
parallel computing. It is advisable to check the number of cores
available by using the function detectCores()
. The default
value is num_cl = 1
. Note that using this parameters does
not change the results, but can decrease run-time.
This tutorial presents more parameters, so you can adapt the program to your specific needs. For more information on how to use the package, see:
Cohen, J. (1988). Statistical power analysis for the behavioral sciences.
Kirby, S., Burke, J., Chuang-Stein, C., and Sin, C. (2012). Discounting phase 2 results when planning phase 3 clinical trials. Pharmaceutical Statistics, 11(5):373–385.
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.