boinet: BOIN-ET: Bayesian Optimal Interval Design for Dose-Finding...

View source: R/boinet.R

boinetR Documentation

BOIN-ET: Bayesian Optimal Interval Design for Dose-Finding Based on Efficacy and Toxicity

Description

Conducts simulation studies of the BOIN-ET (Bayesian Optimal Interval design for dose finding based on both Efficacy and Toxicity outcomes) design to evaluate its operating characteristics for identifying the optimal biological dose (OBD). The BOIN-ET design extends the Bayesian optimal interval (BOIN) design, which is nonparametric and thus does not require the assumption used in model-based designs, in order to identify an optimal dose based on both efficacy and toxicity outcomes.

Unlike traditional phase I designs that focus solely on toxicity to find the maximum tolerated dose (MTD), BOIN-ET addresses the modern need to balance safety and efficacy for targeted therapies, immunotherapies, and biologics where the efficacy of the drug does not always increase and could plateau at a lower dose.

Usage

boinet(
  n.dose, start.dose, size.cohort, n.cohort,
  toxprob, effprob,
  phi = 0.3, phi1 = phi*0.1, phi2 = phi*1.4,
  delta = 0.6, delta1 = delta*0.6,
  alpha.T1 = 0.5, alpha.E1 = 0.5, tau.T, tau.E,
  te.corr = 0.2, gen.event.time = "weibull",
  accrual, gen.enroll.time = "uniform",
  stopping.npts = size.cohort*n.cohort,
  stopping.prob.T = 0.95, stopping.prob.E = 0.99,
  estpt.method = "obs.prob", obd.method = "max.effprob",
  w1 = 0.33, w2 = 1.09,
  plow.ast = phi1, pupp.ast = phi2,
  qlow.ast = delta1/2, qupp.ast = delta,
  psi00 = 40, psi11 = 60,
  n.sim = 1000, seed.sim = 100)

Arguments

n.dose

Integer specifying the number of dose levels to investigate.

start.dose

Integer specifying the starting dose level (1 = lowest dose). Generally recommended to start at the lowest dose for safety.

size.cohort

Integer specifying the number of patients per cohort. Commonly 3 or 6 patients, with 3 being standard for early-phase trials.

n.cohort

Integer specifying the maximum number of cohorts. Total sample size = size.cohort*n.cohort.

toxprob

Numeric vector of length n.dose specifying the true toxicity probabilities for each dose level. Used for simulation scenarios.

effprob

Numeric vector of length n.dose specifying the true efficacy probabilities for each dose level. Used for simulation scenarios.

phi

Numeric value between 0 and 1 specifying the target toxicity probability. Represents the maximum acceptable toxicity rate. Default is 0.3 (30%).

phi1

Numeric value specifying the highest toxicity probability that is deemed sub-therapeutic such that dose-escalation should be pursued. Doses with toxicity <= phi1 are considered under-dosed. Default is phi*0.1.

phi2

Numeric value specifying the lowest toxicity probability that is deemed overly toxic such that dose de-escalation is needed. Doses with toxicity >= phi2 are considered over-dosed. Default is phi*1.4.

delta

Numeric value between 0 and 1 specifying the target efficacy probability. Represents the desired minimum efficacy rate. Default is 0.6 (60%).

delta1

Numeric value specifying the minimum probability deemed efficacious such that the dose levels with efficacy < delta1 are considered sub-therapeutic. Default is delta*0.6.

alpha.T1

Numeric value specifying the probability that a toxicity outcome occurs in the late half of the toxicity assessment window. Used for event time generation. Default is 0.5.

alpha.E1

Numeric value specifying the probability that an efficacy outcome occurs in the late half of the efficacy assessment window. Used for event time generation. Default is 0.5.

tau.T

Numeric value specifying the toxicity assessment window in days. All toxicity evaluations must be completed within this period.

tau.E

Numeric value specifying the efficacy assessment window in days. All efficacy evaluations must be completed within this period.

te.corr

Numeric value between -1 and 1 specifying the correlation between toxicity and efficacy, specified as Gaussian copula parameter. Default is 0.2 (weak positive correlation).

gen.event.time

Character string specifying the distribution for generating event times. Options are "weibull" (default) or "uniform". A bivariate Gaussian copula model is used to jointly generate the time to first toxicity and efficacy outcome, where the marginal distributions are set to Weibull distribution when gen.event.time="weibull", and uniform distribution when gen.event.time="uniform".

accrual

Numeric value specifying the accrual rate (days), which is the average number of days between patient enrollments. Lower values indicate faster accrual.

gen.enroll.time

Character string specifying the distribution for enrollment times. Options are "uniform" (default) or "exponential". Uniform distribution is used when gen.enroll.time="uniform", and exponential distribution is used when gen.enroll.time="exponential".

stopping.npts

Integer specifying the maximum number of patients per dose for early study termination. If the number of patients at the current dose reaches this criteria, the study stops the enrollment and is terminated. Default is size.cohort*n.cohort.

