The function first orders the events by time and partitions the ordered sequence into
nblocks consecutive blocks of equal size. The block labels are permuted (excluding the identity
permutation), and the time values are reassigned according to the permuted block order.
If nrow(X) is not divisible by nblocks, the last nrow(X) %% nblocks events are not
included in the block permutation and are appended unchanged to each permuted dataset.
For details of the block permutation procedure, see the Supplementary Materials in
Ghorbani et al. (2025).
Note that the sim.procedures covers both pure and block permutation methods.