# 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:

- `psrwe_survkm()` for treatment effect test (Com-Nougue, et al., 1993).
- `psrwe_survlrk()` for log-rank test (Klein and Moeschberger, 2003; Peto and Peto, 1972).
- `psrwe_survrmst()` for restricted mean survival time (RMST) test (Royston and Parmar, 2013; Uno, et al., 2014).

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.