stopping.prob.T

Numeric value between 0 and 1 specifying the early study termination threshold for toxicity. If P(toxicity > phi) > stopping.prob.T, the dose levels are eliminated from the investigation. Default is 0.95.

stopping.prob.E

Numeric value between 0 and 1 specifying the early study termination threshold for efficacy. If P(efficacy < delta1) > stopping.prob.E, the dose levels are eliminated from the investigation. Default is 0.99.

estpt.method

Character string specifying the method for estimating efficacy probabilities. Options: "obs.prob" (observed efficacy probabilitiesrates), "fp.logistic" (fractional polynomial), or "multi.iso" (model averaging of multiple unimodal isotopic regression). Default is "obs.prob".

obd.method

Character string specifying the method for OBD selection. Options: "utility.weighted", "utility.truncated.linear", "utility.scoring", or "max.effprob" (default).

w1

Numeric value specifying the weight for toxicity-efficacy trade-off in "utility.weighted" method. Default is 0.33.

w2

Numeric value specifying the penalty weight for toxic doses in "utility.weighted" method. Default is 1.09.

plow.ast

Numeric value specifying the lower toxicity threshold for "utility.truncated.linear" method. Default is phi1.

pupp.ast

Numeric value specifying the upper toxicity threshold for "utility.truncated.linear" method. Default is phi2.

qlow.ast

Numeric value specifying the lower efficacy threshold for "utility.truncated.linear" method. Default is delta1/2.

qupp.ast

Numeric value specifying the upper efficacy threshold for "utility.truncated.linear" method. Default is delta.

psi00

Numeric value specifying the utility score for (toxicity=no, efficacy=no) in "utility.scoring" method. Default is 40.

psi11

Numeric value specifying the utility score for (toxicity=yes, efficacy=yes) in "utility.scoring" method. Default is 60.

n.sim

Integer specifying the number of simulated trials. Default is 1000. Higher values provide more stable operating characteristics.

seed.sim

Integer specifying the random seed for reproducible results. Default is 100.

Details

Design Philosophy and Context:

One of the main purposes of a phase I dose-finding trial in oncology is to identify an optimal dose (OD) that is both tolerable and has an indication of therapeutic benefit for subjects in subsequent phase II and III trials. Traditional dose-finding methods assume monotonic dose-toxicity and dose-efficacy relationships, but this assumption often fails for modern cancer therapies.

The BOIN-ET design is a model-assisted approach, not model-based, which makes it:

  • Robust: No parametric assumptions about dose-response curves

  • Simple: Pre-tabulated decision rules make implementation transparent

  • Flexible: Accommodates various toxicity and efficacy scenarios

  • Clinically interpretable: Decisions based on intuitive probability intervals

Key Design Features:

Dose Escalation/De-escalation Rules: The design uses pre-calculated boundaries (lambda1, lambda2, eta1) to make dosing decisions:

  • Escalate: When toxicity <= lambda1 AND efficacy <= eta1

  • Stay: When lambda1 < toxicity < lambda2 AND efficacy > eta1

  • De-escalate: When toxicity >= lambda2

  • Efficacy-guided: When lambda1 < toxicity < lambda2 AND efficacy <= eta1

Assessment Windows: Unlike time-to-event designs, standard BOIN-ET waits for complete outcome assessment within specified windows (tau.T for toxicity, tau.E for efficacy) before making dose decisions. This ensures data completeness but may slow accrual.

Early Stopping Rules: The design includes safety and futility stopping criteria based on posterior probabilities exceeding pre-specified thresholds (stopping.prob.T, stopping.prob.E).

OBD Selection Methods: Multiple utility-based approaches are available for final dose selection:

  • utility.weighted: Balances efficacy and toxicity with user-defined weights

  • utility.truncated.linear: Uses piecewise linear utility functions

  • utility.scoring: Discrete scoring system for outcome combinations

  • max.effprob: Maximizes efficacy among acceptably safe doses

When to Use BOIN-ET vs TITE-BOIN-ET:

Use BOIN-ET when:

  • Outcomes occur relatively quickly (within assessment windows)

  • Patient accrual is slow enough to wait for complete assessments

  • You prefer simpler implementation without time-to-event modeling

  • Historical precedent suggests minimal late-onset effects

Use TITE-BOIN-ET when:

  • Late-onset toxicity or efficacy is expected

  • Rapid patient accrual is anticipated

  • Trial duration is a critical constraint

Simulation Output Interpretation:

The simulation results provide crucial operating characteristics:

  • prop.select: Probability of correctly identifying each dose as OBD

  • n.patient: Expected patient allocation across doses

  • prop.stop: Probability of early termination without OBD selection

  • duration: Expected trial duration

Value

A list object of class "boinet" containing the following components:

toxprob

True toxicity probabilities used in simulation.

effprob

True efficacy probabilities used in simulation.

phi

Target toxicity probability.

delta

Target efficacy probability.

