Performs a model-free tipping point analysis on time-to-event data by repeatedly imputing censored observations under varying assumptions. The model-free framework assumes that censored patients share similar survival behavior with those from whom they are sampled, without fitting any parametric survival model.
tipping_point_model_free(
dat,
reason,
impute,
J = 10,
tipping_range = seq(5, 95, by = 5),
cox_fit = NULL,
verbose = FALSE,
method = c("random sampling", "deterministic sampling"),
seed = NULL
)A tipse object containing:
Input argument from 'data'.
A data frame of combined pooled model results across tipping points
The original hazard ratio.
Input argument from 'reason'.
Input argument from 'impute'.
Input argument from 'method'.
A list of imputed datasets for each tipping point value.
Random seed.
data.frame containing at least 5 columns: TRT01P (treatment arm as factor), AVAL (survival time), EVENT (event indicator), CNSRRS (censoring reason) and MAXAVAL (maximum potential survival time, duration between randomization to data cut-off)
Vector specifying censoring reasons to be imputed.
a string specifying the treatment arm(s) which require imputation. It must be one of the arms from variable TRT01P, the first level of TRT01P is considered as the control arm.
numeric indicating number of imputations.
Numeric vector. Percentiles to use when method = "random sampling". Number of patients to impute when method = "deterministic sampling".
A Cox model that will be used to calculate HRs on imputed datasets. In case of inclusion of stratification factors or covariates, conditional HR will be used.
Logical. If TRUE, prints progress and analysis details.
Character. Either "random sampling" or "deterministic sampling".
Integer, default as NULL. Random seed for reproducibility.
The model-free tipping point analysis provides a reproducible and intuitive framework for exploring the robustness of treatment effects in time-to-event (survival) endpoints when censoring may differ between study arms.
Two sampling modes are supported:
method = "random sampling" - performs re-sampling of event
times from the best or worst percentile of observed patients ranked by their event or censoring time.
The tipping_range specifies the percentiles of the observed data from which
event times will be sampled to impute censored patients.
For the treatment arm, use the worst percentiles (shortest survival times) from the
observed data of both arms. For the control arm, use the best percentiles (longest survival times).
method = "deterministic sampling" - imputes a fixed number of censored
patients deterministically. The tipping_range specifies the number of patients to be imputed.
For the treatment arm, it defines the number of patients that will be assumed to
have an event at their time of censoring. For the control arm, it defines the
number of patients that will be assumed to be event-free at data cut-off, their maximum potential follow-up time.
This function iteratively applies the random- or deterministic-sampling
imputation procedure across a range of
tipping point parameters tipping_range. For each parameter value:
Multiple imputed datasets are generated (J replicates), where censored
observations in the selected arm are replaced by sampled or reassigned
event times according to the imputation method.
A Cox proportional hazards model is fitted to each imputed dataset.
Model estimates are pooled using Rubin’s rules to obtain a combined hazard ratio and confidence interval for that tipping point parameter.
The process yields a series of results showing how the treatment effect changes as increasingly conservative or optimistic assumptions are made about censored observations. The tipping point is defined as the smallest value of the sensitivity parameter (percentile or number of imputed patients) for which the upper bound of the hazard ratio confidence interval crosses 1 - i.e., where the apparent treatment benefit is lost.
cox1 <- survival::coxph(Surv(AVAL, EVENT) ~ TRT01P, data = codebreak200)
result <- tipping_point_model_free(
dat = codebreak200,
reason = "Early dropout",
impute = "docetaxel",
J = 10,
tipping_range = seq(5, 95, by = 5),
cox_fit = cox1,
verbose = TRUE,
method = "random sampling"
)
result2 <- tipping_point_model_free(
dat = codebreak200,
reason = "Early dropout",
impute = "docetaxel",
J = 10,
tipping_range = seq(1, 21, by = 2),
cox_fit = cox1,
verbose = TRUE,
method = "deterministic sampling"
)
Run the code above in your browser using DataLab