Learn R Programming

iAdapt

R package for early phase adaptive two-stage clinical trial design for toxicity and immunologic outcomes in oncology.

Installation

To install the package, run the following code:

install.packages("devtools")
devtools::install_github("alyssamv/iAdapt")

Overview

This package provides software based on the early phase trial design by Chiuzan et al. (2018). Stage 1 is safety-driven dose-escalation, and Stage 2 employs efficacy-driven randomization while continuing to monitor dose safety.

The design uses a likelihood paradigm, rather than rules. e.g. In Stage 1, when the likelihood ratio for a dose is greater than a prespecified threshold, the dose is considered acceptably safe and subsequent patients are enrolled on the next dose level. Conversely, if the likelihood ratio is less than or equal to the threshold, escalation is stopped.

One hallmark of this design is its ability to identify the most effective dose in the presence of a non-monotone dose-response curve - a phenomenon common in immunotherapies. Additionally, it follows a frequentist framework, but allows for adaptive design components.

The function of this package is two-fold:

  • Produce trial outcomes through simulation for an inputted scenario, and
  • Implement the design in a real trial.

The package is built for use with binary toxicity outcomes (dose-limiting toxicities) and the quasi-continuous toxicity "normalized total toxicity profile". Additional information on the nTTP can be found in Du et al. (2018) .

Vignettes are provided to walk the user through each function of the package.

Background

This design is relevant in the face of a non-monotonous dose-response relationship - a phenomenon that most often seen in immunologic therapies. Additionally, the probabilistic nature (as opposed to rule-based) provides an advantage in identifying the optimal dose to carry forward in development, by allowing more than one dose to be examined for efficacy.

Dose-response relationship

Often, dose-finding designs rely on a monotone dose-response curve, meaning that as dose increases, we expect the drug's effectiveness to increase too. This is a convenient assumption, though not always accurate. Instead, a relationship may exist in which case some dose-escalation designs may falsely move a higher dose forward.

Copy Link

Version

Install

install.packages('iAdapt')

Monthly Downloads

228

Version

2.0.1

License

LGPL-3

Maintainer

Alyssa Vanderbeek

Last Published

August 6th, 2021

Functions in iAdapt (2.0.1)

rand.stg2

Stage 2 Adaptive Randomization
safe.dose

Identify safe/acceptable doses from stage 1 based on observed binary toxicity
runExample

Launch Shiny app
sim.trials.nTTP

Simulate full trial (both stages) x times when using nTTP to measure toxicity
tox.profile

Generates DLTs and calculates the likelihood-ratio (LR) for each dose
rand.stg2.nTTP

Stage 2 Adaptive Randomization with nTTP to monitor toxicity
tox.profile.nTTP

Generate nTTPs toxicity scores and the likelihhood-ratio (LR) per dose
sim.trials

Simulate full trial (both stages) x times
sim.summary

Visualize simulation results (Stages 1&2)
safe.dose.nTTP

Identify safe/acceptable doses from stage 1 based on nTTP scores.
sim.plot

Generate plots for estimated percent allocation and response per dose.
get.thresh

Obtain average nTTP at each dose level
dlt.prob

Calculate DLT probability corresponding to average nTTP for each dose
LRtox

Calculates likelihood of safety for single dose
nTTP.indiv.sim

Simulate full trial (both stages) x times when using nTTP to measure toxicity
TOX

Sample array of toxicity probabilities for 6 doses. Taken from Du et al.
eff.stg1.nTTP

Generates efficacy outcomes for stage 1 when using nTTP to measure toxicity
eff.stg1

Generates efficacy outcomes for stage 1 when using binary toxicity
rand.prob

Calculates randomization probabilities and dose allocation for next patient
LRtox.nTTP

Calculates likelihood of safety for single dose, using nTTP
beta.ab

Generates parameters for the beta distribution # I don't think we need to show this as a separate function, but put together with gen.eff.stg1 or be called by gen.eff.stg1