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, \[ D = \frac{(\Phi^{-1}(1-0.025) + \Phi^{-1}(0.9))^2 }{(\log(0.3))^2} \frac{(1 + 3)^2}{3} = 38.7, \] or 39 events. This is consistent with the output from the EAST software, which recommends 196 patients enrolled over 39.2 months. Denote this design as design 1.
On the other hand, the output from the lrsamplesize call implies that we only need 26 events with 126 subjects enrolled over 25.2 months, a dramatic difference from the Schoenfeld formula. Denote this design as design 2.
lrsamplesize(beta = 0.1, kMax = 1, criticalValues = 1.96,
allocationRatioPlanned = 3, accrualIntensity = 5,
lambda2 = 0.95/12, lambda1 = 0.3*0.95/12,
gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24,
accrualDuration = NA, followupTime = 26/4, fixedFollowup = TRUE)
##
## overallReject 0.900
## alpha 0.025
## numberOfEvents 25.876
## numberOfDropouts 3.162
## numberOfSubjects 126.182
## studyDuration 31.736
## accrualDuration 25.236
## followupTime 6.500
## fixedFollowup 1.000
## rho1 0.000
## rho2 0.000
## efficacyBounds 1.960
## efficacyHR 0.462
## efficacyP 0.025
## information 4.435
## HR 0.300
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,
lambda2 = 0.95/12, lambda1 = 0.3*0.95/12,
gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24,
accrualDuration = 39.2, followupTime = 6.5,
fixedFollowup = TRUE,
plannedEvents = 39,
maxNumberOfIterations = 1000, seed = 12345)
##
## overallReject 0.947
## expectedNumberOfEvents 37.495
## expectedNumberOfDropouts 4.579
## expectedNumberOfSubjects 189.192
## expectedStudyDuration 39.678
lrsim(kMax = 1, criticalValues = 1.96,
allocation1 = 3, allocation2 = 1,
accrualIntensity = 5,
lambda2 = 0.95/12, lambda1 = 0.3*0.95/12,
gamma1 = -log(1-0.1)/24, gamma2 = -log(1-0.1)/24,
accrualDuration = 25.2, followupTime = 6.5,
fixedFollowup = TRUE,
plannedEvents = 26,
maxNumberOfIterations = 1000, seed = 12345)
##
## overallReject 0.845
## expectedNumberOfEvents 24.272
## expectedNumberOfDropouts 2.962
## expectedNumberOfSubjects 123.246
## expectedStudyDuration 26.996
The simulated power is about 94% 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=37, \beta_0=0.06)\) and \((D_0=26, \beta_0=0.16)\) would yield \(D=32\) and \(D=31\), respectively. For \(D=32\), we need about 156 patients for an
enrollment period of 31.2 months,
\[
N = \frac{D}{ \frac{r}{1+r}\frac{\lambda_1}{\lambda_1+\gamma_1} (1 -
\exp(-(\lambda_1+\gamma_1)T_f)) +
\frac{1}{1+r}\frac{\lambda_2}{\lambda_2+\gamma_2} (1 -
\exp(-(\lambda_2+\gamma_2)T_f)) }
\] Simulation results confirmed the accuracy of this sample size
estimate.
lrsim(kMax = 1, criticalValues = 1.96,
allocation1 = 3, allocation2 = 1,
accrualIntensity = 5,
lambda2 = 0.95/12, lambda1 = 0.3*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)
##
## overallReject 0.904
## expectedNumberOfEvents 30.221
## expectedNumberOfDropouts 3.679
## expectedNumberOfSubjects 152.485
## expectedStudyDuration 32.747