Title: Monitoring Overall Survival in Pivotal Trials in Indolent Cancers
URL: https://opensource.nibr.com/monitOS/, https://github.com/Novartis/monitOS
BugReports: https://github.com/Novartis/monitOS/issues
Version: 0.1.6
Description: These guidelines are meant to provide a pragmatic, yet rigorous, help to drug developers and decision makers, since they are shaped by three fundamental ingredients: the clinically determined margin of detriment on OS that is unacceptably high (delta null); the benefit on OS that is plausible given the mechanism of action of the novel intervention (delta alt); and the quantity of information (i.e. survival events) it is feasible to accrue given the clinical and drug development setting. The proposed guidelines facilitate transparent discussions between stakeholders focusing on the risks of erroneous decisions and what might be an acceptable trade-off between power and the false positive error rate.
License: MIT + file LICENSE
Maintainer: Thibaud Coroller <thibaud.coroller@novartis.com>
Encoding: UTF-8
RoxygenNote: 7.3.2
Imports: stats, glue, shiny, shinydashboard,
Suggests: testthat (≥ 3.0.0), knitr, rmarkdown, pkgdown
Language: en-US
NeedsCompilation: no
Packaged: 2025-07-17 17:27:03 UTC; corolth1
Author: Thomas Fleming [ctb], Lisa Hampson [aut], Bharani Bharani-Dharan [ctb], Frank Bretz [ctb], Arunava Chakravartty [ctb], Thibaud Coroller [aut, cre], Evanthia Koukouli [aut], Janet Wittes [ctb], Nigel Yateman [ctb], Emmanuel Zuber [ctb], Novartis Pharma AG [cph]
Repository: CRAN
Date/Publication: 2025-07-17 17:50:02 UTC

Shiny app server

Description

Shiny app server

Usage

app_server(input, output, session)

Arguments

input

generic shiny var

output

generic shiny var

session

generic shiny var


Shiny app UI

Description

Shiny app UI

Usage

app_ui(request)

Arguments

request

generic shiny var


Bounds

Description

OS monitoring guidelines as proposed in manuscript "Monitoring Overall Survival in Pivotal Trials in Indolent Cancers". Calculate thresholds for positivity that can be used at an analysis to judge whether emerging evidence about the effect of treatment on OS is concerning or not. The threshold for positivity at any given analysis is the value below which the observed hazard ratio must be in order to provide sufficient reassurance that the effect on OS does not reach the selected unacceptable level of detriment (the margin hr_null). Terminology follows the manuscript "Monitoring Overall Survival in Pivotal Trials in Indolent Cancers"

Usage

bounds(
  events,
  power_int = 0.9,
  falsepos = 0.025,
  hr_null = 1.3,
  hr_alt = 0.9,
  rand_ratio = 1,
  hr_marg_benefit = NULL
)

Arguments

events

Vector. Target number of deaths at each analysis

power_int

Scalar. Marginal power required at the Primary Analysis when true hazard ratio (HR) is hr_alt.

falsepos

Scalar. Marginal one-sided false positive error rate we are prepared to tolerate at the Final Analysis. Determines the positivity threshold at Final Analysis

hr_null

Scalar. The unacceptably large detrimental effect of treatment on OS we want to rule out (on HR scale)

hr_alt

Scalar. Plausible clinically relevant beneficial effect of treatment on OS (on HR scale)

rand_ratio

Integer. If patients are randomized k:1 between experimental intervention and control, rand_ratio should be inputted as k. Example: if patients are randomized 1:1 between experimental and control, k=1. If patients are randomized 2:1 between experimental and control, k=2.

hr_marg_benefit

Scalar. We may be uncertain about what a plausible beneficial effect of treatment on OS is. User can enter a (on HR scale) and function will evaluate the probability we meet the positivity threshold at each analysis under this HR. This second OS benefit will usually be closer to 1 than hr_alt.

Details

Monitoring guidelines assume that the hazard ratio (HR) can adequately summarize the size of the benefits and harms of the experimental intervention vs control on overall survival (OS). Furthermore, guidelines assume that an OS HR < 1 is consistent with a beneficial effect of the intervention on OS (and smaller OS HRs <1 indicate increased efficacy).

Value

List that contains:

Examples

