---
title: "Sample Size Calculation With Fixed Follow-up"
author: "Kaifeng Lu"
date: "12/15/2021"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Sample Size Calculation With Fixed Follow-up}
  %\VignetteEngine{knitr::rmarkdown}
  \usepackage[utf8]{inputenc}
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

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:  
```{r}
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. 
```{r}
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)
```

To check the accuracy of either solution, we run simulations using the lrsim function. 
```{r}
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)

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)
```
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. 
```{r}
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)
```
