visit: Vaccine Phase I Design with Simultaneous Evaluation of Immnunogeneicity and Toxicity

Chenguang Wang

2023-08-07

Introduction

Phase I clinical trials are the first step in drug development to apply a new drug or drug combination on humans. Typical designs of Phase I trials use toxicity as the primary endpoint and aim to find the maximum tolerable dosage. However, these designs are generally inapplicable for the development of cancer vaccines because the primary objectives of a cancer vaccine Phase I trial often include determining whether the vaccine shows biologic activity.

R package visit implements a dose escalation algorithm that simultaneously accounts for immunogenicity and toxicity. It uses lower dose levels as the reference for determining if the current dose level is optimal in terms of immune response. It also ensures subject safety by capping the toxicity rate with a given upper bound. These two criteria are simultaneously evaluated using an intuitive decision region.

Users are referred to the following paper for details of the visit design:

Wang, C., Rosner, G. L., & Roden, R. B. (2019). A Bayesian design for phase I cancer therapeutic vaccine trials. Statistics in medicine, 38(7), 1170-1189.

Installation

The package visit can be installed directly from CRAN:

install.packages("visit");
require(visit);

Some packages (e.g., shiny) are required to run the graphical user interface for visit, but are not required to run visit** through a R terminal.

Conduct Simulation Studies During Study Design

Simulation studies are necessary for evaluating study characteristics for a specific study design. visit provides functions for conducting simulation studies and summarizing the simulation results.

Simulation Scenarios

The first step in the simulation studies is usually to specify the simulation scenarios. This is done in visit by the function vtScenario:

tox       <-  c(0.07, 0.23, 0.66);
res       <-  c(0.50, 0.17, 0.59);
rho       <-  c(0.98, 0.40, 0.46);
scenario  <-  vtScenario(tox = tox, res = res, rho = rho);
summary(scenario);
##      No DLT, No Response No DLT, Response DLT, No Response DLT, Response
## [1,]                0.46             0.47             0.04          0.03
## [2,]                0.62             0.15             0.21          0.02
## [3,]                0.10             0.24             0.31          0.35
##      Toxicity Rate Response Rate  Rho
## [1,]          0.07          0.50 0.98
## [2,]          0.23          0.17 0.40
## [3,]          0.66          0.59 0.46

The simulation scenarios are constructed using the level-specific DLT risk rates (tox), immune response rates (res), and odds ratios (rho). The result is a class VTTRUEPS object which has S3 methods summary and “plot”.

summary(scenario);
##      No DLT, No Response No DLT, Response DLT, No Response DLT, Response
## [1,]                0.46             0.47             0.04          0.03
## [2,]                0.62             0.15             0.21          0.02
## [3,]                0.10             0.24             0.31          0.35
##      Toxicity Rate Response Rate  Rho
## [1,]          0.07          0.50 0.98
## [2,]          0.23          0.17 0.40
## [3,]          0.66          0.59 0.46
par(mfrow = c(1,2));
plot(scenario, draw.curves = 1:2, main = "Marginal DLT Risk and Response Rates");
plot(scenario, draw.curves = 3:6, main = "Joint DLT Risk and Response Rates");

Incorporate Prior Knowledge and Specify Priors

Prior knowledge about the DLT risk rates and the prior choices of the parametric model parameters should be encapsulate into a class VTPRIOR object by the function vtPriorPar. Details of the parameters can be found in Wang el. al. (2019).

tau   <- c(0.39, 0.87, 0.49);
prior <- vtPriorPar(tau = tau, sdalpha = 10, sdrho = 10);

Conduct Simulation

The main simulation function in the visit package is the vtSimu function. The function requires a class VTRUEPS object for simulation scenarios and a class “VTPRIOR” class object for priors and other design parameters including etas for the lower and upper boundary of DLT risks, size.cohort for cohort sizes, etc. Probability model needs to be specified by prob.mdl. The options are NONPARA for non-parametric model, NONPARA+ for non-parametric model with \(\rho=1\), PARA for partially parametric model, and PARA+ for partially parametric model with \(\rho=1\).

simu <- vtSimu(n.rep = 100, trueps = scenario,
               size.cohort = 5, size.level = 10,
               etas = c(0.3, 0.7), dec.cut = c(0.45, 0.55, 0.75),
               prob.mdl = "NONPARA+");

The result is a class VTSIMUT object with S3 methods summary and summary2.

