Graphing Mean PK profile [R for BE/BA]

posted by Helmut Homepage – Vienna, Austria, 2019-04-24 13:50  – Posting: # 20225
Views: 3,047

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(is.na(suppressWarnings(as.numeric(x))))
  x[non.numerics] <- NA
  x <- as.numeric(x)
  switch(type,
         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.

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
 Admin contact
20,138 posts in 4,246 threads, 1,386 registered users;
online 17 (1 registered, 16 guests [including 4 identified bots]).
Forum time (Europe/Vienna): 17:53 CET

It is better to debate a question without settling it
than to settle a question without debating it.    Joseph Joubert

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