Skip to contents

Evaluates data scenarios consisting of observations of one or more monotherapy or two-drug combination therapy dose-finding trials including a binary covariate and computes posterior toxicities for a trial of interest and a set of doses of interest. The function supports one-sided and two-sided covariates. This can be controlled separately for each of thw two compounds.

For a general introduction to the use of the scenario functions included in this package, see the introduction vignette: vignette("intro_jointBLRM", package = "decider"). Also refer to the documentation of scenario_jointBLRM().

If multiple scenarios need to be evaluated, consider using the function scenario_list_covariate_jointBLRM() instead, which is a parallelized wrapper that processes a list of data scenarios within the same setting via scenario_covariate_jointBLRM().

A description of the underlying model and methods are given in the section Details.

Usage

scenario_covariate_jointBLRM(
   data=NULL,
   historical.data=NULL,
   doses.of.interest,
   doses.of.interest.covars = NULL,
   dose.ref1,
   dose.ref2,
   trials.of.interest,
   types.of.interest=NULL,
   trials.of.interest.covars=NULL,
   esc.rule=c("ewoc", "loss", "dynamic.loss"),
   dosing.intervals = c(0.16, 0.33, 0.6),
   ewoc.threshold = 0.25,
   loss.weights = c(1, 0, 1, 2),
   dynamic.weights = rbind(c(0.32, 0, 0.32, 0.36),
                           c(0.29, 0, 0.31, 0.4),
                           c(0.27, 0, 0.33, 0.4),
                           c(0.2,  0, 0.3,  0.5)
   ),
   prior.mu = list(mu_a1 =  c(logit(0.33), 2),
                   mu_b1 =  c(0,           1),
                   mu_a2 =  c(logit(0.33), 2),
                   mu_b2 =  c(0,           1),
                   mu_eta = c(0,           1.121)
   ),
   prior.mu.covar = list(mu_g1 = c(0,  1),
                         mu_g2 = c(0,  1)
   ),
   prior.tau = list(tau_a1 =  c(log(0.25),  log(2)/1.96),
                    tau_b1 =  c(log(0.125), log(2)/1.96),
                    tau_a2 =  c(log(0.25),  log(2)/1.96),
                    tau_b2 =  c(log(0.125), log(2)/1.96),
                    tau_eta = c(log(0.125), log(2)/1.96)
   ),
   prior.tau.covar = list(tau_g1 = c(log(0.125), log(2)/1.96),
                          tau_g2 = c(log(0.125), log(2)/1.96)
   ),
   two_sided1 = TRUE,
   two_sided2 = TRUE,
   saturating = FALSE,
   probs = c(0.025, 0.5, 0.975),
   iter = 26000,
   warmup = 1000,
   refresh = 0,
   adapt_delta = 0.8,
   max_treedepth = 15,
   chains = 4,
   digits = 5,
   seed=sample.int(.Machine$integer.max, 1),
   path = NULL,
   file.name = NULL,
   output.dosetrafo = list(
     "d1c0" = function(x) return(x),
     "d1c1" = function(x) return(x),
     "d2c0" = function(x) return(x),
     "d2c1" = function(x) return(x)
   ),
   plot.decisions = FALSE,
   plot.combi.heatmap = TRUE,
   plot.int.probs.loss = FALSE,
   plot.return = FALSE,
   plot.file.format = "pdf",
   plot.width,
   plot.height,
   plot.unit,
   output.scen.config = FALSE
)

Arguments

data

List that contains the data scenario to be evaluated. Can be NULL if the prior shall be computed. The data list should have the following named entries, all of which need to be vectors of the same length (length should be the number of cohorts in the data):

  • data$dose1
    Numeric vector, each entry must be non-negative. Entry \(i\) should provide the dose level of compound 1 administered to cohort \(i\) in the data. Use 0 or NA to state that compound 1 was not used during treatment of a cohort. Note: For each cohort, either data$dose1 or data$dose2 must be positive.

  • data$dose2
    Numeric vector, each entry must be non-negative. Entry \(i\) should provide the dose level of compound 2 administered to cohort \(i\) in the data. Use 0 or NA to state that compound 2 was not used during treatment of a cohort. Note: For each cohort, either data$dose1 or data$dose2 must be positive.

  • data$n.pat
    Numeric vector, each entry must be a non-negative integer. Entry \(i\) should provide the number of patients in cohort \(i\) in the data. 0 is interpreted as the cohort not having been treated yet. If data contains solely cohorts with 0 patients, the function will sample from the prior.

  • data$n.dlt
    Numeric vector, each entry must be a non-negative integer. Entry \(i\) should provide the number of DLTs in cohort \(i\) in the data. In particular, the values need to be smaller or equal to the patient number of the corresponding cohort.

  • data$trial
    Numeric or character vector. The entries should be trial names, i.e. indicators for the trial to which the cohort belongs. These can either be numbers or strings (both will be converted to numbers internally). Note: As mixed vectors of numbers and strings will be converted to strings, entries such as 1 and "1" will be interpreted as the same trial.

  • data$covar
    Numeric vector with 0-1 entries indicating the value of binary covariate for the cohorts included in data. That is, when entry \(i\) is 0, the value of the binary covariate is assumed to be 0 for the patients in cohort \(i\), and similarly for entry 1.

