Eligible subjects? [Power / Sample Size]

posted by Helmut Homepage – Vienna, Austria, 2018-06-02 15:02 (2126 d 17:29 ago) – Posting: # 18842
Views: 7,162

Hi Valiveti,

❝ ❝ ❝ […] 48 subjects considering ~80% power, ISCV: 23%.

❝ ❝ ❝ The study was bioequivalent and 90% CI is within 80-125 for both Cmax & AUCt.

❝ ❝ ❝ Power of Cmax and AUCt are 92% & 66% respectively.

❝ ❝ In this order? Can you give us their CVs and GMRs?

❝ CV- Cmax: 27.731; AUCt: 22.678

❝ GMR-Cmax: 97.76; AUCt: 87.99


Sorry, I forgot to ask for the sample sizes. Hence, I estimated them – which leaves me confused. :confused:

library(PowerTOST)
guess.GMR.0 <- function(GMR) { # function to estimate the assumed GMR
  sampleN.TOST(alpha=alpha, CV=CV.0/100, theta0=GMR, theta1=theta1,
               theta2=theta2, targetpower=pwr.0/100, design=design,
               print=FALSE)[["Sample size"]]-n.0
}
guess.n.fin <- function(n) { # function to estimate the final sample size
  if (PK == "Cmax") {
    CV       <- CV.1/100
    GMR      <- GMR.1/100
    post.hoc <- post.hoc.1/100 }
  if (PK == "AUC") {
    CV       <- CV.2/100
    GMR      <- GMR.2/100
    post.hoc <- post.hoc.2/100 }
  round(power.TOST(alpha=alpha, CV=CV, theta0=GMR, theta1=theta1,
                   theta2=theta2, n=n, design=design)-post.hoc, 2)
}
assess <- function(CI, theta1=0.80, theta2=1.25) { # assess for BE
  if (CI[["lower"]] > 100*theta2 | CI[["upper"]] < 100*theta1) {
    res <- "bioinequivalence proven"
  } else {
    if (CI[["lower"]] >= 100*theta1 & CI[["upper"]] <= 100*theta2) {
      res <- "bioequivalence demonstrated"
    } else {
      res <- "failed to demonstrated BE (inconclusive)"
    }
  }
}
# design: CV and power in percent
design     <- "2x2x2"
theta1     <- 0.80 # lower BE limit
theta2     <- 1.25 # upper BE limit
CV.0       <- 23   # assumed CV
pwr.0      <- 80   # target (desired) power
n.0        <- 48   # initial sample size
alpha      <- 0.05 # for 90% CI
CI.pct     <- 100*(1-2*alpha)
GMR.0      <- round(uniroot(guess.GMR.0, interval=c(theta1+1e-8, 1))$root, 4)
pwr.ach    <- power.TOST(alpha=alpha, CV=CV.0/100, theta0=GMR.0,
                         theta1=theta1, theta2=theta2, n=n.0, design=design)
# study: CV, GMR, and post hoc power in percent
PK         <- "Cmax"
CV.1       <- 27.731
GMR.1      <- 97.76
post.hoc.1 <- 92
n.fin.1    <- round(uniroot(guess.n.fin, interval=c(12, n.0))$root, 0)
ph.est.1   <- power.TOST(alpha=alpha, CV=CV.1/100, theta0=GMR.1/100,
                         theta1=theta1, theta2=theta2, n=n.fin.1,
                         design=design)
CI.1       <- round(100*CI.BE(alpha=alpha, pe=GMR.1/100, CV=CV.1/100,
                              n=n.fin.1, design=design), 2)
concl.1    <- assess(CI=CI.1, theta1=theta1, theta2=theta2)
PK         <- "AUC"
CV.2       <- 22.678
GMR.2      <- 87.99
post.hoc.2 <- 66
n.fin.2    <- round(uniroot(guess.n.fin, interval=c(12, n.0))$root, 0)
ph.est.2   <- power.TOST(alpha=alpha, CV=CV.2/100, theta0=GMR.2/100,
                         theta1=theta1, theta2=theta2, n=n.fin.2,
                         design=design)
CI.2       <- round(100*CI.BE(alpha=alpha, pe=GMR.2/100, CV=CV.2/100,
                              n=n.fin.2, design=design), 2)
concl.2    <- assess(CI=CI.2, theta1=theta1, theta2=theta2)
cat(design, "design", "\nBE limits:",
    sprintf("%5.2f%% \u2013 %6.2f%%", 100*theta1, 100*theta2),
    paste0("\nAssumed: CV = ", CV.0, "%, GMR = ", 100*GMR.0,
    "%, target power = ", pwr.0, "%"), "\nPlanned: n =", n.0,
    sprintf("(achieved power = %.2f%%)", 100*pwr.ach),
    paste0("\n", paste0(rep("\u2500", 48), collapse=""), "\nStudy"),
    "\nCmax   :",
    sprintf("%s %.2f%%, %s %.2f%%", "CV =", CV.1, "GMR =", GMR.1),
    "\n         n =", n.fin.1,
    sprintf("(post hoc power = %.2f%% ~ %.0f%%)", 100*ph.est.1, post.hoc.1),
    sprintf("%s%.2f%% CI:", "\n         ", CI.pct),
    sprintf("%6.2f%%", CI.1[["lower"]]), "\u2013",
    sprintf("%6.2f%%", CI.1[["upper"]]),
    "\n        ", concl.1,
    "\nAUC    :",
    sprintf("%s %.2f%%, %s %.2f%%", "CV =", CV.2, "GMR =", GMR.2),
    "\n         n =", n.fin.2,
    sprintf("(post hoc power = %.2f%% ~ %.0f%%)", 100*ph.est.2, post.hoc.2),
    sprintf("%s%.2f%% CI:", "\n         ", CI.pct),
    sprintf("%6.2f%%", CI.2[["lower"]]), "\u2013",
    sprintf("%6.2f%%", CI.2[["upper"]]),
    "\n        ", concl.2, "\n")


I got (my confidence intervals might not be exactly yours if sequences were unbalanced, i.e., n1  n2):

2x2x2 design
BE limits: 80.00% – 125.00%
Assumed: CV = 23%, GMR = 90%, target power = 80%
Planned: n = 48 (achieved power = 80.48%)
────────────────────────────────────────────────
Study
Cmax   : CV = 27.73%, GMR = 97.76%

         n = 38 (post hoc power = 92.04% ~ 92%)
         90.00% CI:  87.98% – 108.63%
         bioequivalence demonstrated
AUC    : CV = 22.68%, GMR = 87.99%

         n = 48 (post hoc power = 65.80% ~ 66%)
         90.00% CI:  81.49% –  95.01%
         bioequivalence demonstrated


Is this correct? If yes, why did you have much less eligible subjects in the data set of Cmax than in the one of AUC?
Generally it is the other way ’round (nAUC ≤ nCmax): If the AUC can’t be reliably estimated (missing samples in the late phase and/or the extrapolated AUC >20% of AUC0–∞) its value is not reported whereas the one of Cmax still is.

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,957 posts in 4,819 threads, 1,636 registered users;
100 visitors (0 registered, 100 guests [including 7 identified bots]).
Forum time: 07:31 CET (Europe/Vienna)

With four parameters I can fit an elephant,
and with five I can make him wiggle his trunk.    John von Neumann

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