Propensity Score-Integrated Survival Inference in Randomized Controlled Trials (RCTs) with Augmenting Control Arm

2026-01-10


Introduction

In the psrwe, PS-integrated survival analyses in randomized controlled trials (RCTs) with an augmented control arm (Chen, et al., to be submitted) are also implemented in three functions:

These tests are non-parametric approaches for comparing two treatments with time-to-event endpoints. Therefore, these tests are only implemented for RCTs with augmenting control arm.

Similar to the approaches: PSPP (Wang, et al., 2019), PSCL (Wang, et al., 2020), and PSKM (Chen, et al., 2022), the PS-integrated study design functions, psrwe_est() and psrwe_borrow(), below estimate the PS model, set borrowing parameters, and determine discounting parameters for borrowing information for a two-arm RCT with an augmented control arm from RWD.

data(ex_dta_rct)
dta_ps_rct <- psrwe_est(ex_dta_rct,
                        v_covs = paste("V", 1:7, sep = ""),
                        v_grp = "Group", cur_grp_level = "current",
                        v_arm = "Arm", ctl_arm_level = "control",
                        ps_method = "logistic", nstrata = 5,
                        stra_ctl_only = FALSE)
ps_bor_rct <- psrwe_borrow(dta_ps_rct, total_borrow = 30)


PS-integrated treatment effect test

Similar to the single arm study example (in psrwe/demo/sec_4_4_ex.r and demo("sec_4_5_ex", package = "psrwe")), the code below evaluates a two-arm RCT. The results show the treatment effect which is the survival difference between the two arms at 1 year (365 days).

rst_km_rct <- psrwe_survkm(ps_bor_rct,
                           pred_tp = 365,
                           v_time = "Y_Surv",
                           v_event = "Status")
rst_km_rct
## With a total of 30 subject borrowed from the RWD, based on 
## the survival probability at time 365, the treatment effect 
## is 0.144 with standard error 0.054.

The estimated PSKM curves with confidence intervals are shown below.

plot(rst_km_rct, xlim = c(0, 730))
## Warning: Removed 576 rows containing missing values or values outside the scale range
## (`geom_step()`).
## Removed 576 rows containing missing values or values outside the scale range
## (`geom_step()`).
## Removed 576 rows containing missing values or values outside the scale range
## (`geom_step()`).

The inference is based on the treatment effect \(S_{trt}(\tau) - S_{ctl}(\tau)\) at \(\tau = 365\) days where \(S_{trt}\) and \(S_{ctl}\) are the survival probabilities of the treatment and control arms, respectively. In other words, the example tests \[ H_0: S_{trt}(\tau) - S_{ctl}(\tau) \leq 0 \quad \mbox{vs.} \quad H_a: S_{trt}(\tau) - S_{ctl}(\tau) > 0 . \] The outcome analysis can be summarized below. Note that this is a one-sided test.

oa_km_rct <- psrwe_outana(rst_km_rct, alternative = "greater")
oa_km_rct
## - Method: ps_km, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: theta_trt-theta_ctl <= 0.000 vs. Ha: theta_trt-theta_ctl > 0.000
## - Analysis Results:
##  Stratum  Mean StdErr   T Lower Upper p.value
##  Overall 0.144 0.0541 365 0.038  0.25 0.00388

The details of the estimates for each arm can be printed via the print() function with the option show_rct = TRUE.

print(oa_km_rct, show_rct = TRUE)
## - Method: ps_km, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: theta_trt-theta_ctl <= 0.000 vs. Ha: theta_trt-theta_ctl > 0.000
## - Analysis Results:
##  Stratum  Mean StdErr   T Lower Upper p.value
##  Overall 0.144 0.0541 365 0.038  0.25 0.00388
## - RCT Treatment Arm:
##  Stratum  Mean StdErr   T Lower Upper
##  Overall 0.822 0.0384 365 0.732 0.885
## - RCT Control Arm:
##  Stratum  Mean StdErr   T Lower Upper
##  Overall 0.674 0.0376 365 0.594 0.741

As the survival package, the results of other time points can be also predicted via the summary() with the option pred_tps.

summary(oa_km_rct, pred_tps = c(180, 365))
## - Method: ps_km, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 180 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: theta_trt-theta_ctl <= 0.000 vs. Ha: theta_trt-theta_ctl > 0.000
## - Analysis Results:
##  Stratum   Mean StdErr   T   Lower Upper p.value
##  Overall 0.0678 0.0416 180 -0.0136 0.149 0.05136
##  Overall 0.1441 0.0541 365  0.0380 0.250 0.00388


