
OLE Analysis Workflow
Lei Shi, Matthew Secrest
2026-05-22
Source:vignettes/OLE_analysis_workflow.Rmd
OLE_analysis_workflow.RmdOLE phase
This vignette demonstrates the open-label extension (OLE) phase analysis workflow using the difference-in-differences (DID) and synthetic control method (SCM) estimators proposed in Zhou et al. (2024) for estimating long-term treatment effects when the control group switches to treatment.
1 DID methods
1.1 DID-EC-IPW
method <- did_ec_ipw(
ps_formula = "S ~ x1 + x2 + x3 + x4 + x5",
trt_formula = "A ~ x1 + x2 + x3 + x4 + x5",
bootstrap = 50
)
analysis <- setup_analysis_OLE(
data = SyntheticData,
trial_status_col_name = "S",
treatment_col_name = "A",
outcome_col_name = c("y1", "y2", "y3", "y4"),
covariates_col_name = c("x1", "x2", "x3", "x4", "x5"),
T_cross = 2,
method_OLE_obj = method
)
run_analysis(analysis)## point_estimates lower_CI_boot upper_CI_boot
## tau3 2.075926 0.1198765 4.230701
## tau4 4.389438 0.8192601 7.040613
1.2 DID-EC-AIPW
model_forms <- c(
"y1 ~ x1 + x2 + x3 + x4 + x5",
"y2 ~ x1 + x2 + x3 + x4 + x5",
"y3 ~ x1 + x2 + x3 + x4 + x5",
"y4 ~ x1 + x2 + x3 + x4 + x5"
)
method <- did_ec_aipw(
ps_formula = "S ~ x1 + x2 + x3 + x4 + x5",
trt_formula = "A ~ x1 + x2 + x3 + x4 + x5",
outcome_formula = model_forms,
bootstrap = 50
)
analysis <- setup_analysis_OLE(
data = SyntheticData,
trial_status_col_name = "S",
treatment_col_name = "A",
outcome_col_name = c("y1", "y2", "y3", "y4"),
covariates_col_name = c("x1", "x2", "x3", "x4", "x5"),
T_cross = 2,
method_OLE_obj = method
)
run_analysis(analysis)## point_estimates lower_CI_boot upper_CI_boot
## tau3 2.041727 -1.3020727 4.372254
## tau4 4.036118 0.6559398 7.388494
1.3 DID-EC-OR
model_forms <- c(
"y1 ~ x1 + x2 + x3 + x4 + x5",
"y2 ~ x1 + x2 + x3 + x4 + x5",
"y3 ~ x1 + x2 + x3 + x4 + x5",
"y4 ~ x1 + x2 + x3 + x4 + x5"
)
method <- did_ec_or(
outcome_formula_ext = model_forms,
outcome_formula_rct_ctrl = model_forms,
outcome_formula_rct_trt = model_forms,
bootstrap = 50
)
analysis <- setup_analysis_OLE(
data = SyntheticData,
trial_status_col_name = "S",
treatment_col_name = "A",
outcome_col_name = c("y1", "y2", "y3", "y4"),
covariates_col_name = c("x1", "x2", "x3", "x4", "x5"),
T_cross = 2,
method_OLE_obj = method
)
run_analysis(analysis)## point_estimates lower_CI_boot upper_CI_boot
## tau3 1.568947 -1.06647 4.138741
## tau4 4.407834 1.91722 7.107674
2 Synthetic control method
method <- scm(
lambda_min = 0,
lambda_max = 1e-3,
nlambda = 2,
bootstrap = 10,
bootstrap_ci_type = "perc"
)
analysis <- setup_analysis_OLE(
data = SyntheticData,
trial_status_col_name = "S",
treatment_col_name = "A",
outcome_col_name = c("y1", "y2", "y3", "y4"),
covariates_col_name = c("x1", "x2", "x3", "x4", "x5"),
T_cross = 2,
method_OLE_obj = method
)
run_analysis(analysis)## point_estimates lower_CI_boot upper_CI_boot
## tau3 2.064756 1.518103 2.677024
## tau4 3.943234 1.931972 7.565861
References
- Zhou X, Pang H, Drake C, Burger HU, Zhu J (2024). “Estimating treatment effect in randomized trial after control to treatment crossover using external controls.” Journal of Biopharmaceutical Statistics. doi: 10.1080/10543406.2024.2444222.
- Shi L, Pang H, Chen C, Zhu J (2025). “rdborrow: an R package for causal inference incorporating external controls in randomized controlled trials with longitudinal outcomes.” Journal of Biopharmaceutical Statistics, 35(6), 1043-1066. doi: 10.1080/10543406.2025.2489283.