Hi Ibrahim,
❝ I had performed a 2X2 crossover study […] The results showed a very high unexpected intra-subject variability as following:
❝ Cmax: 73.8451%, AUCt: 67.6524%
❝
❝ Therefore, a sequential two stage study won't be applicable in that condition.
Correct. Such a method does not exist.
❝ My question is: If i repeat the aforementioned study again, shall i follow a partial replicated cross over design or full replicated cross over design?
I recommend a full replicate design. If you want to have only three periods, opt for TRT|RTR
or TRR|RTT. The partial replicate is nasty when it comes to heteroscedasticity (
CVwT ≠ CVwR).
It’s a little bit tricky because the
CVw of the 2×2×2 is actually
pooled from the (unknown) intra-subject variabilities of T and R (
CVwT and
CVwR). If you naïvely use the
CVw in the sample size estimation (assuming that
CVwT =
CVwR), beware of these possibilities:
- CVwT ≈ CVwR: All is good.
- CVwT < CVwR: Study may be ‘overpowered’, money lost.
- CVwT > CVwR: Study may be ‘underpowered’, risky.
Hence, if you don’t want to perform a pilot study in a replicate design (recommended!), at least explore the possibilities to be protected against surprises. Quite often
CVwT <
CVwR which allows for a lower sample size.
![[image]](img/uploaded/Rlogo_15_12.svg)
-script at the end.
Results with your values, variance ratios (
s2wT /
s2wR = 0.5 … 2), assumed T/R-ratio 0.9 (don’t use a ‘better’ one for a HVD), target power 80%, the EMA’s Average Bioequivalence with Expanding Limits (ABEL) if
CVwR of
Cmax > 30%, conventional ABE for
AUC, various designs.
2x2x3 is a 2-sequence 3-period full replicate design (TRT|RTR
or TRR|RTT),
2x2x4 is a 2-sequence 4-period full replicate design (TRTR|RTRT, TRRT|RTTR,
or TTRR|RRTT),
2x3x3 is the 3-sequence 3-period partial replicate design (TRR|RTR|RRT).
regulator Cmax cap AUC cap
EMA ABEL 50.00% ABE <NA>
2x2x3 design
Cmax
CVwT CVwR var.ratio method n power
0.5802 0.8869 0.5000 ABEL 64 0.8008
0.6454 0.8282 0.6667 ABEL 64 0.8007
0.7385 0.7385 1.0000 ABEL 64 0.8001
0.8282 0.6454 1.5000 ABEL 66 0.8088
0.8869 0.5802 2.0000 ABEL 68 0.8099
AUC
CVw method n power
0.676524 ABE 254 0.8019
regulator Cmax cap AUC cap
EMA ABEL 50.00% ABE <NA>
2x2x4 design
Cmax
CVwT CVwR var.ratio method n power
0.5802 0.8869 0.5000 ABEL 44 0.8123
0.6454 0.8282 0.6667 ABEL 44 0.8124
0.7385 0.7385 1.0000 ABEL 44 0.8122
0.8282 0.6454 1.5000 ABEL 44 0.8107
0.8869 0.5802 2.0000 ABEL 44 0.8035
AUC
CVw method n power
0.676524 ABE 170 0.8033
regulator Cmax cap AUC cap
EMA ABEL 50.00% ABE <NA>
2x3x3 design
Cmax
CVwT CVwR var.ratio method n power
0.5802 0.8869 0.5000 ABEL 72 0.8324
0.6454 0.8282 0.6667 ABEL 69 0.8224
0.7385 0.7385 1.0000 ABEL 66 0.8119
0.8282 0.6454 1.5000 ABEL 63 0.8020
0.8869 0.5802 2.0000 ABEL 63 0.8035
Lessons learned: With such high variability you are far above the EMA’s upper cap of scaling (50%) and you may expand the limits only to 69.84–143.19%. Here different variabilities don’t count that much because the procedure behaves similar to the TOST (apart from the point estimate constraint).
AUC is the shown-stopper. For the EMA (and acc. to the Egyptian guideline) you are not allowed to expand the limits and have to go with ABE.
❝ My second: Shall i follow RASBE or unscaled BE limits ?
It depends on your ‘target’ jurisdiction.
- ASEAN states, Australia, the East African Community, Egypt, EMA, the Eurasian Economic Union, New Zealand, Chile, Brazil:
ABEL for Cmax, ABE for AUC.
- Health Canada:
ABEL for AUC, point estimate of Cmax within 80.0–125.0%.
- WHO:
ABEL for Cmax and AUC; full replicate design mandatory for the latter.
- FDA, China:
RSABE for Cmax and AUC.
Try the script with
regulator <- "FDA"
or
"WHO"
or
"HC"
. Since in those jurisdictions you are allowed to scale
AUC, doable.
regulator Cmax cap AUC cap
FDA RSABE <NA> RSABE <NA>
2x2x4 design
Cmax
CVwT CVwR var.ratio method n power
0.5802 0.8869 0.5000 RSABE 26 0.8114
0.6454 0.8282 0.6667 RSABE 26 0.8102
0.7385 0.7385 1.0000 RSABE 26 0.8047
0.8282 0.6454 1.5000 RSABE 28 0.8045
0.8869 0.5802 2.0000 RSABE 32 0.8154
AUC
CVwT CVwR var.ratio method n power
0.5344 0.8080 0.5000 RSABE 22 0.8023
0.5932 0.7562 0.6667 RSABE 24 0.8146
0.6765 0.6765 1.0000 RSABE 24 0.8029
0.7562 0.5932 1.5000 RSABE 28 0.8158
0.8080 0.5344 2.0000 RSABE 30 0.8036
regulator Cmax cap AUC cap
WHO ABEL 50.00% ABEL 50.00%
2x2x4 design
Cmax
CVwT CVwR var.ratio method n power
0.5802 0.8869 0.5000 ABEL 44 0.8123
0.6454 0.8282 0.6667 ABEL 44 0.8124
0.7385 0.7385 1.0000 ABEL 44 0.8122
0.8282 0.6454 1.5000 ABEL 44 0.8107
0.8869 0.5802 2.0000 ABEL 44 0.8035
AUC
CVwT CVwR var.ratio method n power
0.5344 0.8080 0.5000 ABEL 38 0.8096
0.5932 0.7562 0.6667 ABEL 38 0.8092
0.6765 0.6765 1.0000 ABEL 38 0.8080
0.7562 0.5932 1.5000 ABEL 38 0.8016
0.8080 0.5344 2.0000 ABEL 40 0.8003
regulator Cmax cap AUC cap
HC PE <NA> ABEL 57.38%
2x2x4 design
Cmax
CVw method n power
0.738451 PE 24 0.8018
AUC
CVwT CVwR var.ratio method n power
0.5344 0.8080 0.5000 ABEL 30 0.8159
0.5932 0.7562 0.6667 ABEL 30 0.8137
0.6765 0.6765 1.0000 ABEL 30 0.8040
0.7562 0.5932 1.5000 ABEL 34 0.8151
0.8080 0.5344 2.0000 ABEL 38 0.8067
library(PowerTOST)
CV.p.Cmax <- 0.738451 # CVw of 2x2x2 study (pooled from unknown CVwT and CVwR)
CV.p.AUC <- 0.676524 # CVw of 2x2x2 study (pooled from unknown CVwT and CVwR)
regulator <- "EMA" # select from "EMA", "HC" (Health Canada),
# "GCC" (Gulf Cooperation Council), "WHO", "FDA"
theta0 <- 0.90 # assumed T/R-ratio
target <- 0.80 # target (desired) power
design <- "2x2x3" # 2-sequence 3-period full replicate design
# alternatively:
# "2x2x4" 2-sequence 4-period full replicate design
# "2x3x3" 2-sequence 3-period partial replicate design
ratio <- unique(sort(c(1/seq(1, 2, 0.5), seq(1, 2, 0.5))))
# assumed variance ratios: s2wT / s2wR
# CVwT and CVwR
CV.Cmax <- CVp2CV(CV = CV.p.Cmax, ratio = ratio)
CV.AUC <- CVp2CV(CV = CV.p.AUC, ratio = ratio)
if (regulator == "HC") {
res.Cmax <- data.frame(CVw = CV.p.Cmax, method = "PE", n = NA,
power = NA, stringsAsFactors = FALSE)
} else {
res.Cmax <- data.frame(CVwT = CV.Cmax[, 1], CVwR = CV.Cmax[, 2],
var.ratio = ratio, method = NA, n = NA,
power = NA, stringsAsFactors = FALSE)
}
if (regulator %in% c("HC", "WHO", "FDA")) {
res.AUC <- data.frame(CVwT = CV.AUC[, 1], CVwR = CV.AUC[, 2],
var.ratio = ratio, method = NA, n = NA,
power = NA, stringsAsFactors = FALSE)
} else {
res.AUC <- data.frame(CVw = CV.p.AUC, method = "ABE", n = NA,
power = NA, stringsAsFactors = FALSE)
}
cond <- data.frame(regulator = c("EMA", "WHO", "GCC", "HC", "FDA"),
Cmax = c(rep("ABEL", 3), "PE", "RSABE"),
V1 = c(rep(sprintf("%.2f%%",
100*reg_const(regulator = "EMA")$CVcap), 2),
NA, NA, NA),
AUC = c("ABE", "ABEL", "ABE", "ABEL", "RSABE"),
V2 = c(NA, sprintf("%.2f%%",
100*reg_const(regulator = "EMA")$CVcap),
NA, sprintf("%.2f%%",
100*reg_const(regulator = "HC")$CVcap), NA))
names(cond)[c(3, 5)] <- "cap"
pb <- txtProgressBar(0, 1, 0, char = "\u2588", width = NA, style = 3)
i <- 0
for (j in 1:nrow(res.Cmax)) {
i <- i + 1
if (regulator == "HC") { # only PE within 80.0-125.0%
res.Cmax[j, 3:4] <- sampleN.TOST(alpha = 0.5, CV = CV.p.Cmax,
theta0 = theta0, targetpower = target,
design = design, print = FALSE)[7:8]
} else { # others
CV <- as.numeric(c(res.Cmax[j, 1:2]))
if (!regulator == "FDA") { # all but the FDA
res.Cmax$method[j] <- "ABEL"
if (!design == "2x3x3" & (res.Cmax[j, 1] > res.Cmax[j, 2])) {
res.Cmax[j, 5:6] <- sampleN.scABEL(CV = CV, theta0 = theta0,
targetpower = target,
design = design, details = FALSE,
print = FALSE)[8:9]
} else { # if partial replicate and CVwT > CVwR: subject simulations
res.Cmax[j, 5:6] <- sampleN.scABEL.sdsims(CV = CV, theta0 = theta0,
targetpower = target,
design = design,
details = FALSE, print = FALSE,
progress = FALSE)[8:9]
}
} else { # FDA (subject simulations not implemented)
res.Cmax$method[j] <- "RSABE"
res.Cmax[j, 5:6] <- sampleN.RSABE(CV = CV, theta0 = theta0,
targetpower = target, design = design,
details = FALSE, print = FALSE)[8:9]
}
}
setTxtProgressBar(pb, i/(nrow(res.Cmax)+nrow(res.AUC)))
} # estimating results for Cmax
if (regulator == "WHO") reg <- "EMA"
for (j in 1:nrow(res.AUC)) {
i <- i + 1
if (regulator %in% c("EMA", "GCC")) { # ABE
res.AUC[j, 3:4] <- sampleN.TOST(CV = CV.p.AUC, theta0 = theta0,
targetpower = target, design = design,
details = FALSE, print = FALSE)[7:8]
} else { # others
CV <- as.numeric(c(res.AUC[j, 1:2]))
if (!regulator == "FDA") { # all but the FDA
res.AUC$method[j] <- "ABEL"
if (!design == "2x3x3" & (res.AUC[j, 1] <= res.AUC[j, 2]) | reg == "HC") {
res.AUC[j, 5:6] <- sampleN.scABEL(CV = CV, theta0 = theta0,
targetpower = target, design = design,
regulator = reg, details = FALSE,
print = FALSE)[8:9]
} else { # if partial replicate and CVwT > CVwR: subject simulations
res.AUC[j, 5:6] <- sampleN.scABEL.sdsims(CV = CV, theta0 = theta0,
targetpower = target,
design = design,
regulator = reg,
details = FALSE,
print = FALSE,
progress = FALSE)[8:9]
}
} else { # FDA (subject simulations not implemented)
res.AUC$method[j] <- "RSABE"
res.AUC[j, 5:6] <- sampleN.RSABE(CV = CV, theta0 = theta0,
targetpower = target, design = design,
details = FALSE, print = FALSE)[8:9]
}
}
setTxtProgressBar(pb, i/(nrow(res.Cmax)+nrow(res.AUC)))
} # estimating results for AUC
close(pb)
if (regulator == "HC") {
res.Cmax[, 4] <- signif(res.Cmax[, 4], 4)
} else {
res.Cmax[, c(1:3, 6)] <- signif(res.Cmax[, c(1:3, 6)], 4)
}
if (!regulator %in% c("EMA", "GCC")) {
res.AUC[, c(1:3, 6)] <- signif(res.AUC[, c(1:3, 6)], 4)
} else {
res.AUC[, 4] <- signif(res.AUC[, 4], 4)
}
info <- paste(design, "design", "\n Cmax\n")
print(cond[cond$regulator == regulator, ], row.names = FALSE);cat(info);print(res.Cmax, row.names = FALSE);cat(" AUC\n"); print(res.AUC, row.names = FALSE)