Sample Size Calculation With Fixed Follow-up

Kaifeng Lu

12/15/2021

This R Markdown document illustrates the sample size calculation for a fixed follow-up design, in which the treatment allocation is 3:1 and the hazard ratio is 0.3. This is a case for which neither the Schoenfeld method nor the Lakatos method provides an accurate sample size estimate, and simulation tools are needed to obtain a more accurate result. First we load the lrstat package:

library(lrstat)

Consider a fixed design with the hazard rate of the control group being 0.95 per year, a hazard ratio of the experimental group to the control group being 0.3, a randomization ratio of 3:1, an enrollment rate of 5 patients per month, a 2-year drop-out rate of 10%, and a planned fixed follow-up of 26 weeks for each patient. The target power is 90%, and we are interested in the number of patients to enroll to achieve the target 90% power.

Using the Schoenfeld formula, we have

lrsamplesize(beta = 0.1, kMax = 1, criticalValues = 1.96, 
             allocationRatioPlanned = 3, accrualIntensity = 5, 
             lambda1 = 0.3*0.95/12, lambda2 = 0.95/12, 
             gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24, 
             accrualDuration = NA, followupTime = 26/4, 
             fixedFollowup = TRUE, 
             typeOfComputation = "schoenfeld")$resultsUnderH1
##                                                                        
## Fixed design                                                           
## Overall power: 0.902, overall significance level (1-sided): 0.025      
## Number of events: 39                                                   
## Number of dropouts: 4.8                                                
## Number of subjects: 192                                                
## Study duration: 42.6                                                   
## Accrual duration: 38.4, follow-up duration: 6.5, fixed follow-up: TRUE 
##                                                                        
##                                    
## Efficacy boundary (Z-scale)  1.960 
## Efficacy boundary (HR-scale) 0.484 
## Efficacy boundary (p-scale)  0.0250
## Information                  7.31  
## HR                           0.300

This calls for 39 events with 192 patients enrolled over 38.4 months. Denote this design as design 1.

On the other hand, using the Lakatos method, we have

lrsamplesize(beta = 0.1, kMax = 1, criticalValues = 1.96, 
             allocationRatioPlanned = 3, accrualIntensity = 5, 
             lambda1 = 0.3*0.95/12, lambda2 = 0.95/12, 
             gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24, 
             accrualDuration = NA, followupTime = 26/4, 
             fixedFollowup = TRUE, 
             typeOfComputation = "direct")$resultsUnderH1
##                                                                        
## Fixed design                                                           
## Overall power: 0.901, overall significance level (1-sided): 0.025      
## Number of events: 26                                                   
## Number of dropouts: 3.2                                                
## Number of subjects: 128                                                
## Study duration: 30.2                                                   
## Accrual duration: 25.6, follow-up duration: 6.5, fixed follow-up: TRUE 
##                                                                        
##                                    
## Efficacy boundary (Z-scale)  1.960 
## Efficacy boundary (HR-scale) 0.463 
## Efficacy boundary (p-scale)  0.0250
## Information                  4.46  
## HR                           0.300

It implies that we only need 26 events with 128 subjects enrolled over 25.6 months, a dramatic difference from the Schoenfeld formula. Denote this design as design 2.

To check the accuracy of either solution, we run simulations using the lrsim function.

lrsim(kMax = 1, criticalValues = 1.96,  
      allocation1 = 3, allocation2 = 1,
      accrualIntensity = 5, 
      lambda1 = 0.3*0.95/12, lambda2 = 0.95/12, 
      gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24,
      accrualDuration = 38.4, followupTime = 6.5, 
      fixedFollowup = TRUE,  
      plannedEvents = 39, 
      maxNumberOfIterations = 1000, seed = 12345)
##                                               
## Fixed design                                  
## Overall power: 0.947                          
## Expected # events: 37.2                       
## Expected # dropouts: 4.5                      
## Expected # subjects: 187.4                    
## Expected study duration: 39.5                 
## Accrual duration: 38.4, fixed follow-up: TRUE 
## 
lrsim(kMax = 1, criticalValues = 1.96,  
      allocation1 = 3, allocation2 = 1,
      accrualIntensity = 5, 
      lambda1 = 0.3*0.95/12, lambda2 = 0.95/12, 
      gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24,
      accrualDuration = 25.6, followupTime = 6.5, 
      fixedFollowup = TRUE,  
      plannedEvents = 26, 
      maxNumberOfIterations = 1000, seed = 12345)
##                                               
## Fixed design                                  
## Overall power: 0.842                          
## Expected # events: 24.5                       
## Expected # dropouts: 2.9                      
## Expected # subjects: 124.9                    
## Expected study duration: 27.2                 
## Accrual duration: 25.6, fixed follow-up: TRUE 
## 

The simulated power is about 95% for design 1, and 84% for design 2. Neither is close to the target 90% power.

We use the following formula to adjust the sample size to attain the target power, \[ D = D_0 \left( \frac{\Phi^{-1}(1-\alpha) + \Phi^{-1}(1-\beta)} {\Phi^{-1}(1-\alpha) + \Phi^{-1}(1-\beta_0)} \right)^2 \] where \(D_0\) and \(\beta_0\) are the initial event number and the correponding type II error, and \(D\) and \(\beta\) are the required event number and the target type II error, respectively. For \(\alpha=0.025\) and \(\beta=0.1\), plugging in \((D_0=39, \beta_0=0.053)\) and \((D_0=26, \beta_0=0.158)\) would yield \(D=32\) and \(D=31\), respectively. For \(D=32\), we need about 156 patients for an enrollment period of 31.2 months:

getDurationFromNevents(
  nevents = 32, allocationRatioPlanned = 3,
  accrualIntensity = 5,
  lambda1 = 0.3*0.95/12, lambda2 = 0.95/12, 
  gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24,
  followupTime = 6.5, fixedFollowup = TRUE)[1,]
##   nevents fixedFollowup followupTime accrualDuration subjects studyDuration
## 1      32          TRUE          6.5        31.20859 156.0429      37.70859

Simulation results confirmed the accuracy of this sample size estimate.

lrsim(kMax = 1, criticalValues = 1.96,  
      allocation1 = 3, allocation2 = 1,
      accrualIntensity = 5, 
      lambda1 = 0.3*0.95/12, lambda2 = 0.95/12, 
      gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24,
      accrualDuration = 31.2, followupTime = 6.5, 
      fixedFollowup = TRUE,  
      plannedEvents = 32, 
      maxNumberOfIterations = 1000, seed = 12345)
##                                               
## Fixed design                                  
## Overall power: 0.904                          
## Expected # events: 30.2                       
## Expected # dropouts: 3.7                      
## Expected # subjects: 152.5                    
## Expected study duration: 32.7                 
## Accrual duration: 31.2, fixed follow-up: TRUE 
##