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)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.
## 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.
## - 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.
## - 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.
## - 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
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.
## 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.
## - 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.
## - 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.
## - 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
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.
## - 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.
## - 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.
## - 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
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.
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.
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.
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.
Klein, J. and Moeschberger, M. (2003). Survival Analysis: Techniques for Censored and Truncated Data. 2nd ed. New York: Springer.
Peto, R. and Peto, J. (1972). Asymptotically Efficient Rank Invariant Test Procedures. Journal of the Royal Statistical Society, Series A, 135(2), 185-207.
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).
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.
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.
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.