Find Sample Size for a Linear RMST Model (Analytic)
linear.ss.analytical.Rd
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)