Title: | Study Design for Immunotherapy Clinical Trials |
Version: | 1.0.16 |
Date: | 2024-01-09 |
Description: | Perform sample size, power calculation and subsequent analysis for Immuno-oncology (IO) trials composed of responders and non-responders. |
Maintainer: | Bill Wheeler <wheelerb@imsweb.com> |
Depends: | R (≥ 3.5), survival, msm |
License: | GPL-2 |
NeedsCompilation: | yes |
Packaged: | 2024-01-09 14:34:07 UTC; wheelerwi |
Author: | Zhenzhen Xu [aut], Yongsoek Park [aut], Zhu Bin [aut], Bill Wheeler [cre] |
Repository: | CRAN |
Date/Publication: | 2024-01-10 14:03:13 UTC |
Study design for immunotherapy clinical trials
Description
Perform sample size, power calculation and subsequent analysis for Immuno-oncology (IO) trials composed of responders and nonresponders.
Details
This package is an extension of the Immunotherapy.Design R package but allows for response categories of more than two categories among the treatment population, such as complete responders, partial responders, as well as non-responders.
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov>, Yongsoek Park <yongpark@pitt.edu> and Bin Zhu <bin.zhu@nih.gov>
References
Xu, Z., Park, Y., Liu, K. and Zhu, B. Treating non-responders: pitfalls and implications for cancer immunotherapy trial design. Journal of Hematology & Oncology 13, 20 (2020).
Xu, Z., Zhu, B. and Park, Y. Designing immuno-oncology clinical trials composed of responders and nonresponders. Statistics in Medicine. (Under Revision).
EM algorithm
Description
EM algorithm
Usage
PRIMEplus.EM(data, effect_p, beta0, time.var="X", trt.var="trt",
status.var="event_status", id.var="id", t1=1, lambda0=NULL,
stopTol=1e-4, maxiter=100000, print=0)
Arguments
data |
Data frame or matrix containing a time-to-event variable ( |
effect_p |
Vector of proportions for groups of responders in the treatment arm at baseline (see details). |
beta0 |
Vector or matrix of initial estimates for the log-hazard ratios (see details). |
time.var |
Time-to-event variable name in |
trt.var |
Binary treatment variable name in |
status.var |
Name of the binary censoring variable in |
id.var |
NULL or subject id variable in |
t1 |
Delayed duration. The default is 1. |
lambda0 |
NULL or vector of initial estimates for the baseline hazards corrsponding to the ordered event times. |
stopTol |
Stopping tolerance. The default is 1e-4. |
maxiter |
Maximum number of iterations. The default is 100000. |
print |
0-2 to print information. Larger values will print more information. The default is 0. |
Details
The EM algorithm is sensitive to the initial values of the log-hazard ratios (beta0
), so different
initial estimates should be tried to ensure the maximum log-likelihood is obtained.
Thus, beta0
can be a vector or matrix, where in the case of a matrix, each row corresponds to a different set
of intial estimates. Each set of initial estimates must contain distinct non-zero values.
The length and order of effect_p
must be the same as the columns of beta0
. Both of these
should contain information only for the groups of responders. For example, if there are
full responders and partial responders, then effect_p
would be a vector of length two,
and beta0
would be a vector of length two or a matrix with two columns.
Value
A list containing the objects:
Name | Description |
converged | TRUE if EM algorithm converged |
beta | final log(hazard ratio) estimates of responders versus controls |
lambda | final estimates of baseline hazards |
probResponder | estimated probability of a subject being a responder |
loglike | log-likelihood value at the final estimates |
loglike.marg | marginal log-likelihood value at the final estimates |
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov>, Yongsoek Park <yongpark@pitt.edu> and Bin Zhu <bin.zhu@nih.gov>
See Also
Examples
data(data, package="PRIMEplus")
effp <- c(0.3, 0.3)
beta0 <- c(log(0.4), log(0.6))
ret <- PRIMEplus.EM(data, effp, beta0)
ret$beta
Likelihood Ratio Test
Description
PRIMEplus likelihood ratio test
Usage
PRIMEplus.LRT(data, effect_p, beta0, time.var="X", trt.var="trt",
status.var="event_status", id.var="id", t1=1, lambda0=NULL,
stopTol=1e-4, maxiter=100000, print=0)
Arguments
data |
Data frame or matrix containing a time-to-event variable ( |
effect_p |
Vector of proportions for groups of responders in the treatment arm at baseline (see details). |
beta0 |
Vector or matrix of initial estimates for the log-hazard ratios (see details). |
time.var |
Time-to-event variable name in |
trt.var |
Binary treatment variable name in |
status.var |
Name of the binary censoring variable in |
id.var |
NULL or subject id variable in |
t1 |
Delayed duration. The default is 1. |
lambda0 |
NULL or vector of initial estimates for the baseline hazards corrsponding to the ordered event times. |
stopTol |
Stopping tolerance. The default is 1e-4. |
maxiter |
Maximum number of iterations. The default is 100000. |
print |
0-2 to print information. Larger values will print more information. The default is 0. |
Details
The EM algorithm is sensitive to the initial values of the log-hazard ratios (beta0
), so different
initial estimates should be tried to ensure the maximum log-likelihood is obtained.
Thus, beta0
can be a vector or matrix, where in the case of a matrix, each row corresponds to a different set
of intial estimates. Each set of initial estimates must contain distinct non-zero values.
The length and order of effect_p
must be the same as the columns of beta0
. Both of these
should contain information only for the groups of responders. For example, if there are
full responders and partial responders, then effect_p
would be a vector of length two,
and beta0
would be a vector of length two or a matrix with two columns.
Value
A list containing the objects:
Name | Description |
converged | TRUE if EM algorithm converged |
beta | final log(hazard ratio) estimates of responders versus controls |
lambda | final estimates of baseline hazards |
probResponder | estimated probability of a subject being a responder |
loglike | log-likelihood value at the final estimates |
loglike.marg | marginal log-likelihood value at the final estimates |
loglike.marg.0 | marginal log-likelihood value under the null hypothesis |
LRT | likelihood-ratio test statistic |
pvalue | p-value of the likelihood ratio test |
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov>, Yongsoek Park <yongpark@pitt.edu> and Bin Zhu <bin.zhu@nih.gov>
See Also
Examples
data(data, package="PRIMEplus")
effp <- c(0.3, 0.3)
beta0 <- c(log(0.4), log(0.6))
ret <- PRIMEplus.LRT(data, effp, beta0)
ret$LRT
ret$pvalue
Power
Description
Compute the power using LRT Re-randomization test
Usage
PRIMEplus.Power(nmax=500, rand_ratio=0.5, effect_p=0.6,
enroll_rate=380*0.25/6, lambda1=0.117, HR=0.5, tau=12*5, t1=1,
maxiter=100000, stopTol=1e-4, alpha=0.05, num_rand=1000, nsim=10000,
print=0, min.sample.size=50, min.n.event=5, min.per.trt=0.25)
Arguments
nmax |
Sample size |
rand_ratio |
Probability of assignment to treatment arm |
effect_p |
Vector for proportion of responders in the treatment arm at baseline (see details) |
enroll_rate |
Enrollment rate in subjects per month |
lambda1 |
Baseline hazard in terms of months |
HR |
Vector of hazard ratios for responders against controls (see details) |
tau |
Total study duration |
t1 |
Delayed duration in months |
maxiter |
Maximum number of iterations in the EM algorithm. The default is 100000. |
stopTol |
Stopping tolerance in the EM algorithm. The default is 1e-4. |
alpha |
Significance level. The default is 0.05. |
num_rand |
The number of replications in the re-randomization test. The default is 1000. |
nsim |
The number of simulations. The default is 1000. |
print |
0 or 1 to print information. The default is 0. |
min.sample.size |
Minimum sample size. The default is 50. |
min.n.event |
Minimum number of events. The default is 5. |
min.per.trt |
Minimum proportion of controls and treated subjects. The default is 0.25. |
Details
The length and order of effect_p
must be the same as HR
. Both of these vectors
should contain information only for the groups of responders. For example, if there are
full responders and partial responders, then effect_p
and HR
would be vectors
of length two.
For each simulation, a simulated data set is created from the
generate_data
function and then an estimated p-value is computed
by calling PRIMEplus.ReRand.LRT
.
The power is calculated as the proportion of iterations whose estimated p-value
was less than or equal to alpha
.
Value
A list containing the power and the number of simulated datasets used in the calculation.
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov>, Yongsoek Park <yongpark@pitt.edu> and Bin Zhu <bin.zhu@nih.gov>
See Also
Randomization Test
Description
PRIMEplus randomization likelihood ratio test
Usage
PRIMEplus.ReRand.LRT(data, effect_p, beta0, time.var="X", trt.var="trt",
status.var="event_status", id.var="id", t1=1, lambda0=NULL,
stopTol=1e-4, maxiter=100000, print=0, num_rand=1000)
Arguments
data |
Data frame or matrix containing a time-to-event variable ( |
effect_p |
Vector of proportions for groups of responders in the treatment arm at baseline (see details). |
beta0 |
Vector or matrix of initial estimates for the log-hazard ratios (see details). |
time.var |
Time-to-event variable name in |
trt.var |
Binary treatment variable name in |
status.var |
Name of the binary censoring variable in |
id.var |
NULL or subject id variable in |
t1 |
Delayed duration. The default is 1. |
lambda0 |
NULL or vector of initial estimates for the baseline hazards corrsponding to the ordered event times. |
stopTol |
Stopping tolerance. The default is 1e-4. |
maxiter |
Maximum number of iterations. The default is 100000. |
print |
0-2 to print information. Larger values will print more information. The default is 0. |
num_rand |
The number of randomizations. The default is 1000. |
Details
The EM algorithm is sensitive to the initial values of the log-hazard ratios (beta0
), so different
initial estimates should be tried to ensure the maximum log-likelihood is obtained.
Thus, beta0
can be a vector or matrix, where in the case of a matrix, each row corresponds to a different set
of intial estimates. Each set of initial estimates must contain distinct non-zero values.
The length and order of effect_p
must be the same as the columns of beta0
. Both of these
should contain information only for the groups of responders. For example, if there are
full responders and partial responders, then effect_p
would be a vector of length two,
and beta0
would be a vector of length two or a matrix with two columns.
The initial values are only used for the observed data; each randomization uses the MLE estimates
as initial estimates.
Value
A list containing the objects:
Name | Description |
pvalue.LRT | p-value of the randomization test based on the likelihood ratio test |
pvalue.loglike.marg | p-value of the randomization test based on the marginal likelihood |
n.randomizations | the number of randomizations that the p-values are based on |
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov>, Yongsoek Park <yongpark@pitt.edu> and Bin Zhu <bin.zhu@nih.gov>
See Also
Examples
data(data, package="PRIMEplus")
effp <- c(0.3, 0.3)
beta0 <- c(log(0.4), log(0.6))
ret <- PRIMEplus.ReRand.LRT(data, effp, beta0, num_rand=100)
ret
Sample Size
Description
Compute the sample size for a given power
Usage
PRIMEplus.SampleSize(power=0.8, rand_ratio=0.5, effect_p=0.6, enroll_rate=380*0.25/6,
lambda1=0.117, HR=0.5, tau=12*5, t1=1, maxiter=100000, stopTol=1e-4,
alpha=0.05, num_rand=1000, nsim=10000, min.N=100, max.N=700,
tol.power=0.01, tol.N=1, print=1,
min.sample.size=50, min.n.event=5, min.per.trt=0.25)
Arguments
power |
The desired power. The default is 0.8. |
rand_ratio |
Allocation ratio |
effect_p |
Vector for proportion of responders in the treatment arm at baseline (see details) |
enroll_rate |
Enrollment rate in subjects per month |
lambda1 |
Baseline hazard in terms of months |
HR |
Vector of hazard ratios for responders against controls (see details) |
tau |
Total study duration |
t1 |
Delayed duration |
maxiter |
Maximum number of iterations in the EM algorithm. The default is 100000. |
stopTol |
Stopping tolerance in the EM algorithm. The default is 1e-4. |
alpha |
Significance level. The default is 0.05. |
num_rand |
Number of replications in the re-randomization test. The default is 1000. |
nsim |
Number of simulations in computing power (see Details). The default is 10000. |
min.N |
Lower bound for the sample size. The default is 100. |
max.N |
Upper bound for the sample size. The default is 700. |
tol.power |
Stopping tolerance for the power. The default is 0.01. |
tol.N |
Stopping tolerance for the sample size. The default is 1. |
print |
0 or 1 to print information. The default is 1. |
min.sample.size |
Minimum sample size. The default is 50. |
min.n.event |
Minimum number of events. The default is 5. |
min.per.trt |
Minimum proportion of controls and treated subjects. The default is 0.25. |
Details
The length and order of effect_p
must be the same as HR
. Both of these vectors
should contain information only for the groups of responders. For example, if there are
full responders and partial responders, then effect_p
and HR
would be vectors
of length two.
This uses a bisection method to estimate the sample size. At each iteration,
the estimated power power_est
is computed using PRIMEplus.Power
for a given sample size holding all other parameters fixed.
The algorithm terminates when abs(power - power_est) <= tol.power
or
when the length of the estimated interval containing the sample size is
less than or equal to tol.N
.
NOTE:
It is important to note that the power for a given sample size is estimated by
running a simulation. Thus, by setting a different seed, a different result may
be returned. Therefore, to ensure a more precise estimated sample size, set the
option nsim
to a large value and/or run this function several times by
setting different seeds and examine the distribution of returned sample sizes.
Value
A list containing the sample size and power.
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov>, Yongsoek Park <yongpark@pitt.edu> and Bin Zhu <bin.zhu@nih.gov>
See Also
Data for examples
Description
Data for examples.
Details
A data frame used in the examples.
Examples
data(data, package="PRIMEplus")
# Display some of the data
data[1:5, ]
Simulated data
Description
Generate simulated data
Usage
generate_data(N=500, rand_ratio=0.5, effect_p=0.6, enroll_rate=380*0.25/6,
lambda1=0.117, HR=0.5, tau=12*5, t1=1)
Arguments
N |
Maximum sample size |
rand_ratio |
Allocation ratio |
effect_p |
Vector for proportion of responders in the treatment arm at baseline (see details) |
enroll_rate |
Enrollment rate in subjects per month |
lambda1 |
Baseline hazard in terms of months |
HR |
Vector of hazard ratios for responders against controls (see details) |
tau |
Total study duration |
t1 |
Delayed duration |
Details
The length and order of effect_p
must be the same as HR
. Both of these vectors
should contain information only for the groups of responders. For example, if there are
full responders and partial responders, then effect_p
and HR
would be vectors
of length two.
Value
A data frame with columns:
Name | Description |
id | id variable |
trt | treatment allocation: 1 = treatment arm |
D1 | patient's response status for group 1 |
D2 | patient's response status for group 2 |
Dm | patient's response status for non-responders |
tau | total study duration |
enroll_time | patients' enrollment times |
time_to_event | patients' event times |
event_status | censoring indicator |
X | observational time |
t1 | delayed duration |
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov>, Yongsoek Park <yongpark@pitt.edu> and Bin Zhu <bin.zhu@nih.gov>
Examples
data <- generate_data()
data[1:5, ]
Compute initial estimates for the baseline hazard
Description
Calls the coxph function to compute initial estimates for the baseline hazard
Usage
getHazard(time, treatment, event_status, t.fail.o=NULL)
Arguments
time |
Vector of times. |
treatment |
Binary vector of treatments (1=subject received treatment). |
event_status |
Binary vector of event status (1=subject experienced an event). |
t.fail.o |
NULL or vector of event times. |
Value
List containing the baseline hazards ordered by the event times.
Author(s)
Zhenzhen Xu <Zhenzhen.Xu@fda.hhs.gov> and Bin Zhu <bin.zhu@nih.gov>
See Also
Examples
data(data, package="PRIMEplus")
lambda0 <- getHazard(data[, "X"], data[, "trt"], data[, "event_status"])$hazard
lambda0[1:10]