The following items should be addressed in simBinomialSeasonalExact()
-
Trial continuation after bound crossing.
The simulation should stop a trial once an efficacy or futility bound is
crossed at any analysis. Currently, mean looks used can exceed k,
suggesting some simulated trials continue past a crossing. For k = 2,
mean looks should be ≤ 2. This affects the reported mean looks and mean
total events/enrolled. Note that Type I error (efficacy crossing
probability) is reported under the non-binding futility convention:
futility crossings do not prevent later efficacy crossings from being
counted, but the stopping time should still reflect stopping at either
bound.
-
Bounds adaptation to observed events.
Total events at each seasonal analysis are random because all enrolled
patients complete their season's follow-up (event counts are binomial
given enrollment). The simulation should call toBinomialExact() within
each simulated trial to update bounds based on the actual observed total
events, rather than using fixed planned event counts. This also affects
reported enrollment totals, which currently can be much larger than the
design's planned enrollment for the fixed design. For the fixed design,
per-season enrollment should match the design's planned enrollment.
-
toInteger() failure with ratio = 1 and rare events.
toInteger() calls gsnSurv() with minfup = NULL, which can fail
when the event rate is very low and equal allocation is used because
the rounded-up integer event count is not achievable under the
maximum-follow-up enrollment model. The proposed fix: toInteger()
should manage to an integer sample size (rounding enrollment to achieve
the desired randomization ratio) but round down for event counts.
When the spending fraction at a look exceeds 1 because the integer
event count is below the continuous design target, the spending
function evaluates to the full cumulative alpha, which is the correct
behavior. A warning should be issued when events are not achievable
with the given enrollment model so the user is aware. As a current
workaround, use ratio = 3 (or another unequal ratio) to avoid the
error.
Notes and extensions
- The adaptive pathway shown here is blinded because it uses total event counts
only; treatment-group differences are not used to update enrollment.
- Spending fractions are kept fixed at
1/k, 2/k, ..., 1.
- For modified intention-to-treat analyses, additional exclusion/dropout
mechanisms can be layered into the simulation by reducing at-risk counts
before each seasonal event/dropout draw.
- Simple superiority and non-inferiority variants can be studied by changing
hr0/hr1 and rebuilding the same workflow.
The following items should be addressed in
simBinomialSeasonalExact()Trial continuation after bound crossing.
The simulation should stop a trial once an efficacy or futility bound is
crossed at any analysis. Currently, mean looks used can exceed
k,suggesting some simulated trials continue past a crossing. For
k = 2,mean looks should be ≤ 2. This affects the reported mean looks and mean
total events/enrolled. Note that Type I error (efficacy crossing
probability) is reported under the non-binding futility convention:
futility crossings do not prevent later efficacy crossings from being
counted, but the stopping time should still reflect stopping at either
bound.
Bounds adaptation to observed events.
Total events at each seasonal analysis are random because all enrolled
patients complete their season's follow-up (event counts are binomial
given enrollment). The simulation should call
toBinomialExact()withineach simulated trial to update bounds based on the actual observed total
events, rather than using fixed planned event counts. This also affects
reported enrollment totals, which currently can be much larger than the
design's planned enrollment for the fixed design. For the fixed design,
per-season enrollment should match the design's planned enrollment.
toInteger()failure withratio = 1and rare events.toInteger()callsgsnSurv()withminfup = NULL, which can failwhen the event rate is very low and equal allocation is used because
the rounded-up integer event count is not achievable under the
maximum-follow-up enrollment model. The proposed fix:
toInteger()should manage to an integer sample size (rounding enrollment to achieve
the desired randomization ratio) but round down for event counts.
When the spending fraction at a look exceeds 1 because the integer
event count is below the continuous design target, the spending
function evaluates to the full cumulative alpha, which is the correct
behavior. A warning should be issued when events are not achievable
with the given enrollment model so the user is aware. As a current
workaround, use
ratio = 3(or another unequal ratio) to avoid theerror.
Notes and extensions
only; treatment-group differences are not used to update enrollment.
1/k, 2/k, ..., 1.mechanisms can be layered into the simulation by reducing at-risk counts
before each seasonal event/dropout draw.
hr0/hr1and rebuilding the same workflow.