Graphing Mean PK profile [🇷 for BE/BA]

posted by Helmut Homepage – Vienna, Austria, 2019-04-24 15:50 (1907 d 02:26 ago) – Posting: # 20225
Views: 12,997

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
23,099 posts in 4,857 threads, 1,646 registered users;
86 visitors (0 registered, 86 guests [including 11 identified bots]).
Forum time: 18:16 CEST (Europe/Vienna)

Imagine if every Thursday your shoes exploded
if you tied them the usual way.
This happens to us all the time with computers,
and nobody thinks of complaining.    Jef Raskin

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