Skip to content

Adjust the FA futility bound with same value as the efficacy bound for asymmetric beta-spending non-binding/binding designs - #656

Open
LittleBeannie wants to merge 5 commits into
mainfrom
593-adjust-the-final-futility-bound-with-same-value-as-the-efficacy-bound-for-asymmetric-non-binding-design
Open

Adjust the FA futility bound with same value as the efficacy bound for asymmetric beta-spending non-binding/binding designs#656
LittleBeannie wants to merge 5 commits into
mainfrom
593-adjust-the-final-futility-bound-with-same-value-as-the-efficacy-bound-for-asymmetric-non-binding-design

Conversation

@LittleBeannie

@LittleBeannie LittleBeannie commented Aug 11, 2026

Copy link
Copy Markdown
Collaborator

The observed gsDesign practice is:

  • Calculate beta-spending futility bounds at interim analyses.
  • At the final analysis, set the futility bound equal to the efficacy bound, leaving no continuation region.
  • After making the bounds equal, it recomputes both crossing probabilities through gsprob(), as shown at line 1612. The probability-complement logic in gsDesign2 achieves the same final partition, but it is not a line-for-line copy of gsDesign’s probability implementation.

Both asymmetric binding and non-binding sample-size paths call gsI1():

x <- gsBound1(-theta, xr$root * tx, -b, probhi = beta, tol = tol, r = r)
error <- x$error
x$b[k] <- -b[k]
x <- gsprob(theta, xr$root * tx, -x$b, b, r = r)

Here, b is the efficacy boundary. Because the futility boundary passed to gsprob() is -x$b, assigning

x$b[k] <- -b[k]

produces

-x$b[k] == b[k]

at the final analysis.

In this PR, my changes below are the gsDesign2 probability-complement implementation, not a call equivalent to gsprob():

# Assign the remaining probability mass to futility when no final continuation region remains
    if (k == n_analysis && close_final_bound) {
      previous_lower_prob <- if (k > 1) sum(lower_prob[seq_len(k - 1)]) else 0
      lower_prob[k] <- 1 - sum(upper_prob) - previous_lower_prob
    }

It sets the final incremental futility probability so that
$$\sum_{i=1}^{K} P(\text{upper at } i)+\sum_{i=1}^{K} P(\text{lower at } i)= 1,$$
where $P(\text{upper at }i)$ is the unconditional stagewise probability of first crossing the efficacy boundary at analysis $i$, under the value of theta used for the power calculation; and $P(\text{lower at } i)$ is the unconditional probability that the trial first crosses the lower (futility) boundary at analysis $i$.

Therefore, they do not recompute both crossing probabilities. They retain the already calculated upper and interim lower probabilities, then calculate the final lower probability as the remaining probability mass.

@LittleBeannie
LittleBeannie requested a review from keaven August 13, 2026 17:00
@LittleBeannie LittleBeannie changed the title Adjust the FA futility bound with same value as the efficacy bound for asymmetric non-binding/binding designs Adjust the FA futility bound with same value as the efficacy bound for asymmetric beta-spending non-binding/binding designs Aug 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Adjust the final futility bound with same value as the efficacy bound for asymmetric non-binding design

1 participant