While Alive estimands for Recurrent Events

We consider two while-alive estimands for recurrent events data E(N(Dt))E(Dt)\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 E(N(Dt)Dt)\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 E((N(Dt)Dt).33)\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.5.0 (2025-04-11)
#> Platform: x86_64-pc-linux-gnu
#> Running under: Ubuntu 24.04.2 LTS
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3 
#> LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.26.so;  LAPACK version 3.12.0
#> 
#> locale:
#>  [1] LC_CTYPE=C.UTF-8       LC_NUMERIC=C           LC_TIME=C.UTF-8       
#>  [4] LC_COLLATE=C.UTF-8     LC_MONETARY=C.UTF-8    LC_MESSAGES=C.UTF-8   
#>  [7] LC_PAPER=C.UTF-8       LC_NAME=C              LC_ADDRESS=C          
#> [10] LC_TELEPHONE=C         LC_MEASUREMENT=C.UTF-8 LC_IDENTIFICATION=C   
#> 
#> time zone: UTC
#> tzcode source: system (glibc)
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#> [1] mets_1.3.6
#> 
#> loaded via a namespace (and not attached):
#>  [1] cli_3.6.5           knitr_1.50          rlang_1.1.6        
#>  [4] xfun_0.52           textshaping_1.0.0   jsonlite_2.0.0     
#>  [7] listenv_0.9.1       future.apply_1.11.3 lava_1.8.1         
#> [10] htmltools_0.5.8.1   ragg_1.4.0          sass_0.4.10        
#> [13] rmarkdown_2.29      grid_4.5.0          evaluate_1.0.3     
#> [16] jquerylib_0.1.4     fastmap_1.2.0       numDeriv_2016.8-1.1
#> [19] yaml_2.3.10         mvtnorm_1.3-3       lifecycle_1.0.4    
#> [22] timereg_2.0.6       compiler_4.5.0      codetools_0.2-20   
#> [25] fs_1.6.6            Rcpp_1.0.14         future_1.40.0      
#> [28] lattice_0.22-6      systemfonts_1.2.2   digest_0.6.37      
#> [31] R6_2.6.1            parallelly_1.43.0   parallel_4.5.0     
#> [34] splines_4.5.0       Matrix_1.7-3        bslib_0.9.0        
#> [37] tools_4.5.0         globals_0.17.0      survival_3.8-3     
#> [40] pkgdown_2.1.1       cachem_1.1.0        desc_1.4.3