# Propensity Score-Integrated Kaplan-Meier (PSKM) Method in Augmenting Single-Arm Studies

#### 2026-01-10

## Introduction

In the psrwe, PS-integrated Kaplan-Meier (PSKM) method (Chen, et al., 2022) is also implemented for leveraging real-world evidence in augmenting single-arm studies. The PSKM is an non-parametric approach for evaluating time-to-event endpoints.

Similar with the approaches: PSPP (Wang, et al., 2019) and PSCL (Wang, et al., 2020), the PS-integrated study design functions, `psrwe_est()` and `psrwe_borrow()`, below estimate PS model, set borrowing parameters, and determine discounting parameters for borrowing information.

    data(ex_dta)
    dta_ps <- psrwe_est(ex_dta,
                        v_covs = paste("V", 1:7, sep = ""),
                        v_grp = "Group",
                        cur_grp_level = "current",
                        nstrata = 5,
                        ps_method = "logistic")
    ps_bor <- psrwe_borrow(dta_ps,
                           total_borrow = 30,
                           method = "distance")

## PS-integrated Kaplan-Meier method

For single arm studies, when there is one external data source, the function `psrwe_survkm()` allows one to conduct the survival analysis via Kaplan-Meier (KM) estimates (Kaplan and Meier, 1985). The PSKM approach is applied in each PS stratum to obtain stratum-specific KM estimates on all distinctive time points, which are combined to complete the overall survival estimates. Suppose we are interested in the survival probability at one year, then we may use the argument `pred_tp=365` (days) in the function `psrwe_survkm()` to specify the time point of interest.

    rst_km <- psrwe_survkm(ps_bor,
                           pred_tp = 365,
                           v_time  = "Y_Surv",
                           v_event = "Status")
    rst_km

    ## With a total of 30 subject borrowed from the RWD, based on
    ## the survival probability at time 365, the point estimate is
    ## 0.779 with standard error 0.027.

The `pred_tp_365` will be carried on to other down-stream analyses. However, the function `psrwe_survkm()` still returns results on all distinctive time points which may be also needed for down-stream analysis (e.g., visualizing KM curves and confidence intervals). Therefore, the returned object `rst_km` above may have different data structure then those returned by the PSPP and PSCL approaches. Please use `str()` to see the details.

The default method of `stderr_method` for KM estimates is based on the Greenwood formula and the asymptotic theorem that may rely on the independent assumption. However, the Jackknife may provide more robust estimations for the standard errors in general.

Two Jackknife options have been implemented for estimating standard errors of the survival estimates via the options for the function `psrwe_survkm()`: * `stderr_method = "jk"` applies Jackknife by each stratum. * `stderr_method = "sjk"` applies simple Jackknife on the overall survival probability. Both results may be similar but slightly different since the overall weights are fixed and close to one over the number of total strata.

Please see Section of Demo example below for examples using `stderr_method`.

## Visualized PSKM results

The overall survival estimates can be further visualized as below.

    plot(rst_km)

The stratum-specific survival estimates can be further visualized as below.

    plot(rst_km, add_ci = FALSE, add_stratum = TRUE)

The confidence intervals can be also visualized as below.

    plot(rst_km, conf_type = "plain")

## PSKM inference

The inference for the parameters of interest such as survival probability or rate at one year (`pred_tp=365` days) can be further arrived from the utility function `psrwe_outana()`. For example, the code below test the one year survival probability is `greater` than `mu = 0.7` (i.e., `70%`) or not, i.e., the example tests \[ H_0: S(\tau) \leq 0.7 \quad \mbox{vs.} \quad H_a: S(\tau) > 0.7 \] where \(S(\tau)\) is the survival probability at time \(\tau = 365\) days.

    oa_km <- psrwe_outana(rst_km, mu = 0.70, alternative = "greater")
    oa_km

    ## - Method: ps_km, Outcome Type: tte, Study Type: single-arm
    ## - Predict Time Point: 365
    ## - StdErr Method: naive
    ## - Interval Method: wald, Level: 0.95, Type: log_log
    ## - Test Method: p_value, Method pval: wald
    ##   H0: theta <= 0.700 vs. Ha: theta > 0.700
    ## - Analysis Results:
    ##  Stratum  Mean StdErr   T Lower Upper p.value
    ##  Overall 0.779 0.0272 365  0.72 0.827 0.00192

The details of stratum-specific estimates can be printed via the `print()` function with the option `show_details = TRUE`.

    print(oa_km, show_details = TRUE)

    ## - Method: ps_km, Outcome Type: tte, Study Type: single-arm
    ## - Predict Time Point: 365
    ## - StdErr Method: naive
    ## - Interval Method: wald, Level: 0.95, Type: log_log
    ## - Test Method: p_value, Method pval: wald
    ##   H0: theta <= 0.700 vs. Ha: theta > 0.700
    ## - Analysis Results:
    ##    Stratum  Mean StdErr   T Lower Upper  p.value
    ##  Stratum 1 0.830 0.0590 365 0.675 0.916 1.35e-02
    ##  Stratum 2 0.776 0.0617 365 0.626 0.872 1.09e-01
    ##  Stratum 3 0.608 0.0744 365 0.447 0.736 8.91e-01
    ##  Stratum 4 0.760 0.0636 365 0.607 0.860 1.73e-01
    ##  Stratum 5 0.918 0.0407 365 0.790 0.970 3.98e-08
    ##    Overall 0.779 0.0272 365 0.720 0.827 1.92e-03

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, pred_tps = c(180, 365))

    ## - Method: ps_km, Outcome Type: tte, Study Type: single-arm
    ## - Predict Time Point: 180 365
    ## - StdErr Method: naive
    ## - Interval Method: wald, Level: 0.95, Type: log_log
    ## - Test Method: p_value, Method pval: wald
    ##   H0: theta <= 0.700 vs. Ha: theta > 0.700
    ## - Analysis Results:
    ##  Stratum  Mean StdErr   T Lower Upper  p.value
    ##  Overall 0.900 0.0192 180 0.855 0.931 1.02e-25
    ##  Overall 0.779 0.0272 365 0.720 0.827 1.92e-03

## Demo example

The script in “psrwe/demo/sec_4_4_ex.r” source file has the full example for the PSKM single-arm study which can be run via the `demo("sec_4_4_ex", package = "psrwe")`.

Two Jackknife standard errors are also demonstrated in the script. Note that Jackknife standard errors may take a while to finish.

## References

1. Kaplan, E. L. and Meier, P. (1958). Nonparametric Estimation from Incomplete Observations. Journal of the American Statistical Association, 53(282), 457-481.

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. 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.

4. 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.