historical.data

Optional named list, must have the same structure as data. It is equivalent to include observations as data or historical.data. Trial names across data and historical data must be consistent, in the sense that observations with the same entries in data$trial, respectively historical.data$trial are interpreted to belong to the same trial.

doses.of.interest

Numeric matrix with two rows and non-negative entries. Each column gives a dose combination of interest. See scenario_jointBLRM() for details.

doses.of.interest.covars

Numeric vector, defaults to NULL. Must be either NULL or of the same length as the number of columns of doses.of.interest. Allows to provide a covariate value for each dose of interest that decides if it should be displayed for only one of the covariates. Entries other than 0 or 1 cause the dose to be displayed for both covariate values in the outputs. If the argument is set to NULL, all doses are displayed for both covariates

dose.ref1

Numeric, must be positive. Reference dose for compound 1.

dose.ref2

Numeric, must be positive. Reference dose for compound 2.

trials.of.interest

Optional vector of numerical or character trial numbers/names, for which the posterior is to be computed. See scenario_jointBLRM() for details.

types.of.interest

Optional character vector with one entry for each entry of trials.of.interest which specifies the trial type of the corresponding trial of interest. Supported trial types are "mono1", "mono2", "combi", and "all". See scenario_jointBLRM() for details.

trials.of.interest.covars

Optional numerical vector with either length 1 or the same length as trials.of.interest. Indicates (if applicable) the value of the covariate that is of interest for one or all trials of interest. Entries can be either 0, 1, or NA, where 1 represents a value of 1 for the binary covariate, 0 indicates a value of 0, and NA indicates that both values are of interest for a given trial. Can be used to set a fixed covariate value for a trial of interest, which will cause the function to only compute, return, or plot the results using this value for some trial of interest. If the parameter trials.of.interest.covars is not given, the function will include the results for both values of the covariate for each trial (equivalent to setting trials.of.interest.covars = NA). If trials.of.interest.covars has length 1, the function will use the specified option for all trials of interest as given in trials.of.interest, otherwise it is assumed that trials.of.interest.covars[i] provides the option for the trial specified in trials.of.interest[i].

esc.rule

Optional character. Can be either "ewoc", "loss", "dynamic" or "dynamic.loss", where the latter two are treated synonymously. See scenario_jointBLRM() for details.

dosing.intervals

Optional numeric with 1, 2, or 3 ascending positive entries. Must have three entries when the esc.rule is set to "loss", "dynamic.loss", or "dynamic", otherwise (i.e. when esc.rule is "ewoc") lengths 1, 2, or 3 are permitted. See scenario_jointBLRM() for details.

ewoc.threshold

Optional numeric between 0 and 1. Overdosing thresholds for EWOC plots. Defaults to 0.25.

loss.weights

Optional numerical vector with four entries (which can be arbitrary numbers), the default is c(1,0,1,2). Specifies the weights used for loss escalation. See scenario_jointBLRM() for details.

dynamic.weights

Optional numerical matrix with four rows and four columns, and arbitrary numbers as entries. Specifies the interval weights/penalties that are used for dynamic loss escalation. See scenario_jointBLRM() for details.

prior.mu

Optional list that gives the prior distribution for the hyper means \(\mu\). See scenario_jointBLRM() for details.

prior.mu.covar

