Graphing Mean PK profile [🇷 for BE/BA]

posted by Helmut Homepage – Vienna, Austria, 2019-04-24 13:50 (1252 d 19:13 ago) – Posting: # 20225
Views: 10,898

Hi roman_max,

» » The sponsor should re-consider this idea. Box-plots are nonparametric. For log-normal distributed data (which we likely have) the median is an estimate of the geometric mean. If we want to go this way, the arithmetic mean is not a good idea.
» Agree, but if it is easier for Sponsor to view and "understand" data, no problem.

Any kind of plot is problematic. Given, some guidelines require them (e.g., the Canadian guidance). We should be aware that such a plot gives just an impression and is not related with the assessment of BE.
I once received a deficiency letter asking for a clarification why in plots of geometric mean profiles the highest concentrations and their time points didn’t agree with the reported Cmax/tmax. Well, C at any given time point has nothing to do with the individual Cmax-values and their geometric mean. Oh, dear!
There’s another obstacle. How to deal with BQLs? If you set them to NA (in R) or keep them as a character-code (Phoenix/WinNonlin) you open Pandora’s box. Let’s have a look at the 16 h time point of my example:
loc.stat <- function(x, type, na.rm) {
  non.numerics    <- which(
  x[non.numerics] <- NA
  x <- as.numeric(x)
         arith.mean = round(mean(x, na.rm=na.rm), 2),
         median     = round(median(x, na.rm=na.rm), 2),
         geom.mean  = round(exp(mean(log(x), na.rm=na.rm)), 2),
         harm.mean  = round(length(x)/sum(1/x, na.rm=na.rm), 2))
C <- c(rep("BQL", 2), 9.87, rep("BQL", 2), 15.4, 13.0, 35.2,
       rep("BQL", 4), 9.91, 9.43, rep("BQL", 2), 16.6, rep("BQL", 4),
       5.69, 21.2, 10.4)
df <- data.frame(statistic=c(rep("arith.mean", 2), rep("median", 2),
                 rep("geom.mean", 2), rep("harm.mean", 2)),
                 na.rm=rep(c(FALSE, TRUE), 4),
                 location=NA, stringsAsFactors=FALSE)
for (j in 1:nrow(df)) {
  df$location[j] <- loc.stat(C, df$statistic[j], df$na.rm[j])
print(df, row.names=FALSE)

  statistic na.rm location
 arith.mean FALSE       NA
 arith.mean  TRUE    14.67
     median FALSE       NA
     median  TRUE    11.70
  geom.mean FALSE       NA
  geom.mean  TRUE    12.98
  harm.mean FALSE       NA
  harm.mean  TRUE    27.98
# not meaningful, only for completeness

Some people set all BQLs to zero in order to calculate the arithmetic mean. Others set the first BQL after tmax to LLOQ/2, and, and, and… There will always be a bias.

Dif-tor heh smusma 🖖 Довге життя Україна! [image]
Helmut Schütz

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

Complete thread:

UA Flag
 Admin contact
22,391 posts in 4,685 threads, 1,595 registered users;
online 11 (0 registered, 11 guests [including 3 identified bots]).
Forum time: Wednesday 09:03 CEST (Europe/Vienna)

The real struggle is not between the right and the left
but between the party of the thoughtful
and the party of the jerks.    Jimmy Wales

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