lambda1

Lower toxicity decision boundary.

lambda2

Upper toxicity decision boundary.

eta1

Lower efficacy decision boundary.

tau.T

Toxicity assessment window (days).

tau.E

Efficacy assessment window (days).

accrual

Accrual rate (days).

estpt.method

Method used for efficacy probability estimation.

obd.method

Method used for optimal biological dose selection.

n.patient

Average number of patients treated at each dose level across simulations.

prop.select

Percentage of simulations selecting each dose level as OBD.

prop.stop

Percentage of simulations terminating early without OBD selection.

duration

Expected trial duration in days.

Note

  • Design parameters must satisfy: phi1 < phi < phi2 and delta1 < delta

  • Toxicity and efficacy probability vectors must have length n.dose

  • The design waits for complete outcome assessment before dose decisions

  • Consider TITE-BOIN-ET for trials with late-onset outcomes or rapid accrual

  • Boundary values (lambda1, lambda2, eta1) are automatically optimized via grid search

References

  • Takeda, K., Taguri, M., & Morita, S. (2018). BOIN-ET: Bayesian optimal interval design for dose finding based on both efficacy and toxicity outcomes. Pharmaceutical Statistics, 17(4), 383-395.

  • Yamaguchi, Y., Takeda, K., Yoshida, S., & Maruo, K. (2024). Optimal biological dose selection in dose-finding trials with model-assisted designs based on efficacy and toxicity: a simulation study. Journal of Biopharmaceutical Statistics, 34(3), 379-393.

See Also

tite.boinet for the time-to-event version that handles late-onset outcomes, obd.select for optimal biological dose selection methods, utility.weighted, utility.truncated.linear, utility.scoring for utility functions, gridoptim for boundary optimization.

Examples

# Example 1: Basic BOIN-ET simulation for targeted therapy
# Scenario: Non-monotonic efficacy with moderate toxicity

n.dose      <- 5
start.dose  <- 1
size.cohort <- 3
n.cohort    <- 15  # Total: 45 patients

# Dose levels: 25mg, 50mg, 100mg, 200mg, 400mg
toxprob <- c(0.05, 0.10, 0.25, 0.40, 0.60)  # Monotonic toxicity
effprob <- c(0.20, 0.45, 0.70, 0.65, 0.55)  # Non-monotonic efficacy (plateau effect)

# Conservative targets for targeted therapy
phi   <- 0.25  # 25% maximum toxicity
delta <- 0.60  # 60% target efficacy

# Assessment windows
tau.T   <- 28  # 4 weeks for toxicity
tau.E   <- 84  # 12 weeks for efficacy
accrual <- 14  # 2 weeks between patients

# Use observed probabilities and maximum efficacy method
estpt.method <- "obs.prob"
obd.method   <- "max.effprob"

# Run simulation (small n.sim for example)
results <- boinet(
  n.dose = n.dose, start.dose = start.dose,
  size.cohort = size.cohort, n.cohort = n.cohort,
  toxprob = toxprob, effprob = effprob,
  phi = phi, delta = delta,
  tau.T = tau.T, tau.E = tau.E, accrual = accrual,
  estpt.method = estpt.method, obd.method = obd.method,
  n.sim = 100
)

# Display key results
print(results$prop.select)  # OBD selection probabilities
print(results$n.patient)    # Patient allocation
print(results$duration)     # Expected trial duration

# Example 2: Immunotherapy with utility-weighted OBD selection
# Higher tolerance for toxicity if efficacy is present

n.dose      <- 4
size.cohort <- 6  # Larger cohorts for immunotherapy
n.cohort    <- 10

# Immunotherapy dose-response pattern
toxprob <- c(0.10, 0.20, 0.35, 0.50)
effprob <- c(0.15, 0.30, 0.50, 0.45)  # Slight plateau at highest dose

phi   <- 0.35  # Higher toxicity tolerance
delta <- 0.40  # Lower efficacy requirement

tau.T   <- 42  # 6 weeks for immune-related toxicity
tau.E   <- 112 # 16 weeks for immune response
accrual <- 7   # Weekly accrual

# Use utility-weighted method to balance toxicity-efficacy
results_utility <- boinet(
  n.dose = n.dose, start.dose = 1,
  size.cohort = size.cohort, n.cohort = n.cohort,
  toxprob = toxprob, effprob = effprob,
  phi = phi, delta = delta,
  tau.T = tau.T, tau.E = tau.E, accrual = accrual,
  estpt.method = "fp.logistic",  # Flexible dose-response modeling
  obd.method = "utility.weighted",
  w1 = 0.4,  # Moderate toxicity penalty
  w2 = 0.8,  # Additional penalty for high toxicity
  n.sim = 100
)

# Display key results
print(results_utility$prop.select)  # OBD selection probabilities
print(results_utility$n.patient)    # Patient allocation
print(results_utility$duration)     # Expected trial duration


boinet documentation built on June 27, 2025, 1:08 a.m.