Controlling Alpha Level in Simon’s Two-Stage Design with Overrun or Underrun

 Simon’s Two-Stage Design is commonly used in phase II clinical trials to evaluate whether a new treatment shows sufficient promise for further study while minimizing the number of patients exposed to ineffective treatments. The design involves:

  • An initial stage (Stage 1) where a small number of patients are enrolled and assessed.
  • If promising results are observed, the trial proceeds to Stage 2 with additional patients.
  • If the treatment is ineffective in Stage 1, the trial is stopped early.

However, in real-world clinical trials, overruns (exceeding planned sample size) or underruns (fewer patients than planned) can occur due to logistical, operational, or recruitment issues. These deviations can impact the Type I error rate (α level) and the statistical integrity of the trial.


1. Impact of Overrun or Underrun on Alpha Control

A. Overrun (More Patients Enrolled)

  • Problem: If more patients are enrolled in Stage 1, there is a higher chance of incorrectly rejecting the null hypothesis (increasing Type I error).
  • Solution:
    • Strict Stopping Rules: Ensure that patient enrollment stops as soon as the decision boundary is reached.
    • Recalculate Critical Values: If the overrun is unavoidable, adjust the rejection criteria for Stage 2 using a recalculated critical value to maintain the overall alpha level.
    • Monte Carlo Simulations: Use simulations to evaluate and adjust the design’s Type I error rate.

B. Underrun (Fewer Patients Enrolled)

  • Problem: Fewer patients in Stage 1 lead to lower power and could cause an early termination of a potentially effective treatment.
  • Solution:
    • Combine Data from Stage 1 & 2: If recruitment issues occur, it may be reasonable to combine patients from both stages and reanalyze based on the total observed responses.
    • Bayesian Methods: Bayesian adaptive approaches can adjust for uncertainty due to missing data.

2. Statistical Approaches to Control Alpha in Case of Overrun/Underrun

A. Adjusting the Critical Boundaries Post Hoc

  • The error probability structure must be controlled using:
    • Modified Critical Values: Adjust the threshold for rejecting H0H_0 (null hypothesis).
    • Conditional Probability Calculations: Ensure Type I error remains below the pre-specified alpha level.

B. Permutation Testing & Simulation-Based Methods

  • Monte Carlo simulations can be used to adjust the alpha level dynamically if deviations occur.
  • Bootstrap resampling to assess statistical robustness.

C. Bayesian Alternative

  • A Bayesian Simon’s Two-Stage Design uses posterior probabilities to adaptively modify decision boundaries based on observed data.

3. Practical Recommendations for Trial Conduct

  • Predefine stopping rules for early termination and clearly state what happens in case of overrun/underrun.
  • Monitor recruitment closely to minimize deviations from the planned sample size.
  • Apply sensitivity analyses if deviations occur to assess their impact on statistical validity.

Summary

IssueImpactSolution
Overrun (More patients than planned)Increases Type I error (false positives)Stop early, recalculate rejection criteria, use simulations
Underrun (Fewer patients enrolled)Reduces power, risk of early terminationCombine stages, Bayesian methods, sensitivity analysis

Here's a Python implementation to handle overrun and underrun in Simon's Two-Stage Design, including simulations to control the alpha level.


Overview of the Code

  • Step 1: Define Simon’s Two-Stage Design parameters (sample size, rejection criteria).
  • Step 2: Simulate trial outcomes.
  • Step 3: Adjust for overrun or underrun and recalculate the Type I error rate.
  • Step 4: Use Monte Carlo simulations to evaluate the impact on the error rate.

Python Code for Handling Overrun/Underrun in Simon’s Two-Stage Design