# Example 01: OS monitoring guideline retrospectively applied to Motivating Example 1
# with delta null = 1.3, delta alt = 0.80, gamma_FA = 0.025 and  beta_PA = 0.10.
bounds(
  events = c(60, 89, 110, 131, 178),
  power_int = 0.9, # beta_PA
  falsepos = 0.025, # gamma_FA
  hr_null = 1.3, # delta_null
  hr_alt = 0.8, # delta_alt
  rand_ratio = 1, # rand_ratio
  hr_marg_benefit = NULL
)
# Example 02: OS monitoring guideline applied to Motivating Example 2
# with delta null = 4/3, delta alt = 0.7, gamma_FA = 0.20 and beta_PA = 0.1.
bounds(
  events = c(60, 89, 110, 131, 178),
  power_int = 0.9, # beta_PA
  falsepos = 0.025, # gamma_FA
  hr_null = 1.3, # delta_null
  hr_alt = 0.8, # delta_alt
  rand_ratio = 1, # rand_ratio
  hr_marg_benefit = 0.95
)

Function which calculates for k=1, ..., K, Pr(log-HR >= lhr_null | theta.hat.k = lhr_con.k)

Description

i.e. the posterior probability the true OS log-hr exceeds the minimum unacceptable OS log-HR given the estimate of the log-hr at analysis k equals lhr_con.k (i.e. the estimate is equal to the stage k 'continuation threshold').

Usage

calc_posterior(lhr_con, lhr_null, events)

Arguments

lhr_con

vector of length K (# number of looks at OS data) containing 'continuation' thresholds on log-HR scale

lhr_null

scalar - minimum unacceptable OS log-HR

events

vector length K - number of OS events at each look at the data

Value

vector of length K - continuation thresholds expressed on posterior probability scale

Examples

lhr_con <- c(0.2, 0.15, 0.1)
lhr_null <- 0.25
events <- c(100, 200, 300)
calc_posterior(lhr_con, lhr_null, events)

Calculate posterior predictive probability of ruling out lhr_null at final OS analysis

Description

Calculates the posterior predictive probability of 'ruling out' lhr_null at final OS analysis given current estimate of OS log-HR is lhr_cont_k, for k=1, ..., K-1

Usage

calc_predictive(lhr_con, events)

Arguments

lhr_con

vector of length K (# number of looks at OS data) containing 'continuation' thresholds on log-HR scale

events

vector length K - number of OS events at each look at the data

Value

vector of length K-1: continuation thresholds at analyses k=1, ..., K-1 expressed on scale of posterior predictive probability of ruling out lhr_null at final OS analysis

Examples

lhr_con <- c(0.2, 0.15, 0.1)
events <- c(100, 200, 300)
calc_predictive(lhr_con, events)

Find Positivity Threshold

Description

This function calculates the positivity threshold based on various criteria.

Usage

find_pos(pos_thld, events, rand_ratio, hr_null, hr_alt, which_crit, targ)

Arguments

pos_thld

Numeric. The initial positivity threshold.

events

Numeric vector of length 2. The number of events at each analysis.

rand_ratio

Numeric. The randomization ratio.

hr_null

Numeric. The hazard ratio under the null hypothesis.

hr_alt

Numeric. The hazard ratio under the alternative hypothesis.

which_crit

Integer. The criterion to be used for finding the positivity threshold:

  • 1: False positive / False negative equals required value.

  • 2: False positive / (False negative + False positive) equals required value.

  • 3: False positive equals required value.

  • 4: Predictive probability equals required value.

targ

Numeric. The target value for the chosen criterion.

Value

Numeric. The calculated positivity threshold based on the specified criterion.

Examples

find_pos(
  pos_thld = 1.5,
  events = c(100, 200),
  rand_ratio = 1,
  hr_null = 1,
  hr_alt = 1.5,
  which_crit = 1,
  targ = 0.05
)


Probabilities of meeting positivity threshold under target HR

Description

Probabilities of meeting positivity threshold under target HR

Usage

meeting_probs(summary, lhr_pos, lhr_target = 1, rand_ratio = 1)

Arguments

summary

DataFrame. Summary dataframe from bounds.R

lhr_pos

List. Log HRs for positive threshold

lhr_target

Scalar. Target log HR to calculate the probability of meeting positivity thresholds

rand_ratio

Integer. If patients are randomized k:1 between experimental intervention and control, rand_ratio should be inputted as k. Example: if patients are randomized 1:1 between experimental and control, k=1. If patients are randomized 2:1 between experimental and control, k=2.

Value

Array. Probabilities of meeting positivity threshold under target HR


monitOS app

Description

Runs the shiny app to guide user choice adequate settings to calculate the positivity thresholds to monitor overall survival (OS)

Usage

run_app()

Value

No return value, runs shiny app