Optional named list that gives the prior distribution for the hyper-means of the additional parameters included in the joint BLRM to realize the binary covariate. Also refer to the Details section for the notation used in the following. The argumentprior.mu.covar must be a list with named entries mu_g1 and mu_g2. Both must have length 2, and provide the mean and SD of the hyper-means for the parameters corresponding to the covariate in compound 1 and 2. More precisely:

  • prior.mu.covar$mu_g1
    Numeric with length two, defaults to c(0, 1). Specifies mean and SD of the hypermean \(\mu_6\) of the parameter \(\gamma_1\) in the BLRM. The second entry must therefore be positive. See the Details section below for more detail.

  • prior.mu.covar$mu_g2
    Numeric with length two, defaults to c(0, 1). Specifies mean and SD of the hypermean \(\mu_7\) of the parameter \(\gamma_2\) in the BLRM. The second entry must therefore be positive. See the Details section below for more detail.

prior.tau

Optional list that gives the prior distribution for the between-trial heterogeneities (hyper SD) \(\tau\). See scenario_jointBLRM() for details.

prior.tau.covar

Optional named list that gives the prior distribution for the between-trial heterogeneities of the additional parameters included in the joint BLRM to realize the binary covariate. Also refer to the Details section for the notation used in the following. The argumentprior.tau.covar must be a list with named entries tau_g1 and tau_g2. Both must have length 2, and provide the mean and SD of the hyper-means for the parameters corresponding to the covariate in compound 1 and 2. More precisely:

  • prior.tau.covar$tau_g1
    Numeric with length two, defaults to c(0, 1). Specifies mean and SD of the between-trial heterogeneity \(\tau_{\gamma_1}\) of the parameter \(\gamma_1\) in the BLRM. The second entry must therefore be positive. See the Details section below for more detail.

  • prior.tau.covar$tau_g2
    Numeric with length two, defaults to c(log(0.125), log(2)/1.96). Specifies mean and SD of the between-trial heterogeneity \(\tau_{\gamma_2}\) of the parameter \(\gamma_2\) in the BLRM. The second entry must therefore be positive. See the Details section below for more detail.

two_sided1

Optional logical, defaults to TRUE. Indicates whether the covariate is assumed to have a two-sided effect on the DLT rate of compound 1. If FALSE, the function will assume a one-sided effect of the covariate on the DLT rate for compound 1. See the section Details below for a formal description.

two_sided2

Optional logical. Optional logical, defaults to TRUE. Indicates whether the covariate is assumed to have a two-sided effect on the DLT rate of compound 2. If FALSE, the function will assume a one-sided effect of the covariate on the DLT rate for compound 2. See the section Details below for a formal description.

saturating

Optional logical that activates the use of a saturating interaction term (instead of linear), defaults to FALSE. See scenario_jointBLRM() for details.

probs

Optional numeric with arbitrary entries between 0 and 1. Provides the levels for the quantiles displayed in the output. Defaults to c(0.025, 0.5, 0.975).

iter

Optional integer, number of total MCMC iterations per chain. Defaults to 26000. Note: Number of warmup iterations is counted towards iter, i.e. of the iter many iterations, the first warmup many samples are not saved.

warmup

Optional integer, number of warmup iterations discarded from total MCMC iterations per chain. Defaults to 1000. See scenario_jointBLRM() for details.

refresh

Optional integer. Given to Stan's refresh argument for rstan::sampling(), defaults to 0. See scenario_jointBLRM() for details.

adapt_delta

Optional numeric between 0.6 and 1, default is 0.8. Given to Stan's rstan::sampling() method in the control argument of Stan. See scenario_jointBLRM() for details.

max_treedepth

Optional integer, defaults to 15. See scenario_jointBLRM() for details.

chains

Optional integer. Number of Markov chains constructed by Stan. Defaults to 4.

digits

Optional integer, defaults to 5. See scenario_jointBLRM() for details.

seed

Optional positive integer that specifies the seed to be used for the simulation. See scenario_jointBLRM() for details.

path

Optional character that specified the path to save the resulting output files. If NULL (the default), no output is written (but still returned to R). Otherwise, it is checked whether path specifies a directory, and, if yes, all output is saved there.

file.name

Optional name for the output file. If NULL or missing, no output is saved (and also if no valid path is given). Results are only returned to R in this case. Note that plots will not be returned to R unless the additional argument plot.return is specified.

output.dosetrafo

