This generic function takes a design and generates a dataframe showing the beginning of several hypothetical trial courses under the design. This means, from the generated dataframe one can read off:
how many cohorts are required in the optimal case (no DLTs observed) in order to reach the highest dose of the specified dose grid (or until the stopping rule is fulfilled)
assuming no DLTs are observed until a certain dose level, what the next recommended dose is for all possible number of DLTs observed
the actual relative increments that will be used in these cases
whether the trial would stop at a certain cohort Examining the "single trial" behavior of a dose escalation design is the first important step in evaluating a design, and cannot be replaced by studying solely the operating characteristics in "many trials". The cohort sizes are also taken from the design, assuming no DLTs occur until the dose listed.
Usage
examine(object, ..., maxNoIncrement = 100L)
# S4 method for class 'Design'
examine(object, mcmcOptions = McmcOptions(), ..., maxNoIncrement)
# S4 method for class 'RuleDesign'
examine(object, ..., maxNoIncrement = 100L)
# S4 method for class 'DADesign'
examine(object, mcmcOptions = McmcOptions(), ..., maxNoIncrement)
Arguments
- object
the design (
Design
orRuleDesign
object) we want to examine- ...
additional arguments (see methods)
- maxNoIncrement
maximum number of contiguous next doses at 0 DLTs that are the same as before, i.e. no increment (default to 100)
- mcmcOptions
object of class
McmcOptions
, giving the MCMC options for each evaluation in the trial. By default, the standard options are used
Functions
examine(Design)
: Examine a model-based CRMexamine(RuleDesign)
: Examine a rule-based designexamine(DADesign)
: Examine a model-based CRM
Examples
# Define the dose-grid.
emptydata <- Data(doseGrid = c(1, 3, 5, 10, 15, 20, 25))
# Initialize the CRM model.
my_model <- LogisticLogNormal(
mean = c(-0.85, 1),
cov =
matrix(c(1, -0.5, -0.5, 1),
nrow = 2
),
ref_dose = 56
)
# Choose the rule for selecting the next dose.
my_next_best <- NextBestNCRM(
target = c(0.2, 0.35),
overdose = c(0.35, 1),
max_overdose_prob = 0.25
)
my_size1 <- CohortSizeRange(
intervals = c(0, 30),
cohort_size = c(1, 3)
)
my_size2 <- CohortSizeDLT(
intervals = c(0, 1),
cohort_size = c(1, 3)
)
my_size <- maxSize(my_size1, my_size2)
# Choose the rule for stopping.
my_stopping1 <- StoppingMinCohorts(nCohorts = 3)
my_stopping2 <- StoppingTargetProb(
target = c(0.2, 0.35),
prob = 0.5
)
my_stopping3 <- StoppingMinPatients(nPatients = 20)
my_stopping <- (my_stopping1 & my_stopping2) | my_stopping3
# Choose the rule for dose increments.
my_increments <- IncrementsRelative(
intervals = c(0, 20),
increments = c(1, 0.33)
)
# Initialize the design.
my_design <- Design(
model = my_model,
nextBest = my_next_best,
stopping = my_stopping,
increments = my_increments,
cohort_size = my_size,
data = emptydata,
startingDose = 3
)
my_options <- McmcOptions(
burnin = 10, step = 1, samples = 20, rng_kind = "Super-Duper",
rng_seed = 94
)
examine(my_design, my_options)
#> dose DLTs nextDose stop increment
#> 1 3 0 5 FALSE 67
#> 2 3 1 1 FALSE -67
#> 3 5 0 10 FALSE 100
#> 4 5 1 5 FALSE 0
#> 5 10 0 20 FALSE 100
#> 6 10 1 5 FALSE -50
#> 7 20 0 25 FALSE 25
#> 8 20 1 20 FALSE 0
# Example where examine stops because stopping rule already fulfilled.
my_stopping4 <- StoppingMinPatients(nPatients = 3)
my_stopping <- (my_stopping1 & my_stopping2) | my_stopping4
my_design <- Design(
model = my_model,
nextBest = my_next_best,
stopping = my_stopping,
increments = my_increments,
cohort_size = my_size,
data = emptydata,
startingDose = 3
)
examine(my_design, mcmcOptions = my_options)
#> dose DLTs nextDose stop increment
#> 1 3 0 5 FALSE 67
#> 2 3 1 1 FALSE -67
#> 3 5 0 10 FALSE 100
#> 4 5 1 5 FALSE 0
#> 5 10 0 20 TRUE 100
#> 6 10 1 5 TRUE -50
# Example where examine stops because infinite looping
# (note that here a very low threshold is used for the parameter
# "maxNoIncrement" in "examine" to keep the execution time short).
my_increments <- IncrementsRelative(
intervals = c(0, 20),
increments = c(1, 0.00001)
)
my_stopping <- (my_stopping1 & my_stopping2) | StoppingMissingDose()
design <- Design(
model = my_model,
nextBest = my_next_best,
stopping = my_stopping,
increments = my_increments,
cohort_size = my_size,
data = emptydata,
startingDose = 3
)
examine(my_design, mcmcOptions = my_options, maxNoIncrement = 2)
#> dose DLTs nextDose stop increment
#> 1 3 0 5 FALSE 67
#> 2 3 1 1 FALSE -67
#> 3 5 0 10 FALSE 100
#> 4 5 1 5 FALSE 0
#> 5 10 0 20 TRUE 100
#> 6 10 1 5 TRUE -50
# Define the dose-grid
emptydata <- Data(doseGrid = c(5, 10, 15, 25, 35, 50, 80))
# inizialing a 3+3 design with constant cohort size of 3 and
# starting dose equal 5
myDesign <- RuleDesign(
nextBest = NextBestThreePlusThree(),
cohort_size = CohortSizeConst(size = 3L),
data = emptydata,
startingDose = 5
)
# Examine the design
set.seed(4235)
examine(myDesign)
#> dose DLTs nextDose stop increment
#> 1 5 0 10 FALSE 100
#> 2 5 1 5 FALSE 0
#> 3 5 2 NA TRUE NA
#> 4 5 3 NA TRUE NA
#> 5 10 0 15 FALSE 50
#> 6 10 1 10 FALSE 0
#> 7 10 2 5 FALSE -50
#> 8 10 3 5 FALSE -50
#> 9 15 0 25 FALSE 67
#> 10 15 1 15 FALSE 0
#> 11 15 2 10 FALSE -33
#> 12 15 3 10 FALSE -33
#> 13 25 0 35 FALSE 40
#> 14 25 1 25 FALSE 0
#> 15 25 2 15 FALSE -40
#> 16 25 3 15 FALSE -40
#> 17 35 0 50 FALSE 43
#> 18 35 1 35 FALSE 0
#> 19 35 2 25 FALSE -29
#> 20 35 3 25 FALSE -29
#> 21 50 0 80 FALSE 60
#> 22 50 1 50 FALSE 0
#> 23 50 2 35 FALSE -30
#> 24 50 3 35 FALSE -30
# nolint start
# Define the dose-grid and PEM parameters
emptydata <- DataDA(doseGrid = c(
0.1, 0.5, 1, 1.5, 3, 6,
seq(from = 10, to = 80, by = 2)
), Tmax = 60)
# Initialize the mDA-CRM model
npiece_ <- 10
Tmax_ <- 60
lambda_prior <- function(k) {
npiece_ / (Tmax_ * (npiece_ - k + 0.5))
}
model <- DALogisticLogNormal(
mean = c(-0.85, 1),
cov = matrix(c(1, -0.5, -0.5, 1), nrow = 2),
ref_dose = 56,
npiece = npiece_,
l = as.numeric(t(apply(as.matrix(c(1:npiece_), 1, npiece_), 2, lambda_prior))),
c_par = 2
)
# Choose the rule for dose increments
myIncrements <- IncrementsRelative(
intervals = c(0, 20),
increments = c(1, 0.33)
)
myNextBest <- NextBestNCRM(
target = c(0.2, 0.35),
overdose = c(0.35, 1),
max_overdose_prob = 0.25
)
# Choose the rule for the cohort-size
mySize1 <- CohortSizeRange(
intervals = c(0, 30),
cohort_size = c(1, 3)
)
mySize2 <- CohortSizeDLT(
intervals = c(0, 1),
cohort_size = c(1, 3)
)
mySize <- maxSize(mySize1, mySize2)
# Choose the rule for stopping
myStopping1 <- StoppingTargetProb(
target = c(0.2, 0.35),
prob = 0.5
)
myStopping2 <- StoppingMinPatients(nPatients = 50)
myStopping <- (myStopping1 | myStopping2)
# Choose the safety window
mysafetywindow <- SafetyWindowConst(c(6, 2), 7, 7)
# Initialize the design
design <- DADesign(
model = model,
increments = myIncrements,
nextBest = myNextBest,
stopping = myStopping,
cohort_size = mySize,
data = emptydata,
safetyWindow = mysafetywindow,
startingDose = 3
)
set.seed(4235)
# MCMC parameters are set to small values only to show this example. They should be
# increased for a real case.
# This procedure will take a while.
options <- McmcOptions(
burnin = 10,
step = 1,
samples = 100,
rng_kind = "Mersenne-Twister",
rng_seed = 12
)
testthat::expect_warning(
result <- examine(design, mcmcOptions = options, maxNoIncrement = 2),
"Stopping because 2 times no increment"
)
# nolint end