# While Alive estimands for Recurrent Events

#### Klaus Holst & Thomas Scheike

#### 2025-04-23

# While Alive estimands for Recurrent Events

We consider two while-alive estimands for recurrent events data \[\begin{align*} \frac{E(N(D \wedge t))}{E(D \wedge t)} \end{align*}\] and the mean of the subject specific events per time-unit \[\begin{align*} E( \frac{N(D \wedge t)}{D \wedge t} ) \end{align*}\] for two treatment-groups in the case of an RCT. For the laste mean of events per time-unit it has been seen that when the sample size is to great it can improve the finite sample properties to employ a transformation such as square or cube-root, and thus consider \[\begin{align*} E( (\frac{N(D \wedge t)}{D \wedge t})^.33 ) \end{align*}\]

    data(hfactioncpx12)

    dtable(hfactioncpx12,~status)
    #>
    #> status
    #>    0    1    2
    #>  617 1391  124
    dd <- WA_recurrent(Event(entry,time,status)~treatment+cluster(id),hfactioncpx12,time=2,death.code=2)
    summary(dd)
    #> While-Alive summaries:
    #>
    #> RMST,  E(min(D,t))
    #>            Estimate Std.Err  2.5% 97.5% P-value
    #> treatment0    1.859 0.02108 1.817 1.900       0
    #> treatment1    1.924 0.01502 1.894 1.953       0
    #>
    #>                           Estimate Std.Err    2.5%    97.5% P-value
    #> [treatment0] - [treat.... -0.06517 0.02588 -0.1159 -0.01444  0.0118
    #>
    #>  Null Hypothesis:
    #>   [treatment0] - [treatment1] = 0
    #> mean events, E(N(min(D,t))):
    #>            Estimate Std.Err  2.5% 97.5%   P-value
    #> treatment0    1.572 0.09821 1.379 1.764 1.171e-57
    #> treatment1    1.453 0.10825 1.241 1.666 4.205e-41
    #>
    #>                           Estimate Std.Err   2.5%  97.5% P-value
    #> [treatment0] - [treat....   0.1185  0.1462 -0.168 0.4049  0.4177
    #>
    #>  Null Hypothesis:
    #>   [treatment0] - [treatment1] = 0
    #> _______________________________________________________
    #> Ratio of means E(N(min(D,t)))/E(min(D,t))
    #>            Estimate Std.Err   2.5%  97.5%   P-value
    #> treatment0   0.8457 0.05396 0.7399 0.9514 2.308e-55
    #> treatment1   0.7555 0.05696 0.6438 0.8671 3.835e-40
    #>
    #>                           Estimate Std.Err     2.5% 97.5% P-value
    #> [treatment0] - [treat....  0.09022 0.07846 -0.06357 0.244  0.2502
    #>
    #>  Null Hypothesis:
    #>   [treatment0] - [treatment1] = 0
    #> _______________________________________________________
    #> Mean of Events per time-unit E(N(min(D,t))/min(D,t))
    #>        Estimate Std.Err   2.5%  97.5%   P-value
    #> treat0   1.0725  0.1222 0.8331 1.3119 1.645e-18
    #> treat1   0.7552  0.0643 0.6291 0.8812 7.508e-32
    #>
    #>                     Estimate Std.Err    2.5%  97.5% P-value
    #> [treat0] - [treat1]   0.3173  0.1381 0.04675 0.5879 0.02153
    #>
    #>  Null Hypothesis:
    #>   [treat0] - [treat1] = 0

    dd <- WA_recurrent(Event(entry,time,status)~treatment+cluster(id),hfactioncpx12,time=2,death.code=2,trans=.333)
    summary(dd,type="log")
    #> While-Alive summaries, log-scale:
    #>
    #> RMST,  E(min(D,t))
    #>            Estimate  Std.Err   2.5%  97.5% P-value
    #> treatment0   0.6199 0.011340 0.5977 0.6421       0
    #> treatment1   0.6543 0.007807 0.6390 0.6696       0
    #>
    #>                           Estimate Std.Err     2.5%     97.5% P-value
    #> [treatment0] - [treat.... -0.03446 0.01377 -0.06145 -0.007478 0.01231
    #>
    #>  Null Hypothesis:
    #>   [treatment0] - [treatment1] = 0
    #> mean events, E(N(min(D,t))):
    #>            Estimate Std.Err   2.5%  97.5%   P-value
    #> treatment0   0.4523 0.06248 0.3298 0.5747 4.535e-13
    #> treatment1   0.3739 0.07448 0.2279 0.5199 5.155e-07
    #>
    #>                           Estimate Std.Err    2.5%  97.5% P-value
    #> [treatment0] - [treat....  0.07835 0.09721 -0.1122 0.2689  0.4203
    #>
    #>  Null Hypothesis:
    #>   [treatment0] - [treatment1] = 0
    #> _______________________________________________________
    #> Ratio of means E(N(min(D,t)))/E(min(D,t))
    #>            Estimate Std.Err    2.5%    97.5%   P-value
    #> treatment0  -0.1676  0.0638 -0.2927 -0.04257 0.0086101
    #> treatment1  -0.2804  0.0754 -0.4282 -0.13265 0.0001999
    #>
    #>                           Estimate Std.Err     2.5%  97.5% P-value
    #> [treatment0] - [treat....   0.1128 0.09877 -0.08078 0.3064  0.2534
    #>
    #>  Null Hypothesis:
    #>   [treatment0] - [treatment1] = 0
    #> _______________________________________________________
    #> Mean of Events per time-unit E(N(min(D,t))/min(D,t))
    #>        Estimate Std.Err    2.5%   97.5%   P-value
    #> treat0  -0.3833 0.04939 -0.4801 -0.2865 8.487e-15
    #> treat1  -0.5380 0.05666 -0.6491 -0.4270 2.191e-21
    #>
    #>                     Estimate Std.Err     2.5%  97.5% P-value
    #> [treat0] - [treat1]   0.1548 0.07517 0.007459 0.3021 0.03948
    #>
    #>  Null Hypothesis:
    #>   [treat0] - [treat1] = 0

