Cheating [GxP / QC / QA]

posted by Helmut Homepage – Vienna, Austria, 2021-09-17 18:50 (506 d 10:23 ago) – Posting: # 22583
Views: 3,981

Hi Ohlbe,

successful cheating is not for lay persons… [image]-script at the end.
The CVs calculated from the confidence intervals in both ‘parts’ are much lower than the ones in the ‘full’ study. Or the other way ’round: If we pool the CVs of the ‘parts’ we could expect values which are lower than the ‘observed’ (tee-hee!) ones.

       CRO  study  n metric     PE  lower  upper   BE    CV CV.pooled
 Panexcell part 1 12   Cmax  71.26  64.78  78.38 fail 12.93         
 Panexcell part 2 12   Cmax 141.80 124.27 161.82 fail 17.98         
 Panexcell   full 24   Cmax 100.52  86.88 116.31 pass
30.08     15.25
 Panexcell part 1 12 AUC0-t  85.41  78.45  93.00 fail 11.53         
 Panexcell part 2 12 AUC0-t 126.89 115.81 139.04 fail 12.40         
 Panexcell   full 24 AUC0-t 104.11  94.97 114.12 pass
18.69     11.96
  Synchron part 1 41   Cmax 135.55 115.53 159.04 fail 44.99         
  Synchron part 2 31   Cmax  73.54  60.53  89.36 fail 47.50         
  Synchron   full 72   Cmax 103.50  90.30 118.62 pass
52.21     46.04
  Synchron part 1 41 AUC0-t 122.98 110.07 137.41 fail 30.47         
  Synchron part 2 31 AUC0-t  75.24  63.33  89.38 fail 41.54         
  Synchron   full 72 AUC0-t  99.01  88.86 110.32 pass
40.46     34.78



# https://www.fda.gov/media/151569/download (page 4)
# https://www.fda.gov/media/151570/download (page 4)
library(PowerTOST)
CRO     <- c("Panexcell", "Synchron")
designs <- c("2x2x2", "2x2x2")
metric  <- c("Cmax", "AUC0-t")
# arbitrary identifiers, only the last one must be "full"
study   <- c("part 1", "part 2", "full")
ns1     <- c(12, 12, 24)
ns2     <- c(41, 31, 72)
PE1     <- c( 71.26, 141.80, 100.52,
              85.41, 126.89, 104.11)
PE2     <- c(135.55,  73.54, 103.5 ,
             122.98,  75.24,  99.01)
lower1  <- c( 64.78, 124.27,  86.88,
              78.45, 115.81,  94.97)
lower2  <- c(115.53,  60.53,  90.3 ,
             110.07,  63.33,  88.86)
upper1  <- c( 78.38, 161.82, 116.31,
              93.00, 139.04, 114.12)
upper2  <- c(159.04,  89.36, 118.62,
             137.41,  89.38, 110.32)
res     <- data.frame(CRO = rep(CRO, each = length(study) * length(metric)),
                      design = rep(designs, each = length(study) * length(metric)),
                      study = rep(study, length(CRO) * length(metric)),
                      n = c(rep(ns1, length(metric)),
                            rep(ns2, length(metric))), df = NA_integer_,
                      metric = rep(rep(metric, each = length(study)), length(CRO)),
                      PE = c(PE1, PE2), lower = c(lower1, lower2),
                      upper = c(upper1, upper2), BE = "fail",
                      CV = NA_real_, CV.pooled = "")
for (j in 1:nrow(res)) {
  if (res$lower[j] >= 80 & res$upper[j] <= 125) res$BE[j] <- "pass"
  # calculate the CV from the CI
  res$CV[j] <- signif(100 * suppressMessages(
                              CI2CV(pe = res$PE[j] / 100,
                                    lower = res$lower[j] / 100,
                                    upper = res$upper[j] / 100,
                                    n = res$n[j])), 4)
  # degrees of freedom as expression
  df <- PowerTOST:::.design.df(PowerTOST:::.design.props(
                               PowerTOST:::.design.no(res$design[j])),
                                                      robust = FALSE)
  n         <- res$n[j]
  res$df[j] <- eval(df) # calculate df from sample size
}
for (j in seq_along(CRO)) {
  for (k in seq_along(metric)) {
    # extract the ‘parts’ (design, df, and CV)
    CVs <- res[res$CRO == CRO[j] & res$study != "full" &
               res$metric == metric[k], c(2, 5, 11)]
    # CV pooled from the ‘parts’
    res$CV.pooled[res$CRO == CRO[j] & res$study == "full" &
                  res$metric == metric[k]] <- signif(CVpooled(CVs)$CV, 4)
  }
}
res <- res[, -which(names(res) %in% c("design", "df"))] # no more needed
print(res, row.names = FALSE)


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,479 posts in 4,709 threads, 1,603 registered users;
14 visitors (0 registered, 14 guests [including 8 identified bots]).
Forum time: 04:13 CET (Europe/Vienna)

The rise of biometry in this 20th century,
like that of geometry in the 3rd century before Christ,
seems to mark out one of the great ages or critical periods
in the advance of the human understanding.    R.A. Fisher

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