Free examples and use-cases:   rpact vignettes
rpact: Confirmatory Adaptive Clinical Trial Design and Analysis

Summary

This R Markdown document provides examples for designing trials with continuous endpoints using rpact.

1 Introduction

These examples are not intended to replace the official rpact documentation and help pages but rather to supplement them. They also only cover a selection of all rpact features.

General convention: In rpact, arguments containing the index “2” always refer to the control group, “1” refer to the intervention group, and treatment effects compare treatment versus control.

First, load the rpact package

library(rpact)
packageVersion("rpact") # version should be version 3.0 or later
## [1] '3.3.1'

2 Sample size calculation for a superiority trial without interim analyses

The sample size for a trial with continuous endpoints can be calculated using the function getSampleSizeMeans(). This function is fully documented in the relevant help page (?getSampleSizeMeans). Some examples are provided below.

getSampleSizeMeans() requires that the mean difference between the two arms is larger under the alternative than under the null hypothesis. For superiority trials, this implies that rpact requires that the targeted mean difference is >0 under the alternative hypothesis. If this is not the case, the function produces an error message. To circumvent this and power for a negative mean difference, one can simply switch the two arms (leading to a positive mean difference) as the situation is perfectly symmetric.

By default, getSampleSizeMeans() tests hypotheses about the mean difference. rpact also supports testing hypotheses about mean ratios if the argument meanRatio is set to TRUE but this will not be discussed further in this document.

By default, rpact uses sample size formulas for the \(t\)-test, i.e., it assumes that the standard deviation in the two groups is equal but unknown and estimated from the data. If sample size calculations for the \(z\)-test are desired, one can set the argument normalApproximation to TRUE but this is usually not recommended.

# Example of a standard trial:
# - targeted mean difference is 10 (alternative = 10)
# - standard deviation in both arms is assumed to be 24 (stDev = 24)
# - two-sided test (sided = 2), Type I error 0.05 (alpha = 0.05) and power 80%
# - (beta = 0.2)
sampleSizeResult <- getSampleSizeMeans(
    alternative = 10, stDev = 24, sided = 2,
    alpha = 0.05, beta = 0.2
)
kable(sampleSizeResult)

Design plan parameters and output for means

Design parameters

  • Critical values: 1.96
  • Two-sided power: FALSE
  • Significance level: 0.0500
  • Type II error rate: 0.2000
  • Test: two-sided

User defined parameters

  • Alternatives: 10
  • Standard deviation: 24

Default parameters

  • Mean ratio: FALSE
  • Theta H0: 0
  • Normal approximation: FALSE
  • Treatment groups: 2
  • Planned allocation ratio: 1

Sample size and output

  • Number of subjects fixed: 182.8
  • Number of subjects fixed (1): 91.4
  • Number of subjects fixed (2): 91.4
  • Lower critical values (treatment effect scale): -7.006
  • Upper critical values (treatment effect scale): 7.006
  • Local two-sided significance levels: 0.0500

Legend

  • (i): values of treatment arm i

The generic summary() function produces the output

kable(summary(sampleSizeResult))

Sample size calculation for a continuous endpoint

Fixed sample analysis, significance level 5% (two-sided). The sample size was calculated for a two-sample t-test, H0: mu(1) - mu(2) = 0, H1: effect = 10, standard deviation = 24, power 80%.

Stage Fixed
Efficacy boundary (z-value scale) 1.960
Number of subjects 182.8
Two-sided local significance level 0.0500
Lower efficacy boundary (t) -7.006
Upper efficacy boundary (t) 7.006

Legend:

  • (t): treatment effect scale

As per the output above, the required total sample size for the trial is 183 and the critical value corresponds to a minimal detectable mean difference of approximately 7.01.

Unequal randomization between the treatment groups can be defind with allocationRatioPlanned, for example,

# Extension of standard trial:
# - 2(intervention):1(control) randomization (allocationRatioPlanned = 2)
kable(summary(getSampleSizeMeans(
    alternative = 10, stDev = 24,
    allocationRatioPlanned = 2, sided = 2, alpha = 0.05, beta = 0.2
)))

Sample size calculation for a continuous endpoint

Fixed sample analysis, significance level 5% (two-sided). The sample size was calculated for a two-sample t-test, H0: mu(1) - mu(2) = 0, H1: effect = 10, standard deviation = 24, planned allocation ratio = 2, power 80%.

Stage Fixed
Efficacy boundary (z-value scale) 1.960
Number of subjects 205.4
Two-sided local significance level 0.0500
Lower efficacy boundary (t) -7.004
Upper efficacy boundary (t) 7.004

Legend:

  • (t): treatment effect scale

Power for a given sample size can be calculated using the function getPowerMeans() which has the same arguments as getSampleSizeMeans() except that the maximum total sample is given (maxNumberOfSubjects) instead of the Type II error (beta).

# Calculate power for the 2:1 rendomized trial with total sample size 206
# (as above) assuming a larger difference of 12
powerResult <- getPowerMeans(
    alternative = 12, stDev = 24, sided = 2,
    allocationRatioPlanned = 2, maxNumberOfSubjects = 206, alpha = 0.05
)
kable(powerResult)

Design plan parameters and output for means

Design parameters

  • Critical values: 1.96
  • Significance level: 0.0500
  • Test: two-sided

User defined parameters

  • Alternatives: 12
  • Standard deviation: 24
  • Planned allocation ratio: 2
  • Direction upper: NA
  • Maximum number of subjects: 206

Default parameters

  • Mean ratio: FALSE
  • Theta H0: 0
  • Normal approximation: FALSE
  • Treatment groups: 2

Sample size and output

  • Effect: 12
  • Overall reject: 0.9203
  • Number of subjects fixed: 206
  • Number of subjects fixed (1): 137.3
  • Number of subjects fixed (2): 68.7
  • Lower critical values (treatment effect scale): -6.994
  • Upper critical values (treatment effect scale): 6.994
  • Local two-sided significance levels: 0.0500

Legend

  • (i): values of treatment arm i

The calculated power is provided in the output as “Overall reject” and is 0.92 for the example alternative = 12.

The summary() function produces

kable(summary(powerResult))

Power calculation for a continuous endpoint

Fixed sample analysis, significance level 5% (two-sided). The results were calculated for a two-sample t-test, H0: mu(1) - mu(2) = 0, H1: effect = 12, standard deviation = 24, number of subjects = 206, planned allocation ratio = 2.

Stage Fixed
Efficacy boundary (z-value scale) 1.960
Power 0.9203
Number of subjects 206.0
Two-sided local significance level 0.0500
Lower efficacy boundary (t) -6.994
Upper efficacy boundary (t) 6.994

Legend:

  • (t): treatment effect scale

getPowerMeans() (as well as getSampleSizeMeans()) can also be called with a vector argument for the mean difference under the alternative H1 (alternative). This is illustrated below via a plot of power depending on these values. For examples of all available plots, see the R Markdown document How to create admirable plots with rpact.

# Example: Calculate power for design with sample size 206 as above
# alternative values ranging from 5 to 15
powerResult <- getPowerMeans(
    alternative = 5:15, stDev = 24, sided = 2,
    allocationRatioPlanned = 2, maxNumberOfSubjects = 206, alpha = 0.05
)
plot(powerResult, type = 7) # one of several possible plots

3 Sample size calculation fo