Don’t use FARTSSIE for SABE [Power / Sample Size]

posted by Helmut Homepage – Vienna, Austria, 2022-03-23 20:42 (763 d 22:18 ago) – Posting: # 22868
Views: 2,632

Hi Divyen,

❝ But my point for Bebac user was- He/She shall enhance the limit based on Swr and then calculate the subject size. I am still a fan of Dave's FARTSSIE and uses older version.


See this post and followings. Even if you are a fan of Dave (as I am), that’s not even wrong.Let’s try to reproduce what FARTSSIE does:

library(PowerTOST)
balance <- function(n, seq) {
  return(as.integer(seq * (n %/% seq + as.logical(n %% seq))))
}
sampleN.FARTSSIE <- function(CV, theta0, targetpower, design) {
  admin   <- as.integer(substr(design, 1, 1)) *
             as.integer(substr(design, 3, 3)) *
             as.integer(substr(design, 5, 5))
  LU      <- setNames(scABEL(CV), c("theta1", "theta2"))
  n.cross <- sampleN.TOST(CV = CV, theta0 = theta0,
                          theta1 = LU[["theta1"]],
                          theta2 = LU[["theta2"]],
                          targetpower = targetpower,
                          design = "2x2x2",
                          method = "noncentral",
                          print = FALSE)[["Sample size"]]
  # Note: FARTSSIE leaves rounding up to
  #       balanced sequences to the user

  return(balance(n.cross * 8 / admin,
                 as.integer(substr(design, 3, 3))))
}
theta0      <- 0.90
targetpower <- 0.80
CV          <- seq(0.3, 0.5, 0.05)
# The partial replicate design (TRR|RTR|RRT) is not supported in FARTSSIE
# and Balaam’s design (TR|RT|TT|RR) is not supported in sampleN.scABEL().

res         <- data.frame(CV = CV, design = rep(c("2x2x3", "2x2x4"),
                                                each = length(CV)),
                          n.FARTSSIE = NA_integer_, pwr.FARTSSIE = NA_real_,
                          n.scABEL = NA_integer_, pwr.scABEL = NA_real_,
                          pwr.SABE = NA_real_, pwr.PE = NA_real_,
                          pwr.ABE = NA_real_)
for (j in 1:nrow(res)) {
  res$n.FARTSSIE[j]   <- sampleN.FARTSSIE(CV = res$CV[j], theta0 = theta0,
                                          targetpower = targetpower,
                                          design = res$design[j])
  res$pwr.FARTSSIE[j] <- power.scABEL(CV = res$CV[j], theta0 = theta0,
                                      n = res$n.FARTSSIE[j], design = res$design[j])
  tmp                 <- sampleN.scABEL(CV = res$CV[j], theta0 = theta0,
                                        targetpower = targetpower,
                                        design = res$design[j], details = FALSE,
                                        print = FALSE)
  res$n.scABEL[j]     <- tmp[["Sample size"]]
  res$pwr.scABEL[j]   <- tmp[["Achieved power"]]
  # retrieve components: pure SABE, PE within constraints, ABE
  res[j, 7:9]         <- suppressMessages(
                           power.scABEL(CV = res$CV[j], theta0 = theta0,
                                        design =res$design[j],
                                        n = res$n.scABEL[j],
                                        details = TRUE)[2:4])
}
names(res)[c(4, 6)] <- "power"
res[, 4:9] <- signif(res[, 4:9], 4)
print(res, row.names = FALSE)

   CV design n.FARTSSIE  power n.scABEL  power pwr.SABE pwr.PE pwr.ABE
 0.30  2x2x3         54 0.8242       50 0.8016   0.8016 0.9900  0.7450
 0.35  2x2x3         44 0.7634       50 0.8037   0.8039 0.9776  0.6351
 0.40  2x2x3         36 0.7246       46 0.8073   0.8086 0.9548  0.5164
 0.45  2x2x3         34 0.7198       42 0.8002   0.8006 0.9266  0.4127
 0.50  2x2x3         32 0.6880       42 0.8035   0.8035 0.9065  0.3484
 0.30  2x2x4         40 0.8525       34 0.8028   0.8028 0.9906  0.7517
 0.35  2x2x4         32 0.7929       34 0.8118   0.8119 0.9786  0.6424
 0.40  2x2x4         28 0.7829       30 0.8066   0.8074 0.9528  0.5069
 0.45  2x2x4         26 0.7846       28 0.8112   0.8116 0.9266  0.4107
 0.50  2x2x4         24 0.7536       28 0.8143   0.8143 0.9065  0.3476

