Tricky question, lengthy answer [Power / Sample Size]
❝ If my understanding is correct,
❝ sampleN.TOST(design="3x6x3", ...[["Sample size"]]
would give me the sample size necessary for a power of 90% to detect BE for at least one given comparison (either A vs B or C vs B) if I evaluated all data at the same time, while sampleN.TOST(design="2x2x2", ...)[["Sample size"]]
would give me the sample size for a given comparison if I evaluated the data two at a time…
Correct.
❝ … (keeping in mind that I should potentially increase the result so that the sample size is a multiple of 6).
Oops! So no incentive in terms of sample size in this example.
❝ However, what should I do if I want the sample size for a power of 90% to detect BE for both comparisons ? If I assume that there is not correlation between both comparisons, and be n = sampleN.TOST(CV=0.3, design="2x2x2", targetpower=0.9, print=FALSE)[["Sample size"]]
, then:
❝ power.TOST(CV=0.3, design="2x2x2", n=n) * power.TOST(CV=0.3, design="2x2x2", n=n)
would evaluate to less than 0.9.
The other way ’round. If you assume no correlation, overall power ~ power of the part driving the sample size (higher CV and/or worse PE). If correlation = 1, then overall power = power1 × power2. I suggest to use function
sampleN.2TOST
in this case…library(PowerTOST)
CV.2 <- CV.1 <- 0.30
theta0.2 <- theta0.1 <- 0.95
target <- 0.90
# rho 1 throws an error in earlier versions
if (packageVersion("PowerTOST") > "1.4.7") {
rho <- c(0, 1)
} else {
rho <- c(0, 1-.Machine$double.eps)
}
res <- data.frame(fun=c(rep("sampleN.TOST", 2), rep("sampleN.2TOST", 2)),
CV.1=rep(CV.1, 4), CV.2=rep(CV.2, 4),
theta0.1=rep(theta0.1, 4), theta0.2=rep(theta0.2, 4),
rho=signif(rep(rho, 2), 4), n1=NA, n2=NA, n=0,
pwr.1=NA, pwr.2=NA, pwr=0, stringsAsFactors=FALSE)
n.1 <- sampleN.TOST(CV=CV.1, theta0=theta0.1, targetpower=target,
design="2x2x2", print=FALSE)[["Sample size"]]
n.1 <- n.1 + (6 - n.1 %% 6) # round up to the next multiple of 6
n.2 <- sampleN.TOST(CV=CV.2, theta0=theta0.2, targetpower=target,
design="2x2x2", print=FALSE)[["Sample size"]]
n.2 <- n.2 + (6 - n.2 %% 6)
n <- max(n.1, n.2)
pwr.1 <- power.TOST(CV=CV.1, theta0=theta0.1, design="2x2x2", n=n)
pwr.2 <- power.TOST(CV=CV.2, theta0=theta0.2, design="2x2x2", n=n)
# rho = 0
if (n.1 > n.2) {
pwr <- pwr.1
} else {
pwr <- pwr.2
}
res[1, 7:12] <- c(n.1, n.2, n, pwr.1, pwr.2, pwr)
# rho = 1
pwr <- pwr.1*pwr.2
res[2, 7:12] <- c(n.1, n.2, n, pwr.1, pwr.2, pwr)
for (j in seq_along(rho)) {
x <- suppressWarnings(sampleN.2TOST(CV=c(CV.1, CV.2),
theta0=c(theta0.1, theta0.2),
targetpower=target, rho=rho[j], nsims=1e6,
print=FALSE))
res[2+j, "n"] <- x[["Sample size"]]
res[2+j, "pwr"] <- x[["Achieved power"]]
}
print(res, row.names=FALSE)
… which gives
fun CV.1 CV.2 theta0.1 theta0.2 rho n1 n2 n pwr.1 pwr.2 pwr
sampleN.TOST 0.3 0.3 0.95 0.95 0 54 54 54 0.9117921 0.9117921 0.9117921
sampleN.TOST 0.3 0.3 0.95 0.95 1 54 54 54 0.9117921 0.9117921 0.8313649
sampleN.2TOST 0.3 0.3 0.95 0.95 0 NA NA 64 NA NA 0.9093240
sampleN.2TOST 0.3 0.3 0.95 0.95 1 NA NA 52 NA NA 0.9018890
Maybe the ratios and CVs are not identical. Try:
CV.1 <- 0.20 # fasting might be lower
CV.2 <- 0.30 # fed/fasting might be higher
theta0.1 <- 0.95 # optimistic
theta0.2 <- 0.90 # might be worse
Then you end up with this:
fun CV.1 CV.2 theta0.1 theta0.2 rho n1 n2 n pwr.1 pwr.2 pwr
sampleN.TOST 0.2 0.3 0.95 0.9 0 30 114 114 0.9999994 0.91402 0.9140200
sampleN.TOST 0.2 0.3 0.95 0.9 1 30 114 114 0.9999994 0.91402 0.9140195
sampleN.2TOST 0.2 0.3 0.95 0.9 0 NA NA 108 NA NA 0.9004570
sampleN.2TOST 0.2 0.3 0.95 0.9 1 NA NA 108 NA NA 0.9000410
❝ Is it correct to calculate the sample size only based on one comparison?
Depends on what you want. If you want to show similarity of both (BE and lacking food effects), no. If not, base the sample size on the BE-part.
❝ Furthermore, while the two parts of the trial will be evaluated as incomplete block designs, it seems to me that the original sequences and periods are preserved (e.g. an observation from period 3 is still coded as period 3), so that the degree of freedom would not be the same as for the conventional 2x2x2 crossover, no?
Correct. Has some strange side-effects (see there).
❝ Lastly, when you said no multiplicity adjustment procedure was needed, was it implied that I should specify that BE between the clinical and marketed formulation will be tested first, before the food effect (i.e. hierarchical testing)?
No. These tests aim a completely different targets. Hence, the order is not relevant (though in practice, if the BE-part fails the fed/fasting is history).
❝ It is just to be in accordance with EMA and FDA.
Not sure what you mean here.
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 answer Helmut 2019-05-09 00:47
- Tricky question, lengthy answer Olivbood 2019-05-10 21:11
- Tricky question, lengthy answerHelmut 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 answerHelmut 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