Cheating [GxP / QC / QA]

posted by Helmut Homepage – Vienna, Austria, 2021-09-17 18:50 (944 d 14:34 ago) – Posting: # 22583
Views: 6,070

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,987 posts in 4,824 threads, 1,663 registered users;
92 visitors (0 registered, 92 guests [including 6 identified bots]).
Forum time: 09:24 CEST (Europe/Vienna)

The only way to comprehend what mathematicians mean by Infinity
is to contemplate the extent of human stupidity.    Voltaire

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