(Expanded) BE limits, EMA-style [RSABE / ABEL]

posted by Helmut Homepage – Vienna, Austria, 2018-06-08 13:19 (908 d 10:12 ago) – Posting: # 18873
Views: 4,496

Hi libaiyi,

» When we get a CVwr, how to get the BE limits?

The switching CVwR is 30% and hence, the regulatory constant k should be \(\log{(1.25)}/\sqrt{\log{(0.30^2+1)}} = 0.7601283\ldots \)
In R (CVs and BE limits in %):

CVwR <- seq(0.25, 0.55, 0.05)
swR  <- sqrt(log(CVwR^2+1))
k    <- log(1.25)/sqrt(log(0.3^2+1))
EL1  <- data.frame(CVwR=100*CVwR, swR=swR, L=100*exp(-k*swR), U=100*exp(+k*swR))
EL1$L[EL1$CV <= 30] <-  80 # conventional
EL1$U[EL1$CV <= 30] <- 125 # BE limits
EL1$L[EL1$CV >= 50] <- 100*exp(-k*sqrt(log(0.5^2+1))) # upper scaling
EL1$U[EL1$CV >= 50] <- 100*exp(+k*sqrt(log(0.5^2+1))) # cap at CV 50%
print(EL1, row.names=FALSE)

CVwR       swR        L        U
  25 0.2462207 80.00000 125.0000
  30 0.2935604 80.00000 125.0000
  35 0.3399387 77.22885 129.4853
  40 0.3852532 74.61401 134.0231
  45 0.4294214 72.15055 138.5991
  50 0.4723807 69.83255 143.1997
  55 0.5140870 69.83255 143.1997


In its eternal wisdom (preferring “nice” numbers) the EMA demands a rounded k 0.76 (which implies a switching CVwR of 30.0053%).*

EL2 <- data.frame(CVwR=100*CVwR, swR=swR, L=100*exp(-0.76*swR), U=100*exp(+0.76*swR))
EL2$L[EL2$CV <= 30] <-  80
EL2$U[EL2$CV <= 30] <- 125
EL2$L[EL2$CV >= 50] <- 100*exp(-0.76*sqrt(log(0.5^2+1)))
EL2$U[EL2$CV >= 50] <- 100*exp(+0.76*sqrt(log(0.5^2+1)))
print(EL2, row.names=FALSE)

CVwR       swR        L        U
  25 0.2462207 80.00000 125.0000
  30 0.2935604 80.00000 125.0000
  35 0.3399387 77.2
3222 129.4796
  40 0.3852532 74.61770 134.0165
  45 0.4294214 72.15452 138.5915
  50 0.4723807 69.83678 143.1910
  55 0.5140870 69.83678 143.1910


More convenient by the function scABEL() of the R-package PowerTOST (by applying the default argument regulator="EMA"). The function then uses k 0.76, returns the conventional ABE limits if CVwR ≤30%, and observes the upper cap of CVwR 50%:

library(PowerTOST)
CVwR <- seq(0.25, 0.55, 0.05)
EL3  <- data.frame(CVwR=100*CVwR, swR=CV2se(CVwR),
                   L=100*scABEL(CV=CVwR)[, "lower"],
                   U=100*scABEL(CV=CVwR)[, "upper"])
print(EL3, row.names=FALSE)

CVwR       swR        L        U
  25 0.2462207 80.00000 125.0000
  30 0.2935604 80.00000 125.0000
  35 0.3399387 77.23222 129.4796
  40 0.3852532 74.61770 134.0165
  45 0.4294214 72.15452 138.5915
  50 0.4723807 69.83678 143.1910
  55 0.5140870 69.83678 143.1910


Don’t apply double rounding! Round the 90% CI in percent to two decimal places but compare it to the expanded limits in full precision.



Edit: Hey Shuanghe, you were faster!

Dif-tor heh smusma 🖖
Helmut Schütz
[image]

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

Complete thread:

Activity
 Admin contact
21,232 posts in 4,427 threads, 1,481 registered users;
online 5 (1 registered, 4 guests [including 2 identified bots]).
Forum time: Wednesday 22:31 CET (Europe/Vienna)

A big data-analyst is an expert
in producing misleading conclusions from huge datasets.
It is much more efficient to use a statistician,
who can do the same with small ones.    Stephen Senn

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