Skip to contents

Calculates the required sample size for a target power using an analytic formula based on the methods of Tian et al. (2014).

Usage

linear.ss.analytical(
  pilot_data,
  time_var,
  status_var,
  arm_var,
  target_power,
  linear_terms = NULL,
  L,
  alpha = 0.05,
  n_start = 50,
  n_step = 25,
  max_n_per_arm = 2000
)

Arguments

pilot_data

A data.frame containing pilot study data.

time_var

A character string specifying the name of the time-to-event variable.

status_var

A character string specifying the name of the event status variable (1=event, 0=censored).

arm_var

A character string specifying the name of the treatment arm variable (1=treatment, 0=control).

target_power

A single numeric value for the desired power (e.g., 0.80 or 0.90).

linear_terms

An optional character vector of other covariate names to include in the model.

L

The numeric value for the RMST truncation time.

alpha

The significance level (Type I error rate).

n_start

The starting sample size per arm for the search.

n_step

The increment in sample size at each step of the search.

max_n_per_arm

The maximum sample size per arm to search up to.

Value

A list containing:

results_data

A data.frame with the target power and the required sample size per arm.

results_plot

A ggplot object visualizing the sample size search path.

results_summary

A data.frame summarizing the treatment effect from the pilot data used for the calculation.

Details

This function performs an iterative search to find the sample size needed to achieve a specified target_power. It uses the same underlying theory as linear.power.analytical. First, it estimates the treatment effect size and its asymptotic variance from the pilot data. Then, it iteratively calculates the power for increasing sample sizes using the analytic formula until the target power is achieved.

Examples

pilot_df <- data.frame(
  time = c(rexp(50, 0.1), rexp(50, 0.07)), # Introduce an effect
  status = rbinom(100, 1, 0.8),
  arm = rep(0:1, each = 50),
  age = rnorm(100, 55, 10)
)
ss_results <- linear.ss.analytical(
  pilot_data = pilot_df,
  time_var = "time",
  status_var = "status",
  arm_var = "arm",
  target_power = 0.80,
  L = 10
)
#> --- Estimating parameters from pilot data for analytic search... ---
#> Model: Y_rmst ~ factor(arm)
#> --- Searching for Sample Size (Method: Analytic) ---
#>   N = 50/arm, Calculated Power = 0.034
#>   N = 75/arm, Calculated Power = 0.037
#>   N = 100/arm, Calculated Power = 0.039
#>   N = 125/arm, Calculated Power = 0.041
#>   N = 150/arm, Calculated Power = 0.043
#>   N = 175/arm, Calculated Power = 0.044
#>   N = 200/arm, Calculated Power = 0.046
#>   N = 225/arm, Calculated Power = 0.048
#>   N = 250/arm, Calculated Power = 0.049
#>   N = 275/arm, Calculated Power = 0.051
#>   N = 300/arm, Calculated Power = 0.052
#>   N = 325/arm, Calculated Power = 0.054
#>   N = 350/arm, Calculated Power = 0.055
#>   N = 375/arm, Calculated Power = 0.057
#>   N = 400/arm, Calculated Power = 0.058
#>   N = 425/arm, Calculated Power = 0.059
#>   N = 450/arm, Calculated Power = 0.061
#>   N = 475/arm, Calculated Power = 0.062
#>   N = 500/arm, Calculated Power = 0.064
#>   N = 525/arm, Calculated Power = 0.065
#>   N = 550/arm, Calculated Power = 0.066
#>   N = 575/arm, Calculated Power = 0.068
#>   N = 600/arm, Calculated Power = 0.069
#>   N = 625/arm, Calculated Power = 0.07
#>   N = 650/arm, Calculated Power = 0.071
#>   N = 675/arm, Calculated Power = 0.073
#>   N = 700/arm, Calculated Power = 0.074
#>   N = 725/arm, Calculated Power = 0.075
#>   N = 750/arm, Calculated Power = 0.077
#>   N = 775/arm, Calculated Power = 0.078
#>   N = 800/arm, Calculated Power = 0.079
#>   N = 825/arm, Calculated Power = 0.08
#>   N = 850/arm, Calculated Power = 0.082
#>   N = 875/arm, Calculated Power = 0.083
#>   N = 900/arm, Calculated Power = 0.084
#>   N = 925/arm, Calculated Power = 0.085
#>   N = 950/arm, Calculated Power = 0.087
#>   N = 975/arm, Calculated Power = 0.088
#>   N = 1000/arm, Calculated Power = 0.089
#>   N = 1025/arm, Calculated Power = 0.09
#>   N = 1050/arm, Calculated Power = 0.092
#>   N = 1075/arm, Calculated Power = 0.093
#>   N = 1100/arm, Calculated Power = 0.094
#>   N = 1125/arm, Calculated Power = 0.095
#>   N = 1150/arm, Calculated Power = 0.096
#>   N = 1175/arm, Calculated Power = 0.098
#>   N = 1200/arm, Calculated Power = 0.099
#>   N = 1225/arm, Calculated Power = 0.1
#>   N = 1250/arm, Calculated Power = 0.101
#>   N = 1275/arm, Calculated Power = 0.103
#>   N = 1300/arm, Calculated Power = 0.104
#>   N = 1325/arm, Calculated Power = 0.105
#>   N = 1350/arm, Calculated Power = 0.106
#>   N = 1375/arm, Calculated Power = 0.107
#>   N = 1400/arm, Calculated Power = 0.109
#>   N = 1425/arm, Calculated Power = 0.11
#>   N = 1450/arm, Calculated Power = 0.111
#>   N = 1475/arm, Calculated Power = 0.112
#>   N = 1500/arm, Calculated Power = 0.113
#>   N = 1525/arm, Calculated Power = 0.115
#>   N = 1550/arm, Calculated Power = 0.116
#>   N = 1575/arm, Calculated Power = 0.117
#>   N = 1600/arm, Calculated Power = 0.118
#>   N = 1625/arm, Calculated Power = 0.119
#>   N = 1650/arm, Calculated Power = 0.121
#>   N = 1675/arm, Calculated Power = 0.122
#>   N = 1700/arm, Calculated Power = 0.123
#>   N = 1725/arm, Calculated Power = 0.124
#>   N = 1750/arm, Calculated Power = 0.125
#>   N = 1775/arm, Calculated Power = 0.127
#>   N = 1800/arm, Calculated Power = 0.128
#>   N = 1825/arm, Calculated Power = 0.129
#>   N = 1850/arm, Calculated Power = 0.13
#>   N = 1875/arm, Calculated Power = 0.131
#>   N = 1900/arm, Calculated Power = 0.133
#>   N = 1925/arm, Calculated Power = 0.134
#>   N = 1950/arm, Calculated Power = 0.135
#>   N = 1975/arm, Calculated Power = 0.136
#>   N = 2000/arm, Calculated Power = 0.137
#> Warning: Target power 0.8 not achieved by max N of 2000
#> 
#> --- Calculation Summary ---
#> 
#> 
#> Table: Required Sample Size
#> 
#> | Target_Power| Required_N_per_Arm|
#> |------------:|------------------:|
#> |          0.8|               2000|
print(ss_results$results_data)
#>   Target_Power Required_N_per_Arm
#> 1          0.8               2000
print(ss_results$results_plot)