Tricky question, lengthy answer [Power / Sample Size]
❝ 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
:library(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(!is.na(alpha))
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,
print=FALSE)
} 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,
print=FALSE)
} else { # Bayesian
x <- expsampleN.TOST(CV=CV, theta0=theta0, targetpower=target,
prior.type="CV", prior.parm=list(df=df),
print=FALSE)
}
res$n[j] <- x[["Sample size"]]
res$power[j] <- signif(x[["Achieved power"]], 4)
}
print(res)
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 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. [].
❝
❝ 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:
library(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"
x <- pa.ABE(CV=CV, theta0=theta0,
targetpower=target, design=design)
plot(x, pct=FALSE)
print(x)
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:
library(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"
expsampleN.TOST(CV=CV, theta0=theta0, targetpower=target,
prior.type="both", prior.parm=list(m=n, design=design),
details=FALSE)
++++++++++++ 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
❝ ❝ 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 ?
Yes.
- Gould AL. Group Sequential Extensions of a Standard Bioequivalence Testing Procedure. J Pharmacokinet Biopharm. 1995;23(1):57–86. doi:10.1007/BF02353786.
Dif-tor heh smusma 🖖🏼 Довге життя Україна!
Helmut Schütz
The quality of responses received is directly proportional to the quality of the question asked. 🚮
Science Quotes
Complete thread:
- Sample Size Calculation for Drug Effect and Food Effect study Olivbood 2019-05-08 16:16 [Power / Sample Size]
- Tricky question, lengthy answer Helmut 2019-05-08 18:02
- Tricky question, lengthy answer Olivbood 2019-05-08 19:20
- Tricky question, lengthy answerHelmut 2019-05-09 00:47
- Tricky question, lengthy answer Olivbood 2019-05-10 21:11
- Tricky question, lengthy answer Helmut 2019-05-14 14:11
- Degrees of freedom of TaaTP d_labes 2019-05-14 16:01
- Use of incomplete block design? Olivbood 2019-05-23 22:30
- Radio Yerevan answers Helmut 2019-05-24 11:28
- Use of incomplete block design? Olivbood 2019-05-23 22:30
- Degrees of freedom of TaaTP d_labes 2019-05-14 16:01
- Tricky question, lengthy answer Helmut 2019-05-14 14:11
- Tricky question, lengthy answer Olivbood 2019-05-08 19:20
- Tricky question, lengthy answer Helmut 2019-05-08 18:02