| Title: | Monitoring Overall Survival in Pivotal Trials in Indolent Cancers |
|---|---|
| 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. |
| Authors: | 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] |
| Maintainer: | Thibaud Coroller <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.2.0 |
| Built: | 2026-05-15 09:10:29 UTC |
| Source: | https://github.com/novartis/monitos |
Server-side logic for the monitOS Shiny application. Computes OS monitoring boundaries reactively based on user inputs and renders the summary table of positivity thresholds.
app_server(input, output, session)app_server(input, output, session)
input |
Shiny input object containing UI widget values. |
output |
Shiny output object for rendering results. |
session |
Shiny session object for updating UI elements. |
User interface for the monitOS Shiny application. Provides a branded, guided workflow for setting OS monitoring parameters and reviewing the resulting positivity thresholds.
app_ui(request = NULL)app_ui(request = NULL)
request |
Shiny internal request object for bookmarking support. |
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"
bounds( events, power_int = 0.9, falsepos = 0.025, hr_null = 1.3, hr_alt = 0.9, rand_ratio = 1, hr_marg_benefit = NULL )bounds( events, power_int = 0.9, falsepos = 0.025, hr_null = 1.3, hr_alt = 0.9, rand_ratio = 1, hr_marg_benefit = NULL )
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. |
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).
List that contains:
lhr_null: Scalar, unacceptable OS log-HR,
lhr_alt: Scalar, plausible clinically relevant log-HR,
lhr_pos: Scalar, positivity thresholds for log-HR estimates,
summary: Dataframe, which contains:
OS HR threshold for positivity,
One sided false positive error rate,
Level of 2 sided CI needed to rule out hr_null,
Probability of meeting positivity threshold under hr_alt,
Positivity_Thres_Posterior: Pr(true OS HR >= minimum unacceptable OS HR | current data),
Positivity_Thres_PredProb: Pr(OS HR estimate at Final Analysis <= Final Analysis positivity threshold | current data)
# 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 )# 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 )
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').
calc_posterior(lhr_con, lhr_null, events)calc_posterior(lhr_con, lhr_null, events)
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 |
vector of length K - continuation thresholds expressed on posterior probability scale
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)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)
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
calc_predictive(lhr_con, events)calc_predictive(lhr_con, events)
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 |
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
lhr_con <- c(0.2, 0.15, 0.1) events <- c(100, 200, 300) calc_predictive(lhr_con, events)lhr_con <- c(0.2, 0.15, 0.1) events <- c(100, 200, 300) calc_predictive(lhr_con, events)
This function calculates the positivity threshold based on various criteria.
find_pos(pos_thld, events, rand_ratio, hr_null, hr_alt, which_crit, targ)find_pos(pos_thld, events, rand_ratio, hr_null, hr_alt, which_crit, targ)
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:
|
targ |
Numeric. The target value for the chosen criterion. |
Numeric. The calculated positivity threshold based on the specified criterion.
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 )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
meeting_probs(summary, lhr_pos, lhr_target = 1, rand_ratio = 1)meeting_probs(summary, lhr_pos, lhr_target = 1, rand_ratio = 1)
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. |
Array. Probabilities of meeting positivity threshold under target HR
Runs the Shiny application for exploring positivity thresholds to monitor overall survival (OS).
run_app()run_app()
No return value, runs shiny app