The hardware and bandwidth for this mirror is donated by dogado GmbH, the Webhosting and Full Service-Cloud Provider. Check out our Wordpress Tutorial.
If you wish to report a bug, or if you are interested in having us mirror your free-software or open-source project, please feel free to contact us at mirror[@]dogado.de.

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.



These binaries (installable software) and packages are in development.
They may not be fully stable and should be used with caution. We make no claims about them.
Health stats visible at Monitor.