Tricky question, lengthy answer [Power / Sample Size]

posted by Helmut Homepage – Vienna, Austria, 2019-05-09 00:47  – Posting: # 20276
Views: 933

Hi Olivbood,

» Thanks for your instructive answer !

My pleasure.

» » The most important CV is the one of Cmax. Here I would allow for an even larger safety margin […].
» I see, would you know of any guidance or "good practice" on how to determine this safety margin?

No idea. If you have variability/ies you could use an upper confidence limit of the CV (that’s what I do). The higher the sample size of the previous study/ies, the lower the uncertainty of the CV and hence, the tighter the CI of the CV. Various approaches in PowerTOST:

CV     <- 0.25    # Estimated in previous study
n      <- 24      # Its (total) sample size
theta0 <- 0.95    # Assumed T/R-ratio
target <- 0.90    # Target (desired) power
design <- "2x2x2" # or "paired"
alpha  <- c(NA, 0.05, 0.20, 0.25, NA) # 0.05: default, 0.25: Gould
if (design == "2x2x2") df <- n-2 else df <- n-1
alpha.not.NA <- which(!
res <- data.frame(CV=rep(CV, length(alpha)), df=rep(df, length(alpha)),
                  approach=c("\'carved in stone\'",
                           paste0("CI.", 1:length(alpha.not.NA)),
                           "Bayesian"), alpha=alpha, upper.CL=NA, n=NA,
                  power=NA, stringsAsFactors=FALSE)
res$approach[alpha.not.NA] <- paste0(100*(1-alpha[alpha.not.NA]),"% CI")
for (j in seq_along(alpha)) {
  if (j == 1) {               # 'carved in stone'
    x <- sampleN.TOST(CV=CV, theta0=theta0, targetpower=target,
  } else if (j < nrow(res)) { # based on upper CL of CV
    res$upper.CL[j] <- signif(CVCL(CV=CV, df=df,
                              alpha=res$alpha[j])[["upper CL"]], 4)
    x <- sampleN.TOST(CV=res$upper.CL[j], theta0=theta0, targetpower=target,
  } else {                    # Bayesian
    x <- expsampleN.TOST(CV=CV, theta0=theta0, targetpower=target,
                         prior.type="CV", prior.parm=list(df=df),
  res$n[j]     <- x[["Sample size"]]
  res$power[j] <- signif(x[["Achieved power"]], 4)

    CV df          approach alpha upper.CL  n  power
1 0.25 22 'carved in stone'    NA       NA 38 0.9089
2 0.25 22            95% CI  0.05   0.3379 66 0.9065
3 0.25 22            80% CI  0.20   0.2919 50 0.9051
4 0.25 22            75% CI  0.25   0.2836 48 0.9085
5 0.25 22          Bayesian    NA       NA 42 0.9039

The 1st row gives the ‘carved in stone’ results (i.e., one believes that in the next study the CV will be like in the previous study – or lower). Used by many but risky and IMHO, not a good idea.
The default alpha of function CVCL() calculates a one-sided 95% CI. Pretty conservative (2nd row).
In the spirit of a producer’s risk of 20% I try to convince my clients to use an 80% CI (3rd row).
Gould* recommends a 75% CI (4th row).
You can walk the Bayesian route as well (5th row).
Up to you. ;-)

» » Now it gets nasty. In many cases the variability in fed state is (much) higher than in fasted state. [:blahblah:].
» That's interesting ! As far as I know no BE study is planned in the fed state (since the clinical formulation is only administered in fasting state), but I'll pass on the note.

Well… If already known that you will write sumfink like “X has to be administered on an empty stomach” in the SmPC/label, why bother about trying to demonstrate lacking food effects? If you find one, write in the SmPC/label “Food de/increases the absorption of X by y%”. If you want – only for marketing purposes (better compliance) – to write “Food does not influence the absorption of X. However, administration on an empty stomach is recommended.” you have to power the study to be within the limits in order to support such a claim.

Unfortunately your story does not end here. Actually that’s only the start. Power (and therefore, the sample size) is much more dependent on the PE than on the CV. Try this:

CV     <- 0.25    # Estimated in previous study
n      <- 24      # Its (total) sample size
theta0 <- 0.95    # Assumed T/R-ratio
target <- 0.90    # Target (desired) power
design <- "2x2x2" # or "paired"
x      <- pa.ABE(CV=CV, theta0=theta0,
                 targetpower=target, design=design)
plot(x, pct=FALSE)

Sample size plan ABE
 Design alpha   CV theta0 theta1 theta2 Sample size Achieved power
  2x2x2  0.05 0.25   0.95    0.8   1.25          38      0.9088902

Power analysis
CV, theta0 and number of subjects which lead to min. acceptable power of at least 0.7:
 CV= 0.3362, theta0= 0.9064
 N = 23 (power= 0.7173)

You have no data about fed/fasting so far. What now? With the Bayesian approach you could take the uncertainty of the PE into account as well:

CV     <- 0.25    # Estimated in previous study
n      <- 24      # Its (total) sample size
theta0 <- 0.95    # Assumed T/R-ratio
target <- 0.90    # Target (desired) power
design <- "2x2x2" # or "paired"
expsampleN.TOST(CV=CV, theta0=theta0, targetpower=target,
                prior.type="both", prior.parm=list(m=n, design=design),

++++++++++++ Equivalence test - TOST ++++++++++++
  Sample size est. with uncertain CV and theta0
Study design:  2x2 crossover
log-transformed data (multiplicative model)

alpha = 0.05, target power = 0.9
BE margins = 0.8 ... 1.25
Ratio = 0.95 with 22 df
CV = 0.25 with 22 df

Sample size (ntotal)
 n   exp. power
98   0.901208

Crazy sample size but still speculative cause you have no clue about the food effect yet.

» » You only have to observe the one with the highest variability / largest deviation form unity. Yep, doable in Power.TOST. ;-)
» I see, so I would only need to power the study for (supposedly) Cmax, and not use for instance the function power.2TOST to calculate the power of two TOST procedure for Cmax and AUC (either 0-inf or 0-t)?

No. You have to show BE for all PK metrics with α 0.05 each and the Intersection-Union-Test (IUT) maintains the type I error. Just estimate the sample size for the most nasty PK metric. I feel a little bit guilty since I was such a nuisance to Detlew and Benjamin. They worked hard to implement power.2TOST(). The idea sounds great but the correlation of say, AUC and Cmax is unknown in practice. See here and there. For a while we were even considering removing it from PowerTOST

» So, no need to perform multiplicity adjustment is that right ?


Helmut Schütz

The quality of responses received is directly proportional to the quality of the question asked. ☼
Science Quotes

Complete thread:

 Mix view
Bioequivalence and Bioavailability Forum |  Admin contact
19,514 posts in 4,141 threads, 1,336 registered users;
online 9 (0 registered, 9 guests [including 9 identified bots]).
Forum time (Europe/Vienna): 21:44 CEST

I have not failed 700 times. I have not failed once.
I have succeeded in proving
that those 700 ways will not work.    Thomas Alva Edison

BEBAC Ing. Helmut Schütz