Eligible subjects? [Power / Sample Size]

posted by Helmut Homepage – Vienna, Austria, 2018-06-02 13:02  – Posting: # 18842
Views: 3,247

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.

Cheers,
Helmut Schütz
[image]

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

Complete thread:

Activity
 Mix view
Bioequivalence and Bioavailability Forum |  Admin contact
19,780 posts in 4,196 threads, 1,358 registered users;
online 5 (0 registered, 5 guests [including 4 identified bots]).
Forum time (Europe/Vienna): 18:04 CEST

If you obey all the rules,
you will miss all the fun.    Katharine Hepburn

The BIOEQUIVALENCE / BIOAVAILABILITY FORUM is hosted by
BEBAC Ing. Helmut Schütz
HTML5