import numpy as np import scipy.stats as stats import matplotlib.pyplot as plt # Define Simon's Two-Stage Design Parameters def simon_two_stage(n1, r1, n2, r, p0, p1, sims=10000, overrun=0, underrun=0): """ Simulate Simon's Two-Stage Design while handling overrun/underrun. Parameters: - n1: Sample size in Stage 1 - r1: Rejection boundary for Stage 1 - n2: Additional patients in Stage 2 (if Stage 1 is successful) - r: Final rejection boundary for the full study - p0: Null hypothesis response rate - p1: Alternative hypothesis response rate - sims: Number of simulation trials - overrun: Extra patients in Stage 1 - underrun: Fewer patients in Stage 1 Returns: - Estimated Type I error rate - Adjusted decision rules if necessary """ total_rejections = 0 # Count trials where null hypothesis is rejected actual_n1 = n1 + overrun - underrun # Adjust for overrun/underrun for _ in range(sims): # Stage 1 Simulation stage1_responses = np.random.binomial(actual_n1, p0) # Apply overrun correction if stage1_responses > r1: # Continue to Stage 2 stage2_responses = np.random.binomial(n2, p0) total_responses = stage1_responses + stage2_responses if total_responses > r: total_rejections += 1 # Reject null hypothesis else: # Stop early if stage1 fails continue # Calculate adjusted Type I error rate alpha_estimate = total_rejections / sims return alpha_estimate # Parameters for Example n1, r1 = 15, 3 # Stage 1: Sample size and rejection boundary n2, r = 25, 7 # Stage 2: Additional patients and final rejection boundary p0 = 0.10 # Null hypothesis response rate p1 = 0.30 # Alternative hypothesis response rate sims = 10000 # Number of simulations # Case 1: No Overrun or Underrun (Baseline) alpha_baseline = simon_two_stage(n1, r1, n2, r, p0, p1, sims) # Case 2: Overrun of 5 patients alpha_overrun = simon_two_stage(n1, r1, n2, r, p0, p1, sims, overrun=5) # Case 3: Underrun of 5 patients alpha_underrun = simon_two_stage(n1, r1, n2, r, p0, p1, sims, underrun=5) # Print Results print(f"Baseline Type I Error Rate: {alpha_baseline:.4f}") print(f"Overrun (5 extra patients) Type I Error Rate: {alpha_overrun:.4f}") print(f"Underrun (5 fewer patients) Type I Error Rate: {alpha_underrun:.4f}") # Visualizing the impact of overrun/underrun labels = ["Baseline", "Overrun (+5)", "Underrun (-5)"] alpha_values = [alpha_baseline, alpha_overrun, alpha_underrun] plt.bar(labels, alpha_values, color=["blue", "red", "green"]) plt.ylabel("Estimated Type I Error Rate") plt.title("Impact of Overrun/Underrun on Type I Error in Simon’s Two-Stage Design") plt.ylim(0, max(alpha_values) + 0.02) plt.show()


Explanation of the Code

  1. Simulates Simon’s Two-Stage Design under different scenarios:

    • Baseline: No overrun/underrun.
    • Overrun: Extra patients in Stage 1.
    • Underrun: Fewer patients in Stage 1.
  2. Adjusts sample size dynamically to account for overrun or underrun.

  3. Calculates the adjusted Type I error rate by running Monte Carlo simulations.

  4. Visualizes the impact of overrun and underrun on the alpha level using a bar plot.


Key Findings

  • Overrun increases Type I error rate, making it more likely to falsely reject H0H_0.
  • Underrun decreases power, making it harder to detect a true effect.
  • Baseline design keeps the error rate within acceptable limits.

How to Use This Code?

  • Adjust n1,r1,n2,rn_1, r_1, n_2, r based on your specific study.
  • Modify p0p_0 and p1p_1 for different response rates.
  • Change overrun/underrun values to see how deviations affect the trial.

Next Steps

Would you like to extend this: ✔ Add a Bayesian adjustment for overrun?
✔ Include real-world clinical trial data?
✔ Simulate power calculations along with Type I error?

Comments

Popular posts from this blog

Analysis of Repeated Measures Data using SAS (1)

Understanding Binding vs. Non-Binding Futility Analysis in Clinical Trials

Medical information for Melanoma, Merkel cell carcinoma and tumor mutation burden