PS-integrated log-rank test

The log-rank test is another way to compare two treatments of time-to-event endpoint. Similar to the PSKM for the two-arm test above, the function psrwe_survlrk() computes the statistic for each distinctive time point beased on the observed data, then it returns all necessary results for the downstream analyses, such as tests and confidence intervals.

rst_lrk <- psrwe_survlrk(ps_bor_rct,
                         pred_tp = 365,
                         v_time = "Y_Surv",
                         v_event = "Status")
rst_lrk
## With a total of 30 subject borrowed from the RWD, based on 
## the survival probability at time 365, the log-rank 
## statistic is -1.760 with standard error 0.744.

The inference is based on the log-rank method to test whether two survival distributions are different from each other. The example tests \[ H_0: S_{trt}(t) = S_{ctl}(t) \quad \mbox{vs.} \quad H_a: S_{trt}(t) \neq S_{ctl}(t) 0 \] for all \(t \leq \tau\) where \(\tau = 365\) days. The outcome analysis can be summarized below.

oa_lrk <- psrwe_outana(rst_lrk)
oa_lrk
## - Method: ps_lrk, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: sum[d_trt-E(d_trt)] == 0.000 vs. Ha: sum[d_trt-E(d_trt)] != 0.000
## - Analysis Results:
##  Stratum  Mean StdErr   T Lower  Upper p.value
##  Overall -1.76  0.744 365 -3.22 -0.301  0.0181

The details of the estimates for each arm can be printed via the print() function with the option show_rct = TRUE.

print(oa_lrk, show_details = TRUE)
## - Method: ps_lrk, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: sum[d_trt-E(d_trt)] == 0.000 vs. Ha: sum[d_trt-E(d_trt)] != 0.000
## - Analysis Results:
##    Stratum   Mean StdErr   T Lower  Upper p.value
##  Stratum 1 -2.820  1.736 365 -6.22  0.583  0.1044
##  Stratum 2 -0.308  1.704 365 -3.65  3.033  0.8567
##  Stratum 3 -1.829  1.703 365 -5.17  1.508  0.2826
##  Stratum 4 -4.052  1.646 365 -7.28 -0.825  0.0138
##  Stratum 5  0.208  1.525 365 -2.78  3.198  0.8916
##    Overall -1.760  0.744 365 -3.22 -0.301  0.0181

As the survival package, the results of other time points can be also predicted via the summary() with the option pred_tps.

summary(oa_lrk, pred_tps = c(180, 365))
## - Method: ps_lrk, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 180 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: sum[d_trt-E(d_trt)] == 0.000 vs. Ha: sum[d_trt-E(d_trt)] != 0.000
## - Analysis Results:
##  Stratum   Mean StdErr   T Lower  Upper p.value
##  Overall -0.801  0.534 180 -1.85  0.247  0.1341
##  Overall -1.760  0.744 365 -3.22 -0.301  0.0181


PS-integrated restricted mean survival time (RMST) test

The restricted means survival time (RMST) tests whether areas under two survival distributions (AUC) are different from each other. Similar to the log-rank test above, the function psrwe_survrmst() computes the statistic for each distinctive time point beased on the observed data, then it returns all necessary results for the downstream analyses, such as tests and confidence intervals.

rst_rmst <- psrwe_survrmst(ps_bor_rct,
                           pred_tp = 365,
                           v_time = "Y_Surv",
                           v_event = "Status")
rst_rmst
## With a total of 30 subject borrowed from the RWD, based on 
## the survival probability at time 365, the RMST statistic is 
## 26.111 with standard error 13.863.

The inference is based on comparing whether AUCs are different from each other. The example tests \[ H_0: \int_0^{\tau} S_{trt}(t) dt = \int_0^{\tau} S_{ctl}(t) dt \quad \mbox{vs.} \quad H_a: \int_0^{\tau} S_{trt}(t) dt \neq \int_0^{\tau} S_{ctl}(t) dt \] where \(\tau = 365\) days. The outcome analysis can be summarized below. Note that this is a two-sided test.

oa_rmst <- psrwe_outana(rst_rmst)
oa_rmst
## - Method: ps_rmst, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: auc(S_trt)-auc(S_ctl) == 0.000 vs. Ha: auc(S_trt)-auc(S_ctl) != 0.000
## - Analysis Results:
##  Stratum Mean StdErr   T Lower Upper p.value
##  Overall 26.1   13.9 365 -1.06  53.3  0.0596