Optional list of functions that will be applied to transform the doses given to the model to the doses presented in the output. By default, each transformation is the identiy function, meaning that doses are displayed as given to the model. The argument output.dosetrafo should be a named list. If the dose transformation shall depend on the compound and covariate, the list should have entries output.dosetrafo$"d1c0", output.dosetrafo$"d1c1", output.dosetrafo$"d2c0", and output.dosetrafo$"d1c2", where each entry is a function that accepts and returns a positive numeric. For the display of outputs (including plots), the function will be applied to transform the given doses, where [...]$d1c0 is used to transform dose/compound 1 when the covariate is 0 and [...]$d1c1 is used when the covariate is 1. The same applies to dose/compound 2. This argument can be used if there are e.g. different dosing schedules that are transformed to the same scale for modelling in a BLRM. For instance, if covariate 0 indicates a weekly schedule, and covariate 1 a bi-weekly schedule, one could set up the BLRM to operate on the total dose received over 2 weeks. For the weekly schedule, one may want to backtransform and display the weekly dose again instead of the dose received over two weeks, which could be accomplished by setting output.dosetrafo$"d2c0" = function(x) return(x/2) to cause the function to display half of the dose used for modelling for outputs about doses with covariate of 0. If one wants to supply a dose trnasofmration separately per trial arm type, one may include entries output.dosetrafo$mono1, output.dosetrafo$mono2, and output.dosetrafo$combi1, output.dosetrafo$combi2. This will only take effect if the previously described format is not provided. In case the dose tranformation is specified separately for mono1, mono2, and combi (combi1/2), monotherapy doses of interest are transformed with the respective transformation, and combination therapy doses with the combi1/2 transformation in the treatment compound 1/2.

plot.decisions

Optional logical, defaults to FALSE. If TRUE, plots of escalation decisions according to the specified escalation rule are created. See scenario_jointBLRM() for details.

plot.combi.heatmap

Optional logical, defaults to TRUE. If the value is TRUE, combination therapy plots are created as heatmaps instead of bar plots. This affects all escalation rules.

plot.int.probs.loss

Optional logical, defaults to FALSE. Only has an effect if esc.rule is either "loss" or "dynamic.loss". In this case, if the value is TRUE, additional plots will be created that display the interval probabilities to complement the (always created) plots that display the resulting expected loss.

plot.return

Optional logical, defaults to FALSE. If set to TRUE, the functions return the created plots to R in the result list. See scenario_jointBLRM() for details.

plot.file.format

Optional character, defaults to "pdf". Can either be "pdf", "jpeg" or "png". See scenario_jointBLRM() for details.

plot.width

Optional numerical value or vector, can have length 1 or 3 and must have positive entries. Provides the width of the output plots measured in the unit given in plot.unit. See scenario_jointBLRM() for details.

plot.height

Optional numerical value or vector, can have length 1 or 3 and must have positive entries. Provides the height of the output plots measured in the unit given in plot.unit. See scenario_jointBLRM() for details.

plot.unit

Optional character string, can be "in", "cm", or "mm". See scenario_jointBLRM() for details.

output.scen.config

Optional logical, defaults to FALSE. See scenario_jointBLRM() for details.

Value

List. The output list will have at least one entry for each trial of interest that provides a summary of the posterior toxicities. The summary will contain the posterior DLT rates using the covariate of interest of the corresponding trial as provided in the argument trials.of.interest.covars. If the latter is not specified or set to NA for a trial, the returned list will contain two entries for this trial, one for each value of the covariate. If output.scen.config

is TRUE, additional entries that give the input data are included.

If plot.return and plot.decisions are both TRUE, an additional entry is created that holds a list of all output plots as ggplot2::ggplot objects.

More precisely, the following list entries are always generated:

  • $trial-[...]_covar-[0/1]
    Here, [...] denotes the given trial name in trials.of.interest, while [0/1] is the value of the binary covariate used for the posterior. The entry gives a matrix that lists summary statistics and interval probabilities based on the posterior of the DLT rate of each of the doses of interest for a trial. Additionally, if loss escalation is active, the expected loss of each dose is listed.

If additionally output.scen.config is active, there will be the following additional entries:

  • $data
    Input data used to fit the joint BLRM. Includes all cohorts from both data and historical.data in a merged data matrix.

  • $prior
    Contains the specified (hyper-)prior distribution used by the joint BLRM.

  • $configuration
    Contains the remaining configurations, e.g. seed and escalation rule.

  • $'Stan options'
    Contains the arguments given to Stan, e.g. number of MCMC iterations and chains.

