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

Four essential statistical functions for simulation in SAS

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