The details of the estimates for each arm can be printed via the print() function with the option show_rct = TRUE.

print(oa_rmst, show_details = TRUE)
## - Method: ps_rmst, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: auc(S_trt)-auc(S_ctl) == 0.000 vs. Ha: auc(S_trt)-auc(S_ctl) != 0.000
## - Analysis Results:
##    Stratum   Mean StdErr   T  Lower Upper p.value
##  Stratum 1  34.40   29.5 365 -23.43  92.2  0.2437
##  Stratum 2 -11.22   35.9 365 -81.51  59.1  0.7544
##  Stratum 3  38.38   24.9 365 -10.38  87.1  0.1229
##  Stratum 4  63.40   29.8 365   5.00 121.8  0.0334
##  Stratum 5   5.59   33.8 365 -60.60  71.8  0.8684
##    Overall  26.11   13.9 365  -1.06  53.3  0.0596

As the survival package, the results of other time points can be also predicted via the summary() with the option pred_tps.

summary(oa_rmst, pred_tps = c(180, 365))
## - Method: ps_rmst, Outcome Type: tte, Study Type: RCT
## - Predict Time Point: 180 365
## - StdErr Method: naive
## - Interval Method: wald, Level: 0.95, Type: plain
## - Test Method: p_value, Method pval: wald
##   H0: auc(S_trt)-auc(S_ctl) == 0.000 vs. Ha: auc(S_trt)-auc(S_ctl) != 0.000
## - Analysis Results:
##  Stratum  Mean StdErr   T Lower Upper p.value
##  Overall  5.79   5.66 180 -5.30  16.9  0.3063
##  Overall 26.11  13.86 365 -1.06  53.3  0.0596


Demo examples

The scripts in “psrwe/demo/sec_4_5_ex.r”, “psrwe/demo/sec_4_6_ex.r”, and “psrwe/demo/sec_4_7_ex.r” source files have the full examples for the PS-integrated survival analyses, which can be run via the demo("sec_4_5_ex", package = "psrwe"), demo("sec_4_6_ex", package = "psrwe"), and demo("sec_4_7_ex", package = "psrwe"), respectively.

Two Jackknife standard errors are also demonstrated for each test method. Note that Jackknife standard errors may take a while to finish.

References

  1. Chen, W.-C., Lu, N., Wang, C., Li, H., Song, C., Tiwari, R., Xu, Y., and Yue, L.Q. (to be submitted). Propensity Score-Integrated Statistical Tests for Survival Analysis: Leveraging External Evidence for Augmenting the Control Arm of a Randomized Controlled Trial.

  2. Chen, W.-C., Lu, N., Wang, C., Li, H., Song, C., Tiwari, R., Xu, Y., and Yue, L.Q. (2022). Propensity Score-Integrated Approach to Survival Analysis: Leveraging External Evidence in Single-Arm Studies. Journal of Biopharmaceutical Statistics, 32(3), 400-413.

  3. Com-Nougue, C., Rodary, C. and Patte, C. (1993). How to establish equivalence when data are censored: A randomized trial of treatments for B non-Hodgkin lymphoma. Statist. Med., Volume 12, pp. 1353-1364.

  4. Klein, J. and Moeschberger, M. (2003). Survival Analysis: Techniques for Censored and Truncated Data. 2nd ed. New York: Springer.

  5. Peto, R. and Peto, J. (1972). Asymptotically Efficient Rank Invariant Test Procedures. Journal of the Royal Statistical Society, Series A, 135(2), 185-207.

  6. Royston, P. and Parmar, M. K. (2013). Restricted mean survival time: an alternative to the hazard ratio for the design and analysis of randomized trials with a time-to-event outcome. BMC Med Res Methodol, 13(152).

  7. Uno, H., et al., (2014). Moving beyond the hazard ratio in quantifying the between-group difference in survival analysis. Journal of clinical oncology, Volume 32, 2380-2385.

  8. Wang, C., Li, H., Chen, W. C., Lu, N., Tiwari, R., Xu, Y., and Yue, L.Q. (2019). Propensity score-integrated power prior approach for incorporating real-world evidence in single-arm clinical studies. Journal of Biopharmaceutical Statistics, 29(5), 731-748.

  9. Wang, C., Lu, N., Chen, W. C., Li, H., Tiwari, R., Xu, Y., and Yue, L.Q. (2020). Propensity score-integrated composite likelihood approach for incorporating real-world evidence in single-arm clinical studies. Journal of Biopharmaceutical Statistics, 30(3), 495-507.