Skip to contents

This generic function takes a design and generates a data.frame showing the beginning of several hypothetical trial courses under the design. This means, from the generated data.frame one can read off:

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

(Design or RuleDesign)
the design 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

(McmcOptions)
giving the MCMC options for each evaluation in the trial. By default, the standard options are used

Value

A data frame with the current dose, hypothetical DLTs, recommended nextDose, stop (whether the stopping rule is met), and percentage increment relative to dose.

For DADesign, DLTs is the number of additional hypothetical DLTs assigned among the current cohort and earlier patients still within their DLT window at the next cohort-opening time. It is not restricted to the current cohort and does not include DLTs already present in object@data. Each cohort is reached along the path with no additional DLTs. The integer column cohort identifies the current cohort, starting at 1 for empty data or continuing the existing cohort indices in object@data. The character column DLT_cohorts lists one cohort index per additional hypothetical DLT, sorted and separated by commas. Repeated indices denote multiple DLTs in the same cohort: "1, 2, 2" means one DLT in cohort 1 and two in cohort 2. It is "" when DLTs is zero and excludes previously observed DLTs. The character column DLT_time gives the corresponding DLT onset times, relative to the start of each patient's cohort, in the same order and comma-separated format as DLT_cohorts. It is "" when DLTs is zero. The dose column always refers to the current cohort.

The additional column DLT_scenario identifies the scenario, not a count: "no additional DLTs" denotes no additional DLTs; "late DLTs" assigns DLTs to the earliest-enrolled eligible patients, at their available follow-up times; "early DLTs" assigns DLTs to the latest-enrolled eligible patients, as early as one day after the previous cohort-opening decision or one day after enrollment, whichever is later. For "early DLTs", if DLTs is at least the current cohort size, the hypothetical decision occurs one day after its last patient enrolls; otherwise it occurs at the usual next cohort-opening time. Both scenarios are evaluated for every positive DLTs count. They are illustrative allocations, not all possible patient-level outcomes.

Details

  • 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.

Functions

  • examine(Design): Examine a model-based CRM.

  • examine(RuleDesign): Examine a rule-based design.

  • examine(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 | StoppingMissingDose()

# 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
)

# \donttest{
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
)

# \donttest{
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
)

# \donttest{
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)
# \donttest{
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) | StoppingMissingDose()

# 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.
# Each hypothetical scenario requires an MCMC fit, so this can take a while.
# DLTs counts additional hypothetical events, including earlier patients whose
# DLT windows are still open. DLT_scenario identifies the scenario:
# "no additional DLTs", "late DLTs" (earlier-enrolled patients), or
# "early DLTs" (later-enrolled patients).
# cohort identifies the current cohort. DLT_cohorts lists one cohort index per
# additional DLT (e.g. "1, 2, 2"), or "" when there are none.
options <- McmcOptions(
  burnin = 10,
  step = 1,
  samples = 100,
  rng_kind = "Mersenne-Twister",
  rng_seed = 12
)
# \donttest{
result <- examine(design, mcmcOptions = options)
# }

# nolint end