We see that the ratio of means are not very different, but that the subject specific mean of events per time-unit shows that those on the active treatment has fewer events per time-unit on average.

# SessionInfo

    sessionInfo()
    #> R version 4.4.3 (2025-02-28)
    #> Platform: aarch64-apple-darwin24.3.0
    #> Running under: macOS Sequoia 15.4.1
    #>
    #> Matrix products: default
    #> BLAS:   /Users/kkzh/.asdf/installs/R/4.4.3/lib/R/lib/libRblas.dylib
    #> LAPACK: /Users/kkzh/.asdf/installs/R/4.4.3/lib/R/lib/libRlapack.dylib;  LAPACK version 3.12.0
    #>
    #> locale:
    #> [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
    #>
    #> time zone: Europe/Copenhagen
    #> tzcode source: internal
    #>
    #> attached base packages:
    #> [1] splines   stats     graphics  grDevices utils     datasets  methods
    #> [8] base
    #>
    #> other attached packages:
    #> [1] prodlim_2024.06.25 ggplot2_3.5.1      cowplot_1.1.3      timereg_2.0.6
    #> [5] survival_3.8-3     mets_1.3.6
    #>
    #> loaded via a namespace (and not attached):
    #>  [1] sass_0.4.9          future_1.40.0       generics_0.1.3
    #>  [4] lattice_0.22-6      listenv_0.9.1       digest_0.6.37
    #>  [7] magrittr_2.0.3      evaluate_1.0.3      grid_4.4.3
    #> [10] mvtnorm_1.3-3       fastmap_1.2.0       jsonlite_1.9.1
    #> [13] Matrix_1.7-2        scales_1.3.0        isoband_0.2.7
    #> [16] codetools_0.2-20    numDeriv_2016.8-1.1 jquerylib_0.1.4
    #> [19] lava_1.8.1          cli_3.6.4           rlang_1.1.5
    #> [22] parallelly_1.43.0   future.apply_1.11.3 munsell_0.5.1
    #> [25] withr_3.0.2         cachem_1.1.0        yaml_2.3.10
    #> [28] tools_4.4.3         parallel_4.4.3      ucminf_1.2.2
    #> [31] dplyr_1.1.4         colorspace_2.1-1    globals_0.17.0
    #> [34] vctrs_0.6.5         R6_2.6.1            lifecycle_1.0.4
    #> [37] MASS_7.3-65         pkgconfig_2.0.3     bslib_0.9.0
    #> [40] pillar_1.10.1       gtable_0.3.6        data.table_1.17.0
    #> [43] glue_1.8.0          Rcpp_1.0.14         xfun_0.51
    #> [46] tibble_3.2.1        tidyselect_1.2.1    knitr_1.49
    #> [49] farver_2.1.2        htmltools_0.5.8.1   rmarkdown_2.29
    #> [52] labeling_0.4.3      compiler_4.4.3