sum.1 <- summary(simu);
print(sum.1);
## $dose
##            1 2 3
## Frequency 93 6 1
## %         93 6 1
## 
## $npat
##         stage 1 stage 2 total
## level 1    5.00     1.4  6.40
## level 2    5.00     0.4  5.40
## level 3    0.35     0.2  0.55
## 
## $samples
##                 No T, No R No T, R T, No R  T,R    T    R
## level 1 stage 1       2.32    2.38    0.13 0.17 0.30 2.55
## level 1 stage 2       0.66    0.63    0.06 0.05 0.11 0.68
## level 1 total         2.98    3.01    0.19 0.22 0.41 3.23
## level 2 stage 1       3.02    0.73    1.11 0.14 1.25 0.87
## level 2 stage 2       0.20    0.08    0.12 0.00 0.12 0.08
## level 2 total         3.22    0.81    1.23 0.14 1.37 0.95
## level 3 stage 1       0.03    0.09    0.11 0.12 0.23 0.21
## level 3 stage 2       0.00    0.04    0.05 0.11 0.16 0.15
## level 3 total         0.03    0.13    0.16 0.23 0.39 0.36
## 
## $decison
##                   N    Toxic Ineffective Safe,Effective
## level 1 stage 1 100  0.00000     0.00000       72.00000
## level 1 stage 2  28  0.00000     0.00000       67.85714
## level 2 stage 1 100  2.00000    87.00000        3.00000
## level 2 stage 2   8  0.00000    50.00000       12.50000
## level 3 stage 1   7 28.57143    14.28571        0.00000
## level 3 stage 2   4 75.00000     0.00000        0.00000
##                 Effective,Safety concern
## level 1 stage 1                 28.00000
## level 1 stage 2                 32.14286
## level 2 stage 1                  8.00000
## level 2 stage 2                 37.50000
## level 3 stage 1                 57.14286
## level 3 stage 2                 25.00000
## 
## $prob
##                        Toxic Ineffective Safe,Effective
## level 1 stage 1 0.0045375000   0.0000000     0.85938250
## level 1 stage 2 0.0004017857   0.0000000     0.83966964
## level 2 stage 1 0.0587200000   0.7712125     0.10558000
## level 2 stage 2 0.0203437500   0.4981562     0.27200000
## level 3 stage 1 0.4122857143   0.1745000     0.06960714
## level 3 stage 2 0.4241875000   0.0600000     0.00768750
##                 Effective,Safety concern
## level 1 stage 1                0.1360800
## level 1 stage 2                0.1599286
## level 2 stage 1                0.0644875
## level 2 stage 2                0.2095000
## level 3 stage 1                0.3436071
## level 3 stage 2                0.5081250
## 
## $ptox
##                      Mean         LB        UB
## level 1 stage 1 0.1336080 0.08041559 0.2569313
## level 1 stage 2 0.1783334 0.13390102 0.2578602
## level 2 stage 1 0.2915642 0.08075952 0.5860364
## level 2 stage 2 0.3399194 0.22383331 0.4847803
## level 3 stage 1 0.6316754 0.43865020 0.8943163
## level 3 stage 2 0.6598564 0.59730874 0.6845209
## 
## $pres
##                      Mean         LB        UB
## level 1 stage 1 0.5082704 0.16053040 0.7537984
## level 1 stage 2 0.5168683 0.31664741 0.7714243
## level 2 stage 1 0.2283458 0.08136799 0.4225707
## level 2 stage 2 0.2956403 0.13600664 0.4842143
## level 3 stage 1 0.5838975 0.41499903 0.7508539
## level 3 stage 2 0.7049501 0.59455436 0.7751161
sum.2 <- summary2(simu);
print(sum.2);
##       1       2       3         level 1 level 2 level 3               T       R 
##   93.00    6.00    1.00  100.00    6.40    5.40    0.55   12.35    0.41    3.23 
##       T       R       T       R       T       R 
##    1.37    0.95    0.39    0.36    2.17    4.54

Conduct Data Analysis for Ongoing Phase I Studies

During the conduction of a Phase I study, the *visit** package provide functions to carry our the interim analysis and provide decisions about dose escalation.

Interim Analysis

To perform the interim analysis, the current level of observation and the previous level of observation is needed. Decision cuts, lower and upper bound of DLT risk, prob.mdl, and priors are all optional arguments. Please refer to the visit package PDF for details on the result decision map.

etas       <- c(0.1, 0.3)
dec.cut    <- c(0.6,0.6,0.6)
cur.obs.y  <- c(3, 2, 1, 1)
prev.obs.y <- c(5, 2, 0, 0)
rst.inter  <- vtInterim(cur.obs.y,  prev.obs.y = prev.obs.y,
                        prob.mdl = "NONPARA", etas = etas, dec.cut = dec.cut,
                        nsmp = 2000);

plot(rst.inter);

Track of Study History

A function vtTrack is provided to visualize the entire progress of the study, including the observed data and dose escalation decisions. The required data is a five column matrix, with the first column indicating the dose level, and the rest should indicate the observed number of patients with No DLT, No Response, No DLT, Response, DLT, No Response, and DLT, Response.

obs <- rbind(c(1, 6, 4, 3, 6), c(2, 4, 9, 3, 3), c(3, 2, 6, 6, 5));
vtTrack(obs, end.width = 0.8);

Graphical User Interface (GUI)

The visit package provides a web-based GUI for composite endpoint analysis. The GUI can be accessed by

vtShiny();