If the additional plot list is generated, there will be an entry:

  • $plots
    List that contains the output plots as ggplot2::ggplot objects. There will be one entry for each trial, namely

    • $plots$trial-[...]_covar-[0/1]
      Here, [...] denotes the trial name of one of the trials of interest, while [0/1] is the value of the binary covariate used for the posterior. The entry for a trial is either a single ggplot2::ggplot object or a list of such objects. The number of entries is determined by the remaining specifications for plots. E.g., if loss escalation is performed, there can be either just a plot of the expected loss for each dose, or additionally a second plot with the usual interval probabilities. Similarly, if the trial of interest is of type "all", there will be up to 3 plots, one for each trial type for which dose levels are included (mono 1, mono 2, combination).

Details

The basic joint BLRM is defined according to (Neuenschwander et al., 2014 and 2016). Refer to the section Details in the documentation of scenario_jointBLRM() for details of the general model definition.

In the following, we will describe how the function includes a binary covariate in the basic joint BLRM. Recall the parameter vector used for the joint BLRM without covariates for trial \(j\), i.e. $$\theta_j = (log(\alpha_{1j}), log(\beta_{1j}), log(\alpha_{2j}), log(\beta_{2j}), \eta_j).$$

To model the effect of a binary covariate \(c\in\{0,1\}\) on the DLT rate \(\pi_j(d_i)\) of dose \(d_i\) of compound \(i\) in monotherapy in trial \(j\), we will assume that there exist two additional parameters: \(\gamma_{1j}\) and \(\gamma_{2j}\). Here, we will assume further that the new parameters can take arbitrary values, i.e. \(-\infty < \gamma_{ij} < \infty\) and will later assume a normal distribution as prior. Each of the new parameters will be assumed to shift the intercept (\(log(\alpha_{ij})\)) of the logistic model for patients with \(c=1\), i.e. the covariate is assumed to act on the intercept compared to patients with \(c=0\).

The function scenario_covariate_jointBLRM() implements two-sided and one-sided action of the covariate. More precisely:

  • Two-sided:
    Two-sided effect of the covariate is (here) interpreted in the sense that patients with c=1 could have a larger, lower, or identical probability of experiencing a DLT at some dose compared to patients with c=0. It is assumed that we do not know which of these cases will apply, so that the covariate could increase or decrease the DLT rate of the model.

  • One-sided:
    One-sided effect of the covariate is (here) interpreted in the sense that patients with c=1 are assumed to have a larger probability of experiencing a DLT compared to patients with c=0, i.e., that the model for the DLT rate is enforcing the DLT rate for patients with \(c=1\) to be larger than for patients with \(c=0\). For obvious reasons, one-sided covariate action should only be applied when there is strong evidence that the patients with \(c=1\) must have a larger DLT rate than patients with \(c=0\).

One-sided one two-sided model for covariates

Formally, speaking, one-sided and two-sided covariates are implemented as follows in the joint BLRM with covariates. Writing \(\pi_j(d_i)\) for the DLT rate of dose \(d_i\) of compound \(i\) in trial \(j\), the BLRM with two-sided covariates assumes: $$ logit(\pi_j(d_i)) = log(\alpha_i) + \beta \cdot log\left(\frac{d_i}{d^*_i}\right) + c\cdot \gamma_{ij}. $$ In other words, the DLT rate for patients with \(c=0\) is assumed to follow the usual logistic model, while for patients with \(c=1\) the intercept is shifted by \(\gamma_{ij}\). In particular, the intercept of the logistic model could become larger or smaller, depending on the value of \(\gamma_{ij}\).

The one-sided model assumes instead $$ logit(\pi_j(d_i)) = log(\alpha_i) + \beta \cdot log\left(\frac{d_i}{d^*_i}\right) + c\cdot exp(\gamma_{ij}). $$ That is, the shift of the intercept is assumed to be a log-normally distributed variable, or, more specifically, we shift by \(exp(\gamma_{ij})\) for a normally distributed \(\gamma_{ij}\). In particular, the logit of the DLT rate, and therefore the DLT rate itself, is guaranteed to increase for \(c=1\) compared to \(c=0\).

Prior specification for joint BLRM with binary covariate

Note that we can assume \(\gamma_{ij}\) to be normally distributed both for the one-sided and two-sided models. This allows to include it in the hierarchical random effects model of the joint BLRM in the same fashion as the other model parameters. More specifically, we consider for trial \(j\) the seven-dimensional parameter vector $$\theta_j = \theta_j = (log(\alpha_{1j}), log(\beta_{1j}), log(\alpha_{2j}), log(\beta_{2j}), \eta_j, \gamma_{1j}, \gamma_{2j}).$$