Only for CV 30% the sample size is higher than required (money lost). For higher CVs studies will be underpowered. What we also see: The PE-constraint gets increasingly important.

In your screenshot of FARTSSIE (which version?) I see limits of 75.00–133.33% for CV 35%. That’s not correct for ABEL, where the limits are 77.23–129.48% because $$\small{\eqalign{
s_\textrm{wR}&=\sqrt{\log_{e}(CV_\textrm{wR}^2+1)}\\
\left\{L,U\right\}&=100\exp(\mp 0.760\,\cdot s_\textrm{wR})
}}$$ For the conditions of the Gulf Cooperation Council1 (namely widened limits if \(\small{CV_\textrm{wR}>30\%}\)) you would need …

sampleN.scABEL(CV = 0.35, design = "2x2x3", regulator = "GCC", details = FALSE)

+++++++++++ scaled (widened) ABEL +++++++++++
            Sample size estimation
   (simulation based on ANOVA evaluation)
---------------------------------------------
Study design: 2x2x3 (3 period full replicate)
log-transformed data (multiplicative model)
1e+05 studies for each step simulated.

alpha  = 0.05, target power = 0.8
CVw(T) = 0.35; CVw(R) = 0.35
True ratio = 0.9
ABE limits / PE constraint = 0.8 ... 1.25
Widened limits = 0.75 ... 1.333333
Regulatory settings: GCC

Sample size
 n     power
42   0.8139

… and not only 34 – which would be correct only if the fixed limits are applied independent from the CV. Such an approach is currently only recommended for HVD(P)s by the League of Arab States2 and in South Africa.3

sampleN.TOST(CV = 0.35, theta0 = 0.9, theta1 = 0.75, design = "2x2x3")

+++++++++++ Equivalence test - TOST +++++++++++
            Sample size estimation
-----------------------------------------------
Study design: 2x2x3 (3 period full replicate)
log-transformed data (multiplicative model)

alpha = 0.05, target power = 0.8
BE margins = 0.75 ... 1.333333
True ratio = 0.9,  CV = 0.35

Sample size (total)
 n     power
34   0.811011


❝ On the other part, if the assumed PE is 0.9126-1.096, subject size of 40 could still be good considering no dropouts (Using Boss button;-)).


Nope (see above). Let’s be silent about the Boss Button, please.


  1. Executive Board of the Health Ministers’ Council for GCC States. The GCC Guidelines for Bio­equi­va­lence. May 2021. Online.
  2. League of Arab States, Higher Technical Committee for Arab Pharmaceutical Industry. Harmonised Arab Guide­line on Bioequivalence of Generic Pharmaceutical Products. Cairo. March 2014. Online.
  3. Medicines Control Council. Registration of Medicines: Biostudies. Pretoria. June 2015. Online.

Dif-tor heh smusma 🖖🏼 Довге життя Україна! [image]
Helmut Schütz
[image]

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

Complete thread:

UA Flag
Activity
 Admin contact
22,993 posts in 4,828 threads, 1,653 registered users;
142 visitors (0 registered, 142 guests [including 1 identified bots]).
Forum time: 20:01 CEST (Europe/Vienna)

Never never never never use Excel.
Not even for calculation of arithmetic means.    Martin Wolfsegger

The Bioequivalence and Bioavailability Forum is hosted by
BEBAC Ing. Helmut Schütz
HTML5