For the random effects distribution, we can proceed analogously to the case of the joint BLRM without covariates. That is, for the general hierarchical prior assume that $$\theta_j|\mu,\Sigma \sim Normal_7(\mu, \Sigma)$$ for a shared hyper mean vector \(\mu\) and a shared hyper covariance matrix \(\Sigma\), with entries $$\mu=(\mu_1, \mu_2, \mu_3, \mu_4, \mu_5, \mu_6, \mu_7)$$ and $$\Sigma = (\Sigma_{kl})$$ for \(k=1,...,7\), \(l=1,...,7\). The entries \(\Sigma_{kl}\) are defined as $$\Sigma_{kk}=\tau_k\cdot\tau_k$$ on the diagonal, and as $$\Sigma_{kl}=\rho_{kl}\cdot\tau_k\cdot\tau_l$$ for \(k\) not equal to \(l\). Here, \(\rho_{kl}\) are the correlation coefficients of parameters \(k\) and \(l\), and \(\tau_k\) the standard deviations of their respective parameters. As before, we will assume all parameters to be uncorrelated, except for the intercept and log-slope of the model for same compound. That is, \(\rho_{kl}=0\) for all \(kl\), except for \(\rho_{12}\) and \(\rho_{34}\). The latter two are again assumed to be uniformly distributed on \([-1, 1]\).

The model is completed in the same way as the joint BLRM without covariate, by assuming $$\mu_k \sim Normal(m_{\mu_k}, s_{\mu_k}^2)$$ as hyper-prior for \(\mu_k\) respectively $$\tau_k \sim logNormal(m_{\tau_k}, s_{\tau_k}^2)$$ for \(\tau_k\).

Note that this model allows to use the same prior distributions as the joint BLRM without covariate for all parameters \(\mu_k\) and \(\tau_k\), except for the newly added \(\mu_6\), \(\mu_7\), \(\tau_6\), \(\tau_7\), which correspond to the hyper-mean and between-trial heterogeneity for the parameters \(\gamma_{ij}\). As before, we will use the parameter name as subscript of \(\mu_k\) and \(\tau_k\) to indicate the corresponding parameter.

For the function scenario_covariate_jointBLRM() and sim_covariate_jointBLRM(), the priors for \(\mu_6\), \(\mu_7\), \(\tau_6\), \(\tau_7\) are controlled in the arguments prior.mu.covar and prior.tau.covar, while the priors for all remaining \(\mu_k\) and \(\tau_k\) are specified in the arguments prior.mu and prior.tau, which use the same format and names as the joint BLRM functions without covariate.

The entries of prior.mu.covar correspond to the hyper-means for \(\gamma_{ij}\) as specified in the following table.

Entrymu_g1mu_g2
Parameter\(\gamma_{1j}\)\(\gamma_{2j}\)
Hyper Mean\(\mu_6=\mu_{\gamma_1}\)\(\mu_7=\mu_{\gamma_2}\)

Similarly, the entries of prior.tau.covar follow the conventions stated below.

Entrytau_g1tau_g2
Parameter\(\gamma_{1j}\)\(\gamma_{2j}\)
Hyper Mean\(\tau_6=\tau_{\gamma_1}\)\(\tau_7=\tau_{\gamma_2}\)

Note further that prior.mu.covar can therefore be used to control the size of the assumed difference across patients with \(c=0\) and \(c=1\). Assuming a two-sided covariate, setting e.g. prior.mu.covar$mu_g1[1]=0 as the mean, one essentially states that it is not known whether the covariate increases the DLT rate, while prior.mu.covar$mu_g1[1]>0 assumes that \(c=1\) is more likely to increase the DLT rate. Further, when increasing the SD by setting an higher value for prior.mu.covar$mu_g1[2], one essentially assumes larger uncertainty with respect to the potential influence of the covariate, allowing for greater differences across trials. Setting prior.mu.covar$mu_g1[2] to a value similar to prior.mu$mu_a1[2] would allow that the influence of the covariate potentially dominates the influence of the (shared) intercept \(log(\alpha_{ij})\), thereby reducing the degree of information sharing across cohorts with \(c=1\) and \(c=0\) substantially. Hence, using the default value of prior.mu$mu_a1[2]=2, one will usually not want to choose prior.mu.covar$mu_g1[2] larger than about 1 to 1.5. If one expects even larger uncertainty across \(c=1\) and \(c=0\), it may be advantageous to use a different model which includes this uncertainty explicitly (e.g. exchangeale-non-exchangeable-type random effects models as discussed in e.g. in (Schmidli et al., 2015), (Neuenschwander et al., 2016)).

The default values for prior.mu.covar are a relatively conservative setting and assume that there is little concrete knowledge about how the covariate influences the DLT rates, which is often a reasonable expectation in early trials. The default values should therefore be applicable in a wide range of settings, but can be adjusted and optimized in situations where there is concrete information about the influence of the covariate.

References

Stan Development Team (2020). RStan: the R interface to Stan. R package version 2.21.2. https://mc-stan.org

Neuenschwander, B., Branson, M., & Gsponer, T. (2008). Critical aspects of the Bayesian approach to phase I cancer trials. Statistics in medicine, 27(13), 2420-2439, doi:10.1002/sim.3230.

Neuenschwander, B., Matano, A., Tang, Z., Roychoudhury, S., Wandel, S., & Bailey, S. (2014). A Bayesian Industry Approach to Phase I Combination Trials in Oncology. In: Zhao. W & Yang, H. (editors). Statistical methods in drug combination studies. Chapman and Hall/CRC, 95-135, doi:10.1201/b17965.

Neuenschwander, B., Roychoudhury, S., & Schmidli, H. (2016). On the use of co-data in clinical trials. Statistics in Biopharmaceutical Research, 8(3), 345-354, doi:10.1080/19466315.2016.1174149.

Schmidli, H., Gsteiger, S., Roychoudhury, S., O'Hagan, A., Spiegelhalter, D., Neuenschwander, B. (2014). Robust Meta-Analytic-Predictive Priors in Clinical Trials with Historical Control Information. Biometrics, 70(4), 1023-1032 <doi: 10.1111/biom.12242>.

Babb, J., Rogatko, A., & Zacks, S. (1998). Cancer phase I clinical trials: Efficient dose escalation with overdose control. Statistics in medicine 17(10), 1103-1120.

Zhou, H., Yuan, Y., & Nie, L. (2018). Accuracy, safety, and reliability of novel phase I designs. Clinical Cancer Research, 24(21), 5483-5484 <doi: 10.1158/1078-0432.ccr-18-0168>.

Examples

if (FALSE) {
result <- scenario_covariate_jointBLRM(
                   data=list(dose1 = c(1, 2, 4, 6, 8, 0,  0,  0,  1,  2),
                             dose2 = c(0, 0, 0, 0, 0, 10, 20, 30, 10, 10),
                             n.pat = c(3, 3, 3, 3, 3, 3,  6,  9,  3,  3),
                             n.dlt = c(0, 0, 0, 0, 1, 0,  0,  1,  0,  0),
                             trial = c(1, 1, 1, 1, 1, 2,  2,  3,  3,  3),
                             covar = c(0, 0, 0, 0, 0, 1,  1,  1,  1,  1)
                             ),
                   trials.of.interest =        c(1,       3),
                   types.of.interest =         c("mono1", "combi"),
                   trials.of.interest.covars = c(0,       1),
                   doses.of.interest = rbind(
                     c(1, 2, 4, 6, 8, 12,  rep(c(1, 2, 4, 6, 8, 12),
                                               times=3)),
                     c(0, 0, 0, 0, 0, 0,   rep(c(10, 20, 30),
                                               each = 6 ))),
                   dose.ref1 = 12,
                   dose.ref2 = 30,
                   esc.rule = "dynamic.loss",
                   prior.mu = list(mu_a1 =  c(logit(0.33), 2),
                                   mu_b1 =  c(0,          1),
                                   mu_a2 =  c(logit(0.33), 2),
                                   mu_b2 =  c(0,          1),
                                   mu_eta = c(0,          1.121)),
                   prior.tau = list(tau_a1 =  c(log(0.25),  log(2)/1.96),
                                    tau_b1 =  c(log(0.125), log(2)/1.96),
                                    tau_a2 =  c(log(0.25),  log(2)/1.96),
                                    tau_b2 =  c(log(0.125), log(2)/1.96),
                                    tau_eta = c(log(0.125), log(2)/1.96)),
                   path = getwd(),
                   file.name = NULL,
                   iter=10000,
                   chains=4
                   )
}