## Confuse a Cat Inc. [BE/BA News]

Capt’n, my capt’n!

» » Comparable median (≤ 20% difference) and range for Tmax
» Do you read this as: You need to be comparable (20% diff) for the median AND for the range? (i.e. is there also a 20% difference requirement for the range???)

Oh dear, I missed that! The range has a breakdown point of 0 – even if all values are identical except one of them, this single value will change the range. On the other hand, if you have two ’contaminations’ on opposite sides, the range will be the same. -script for simulations acc. to my experiences with ibuprofen at the end. Gives:

         Min. 1st Qu.  Median 3rd Qu.    Max. Range   T   1.00000 1.33333 1.83333 2.16667 2.50000   1.5   R   0.83333 1.29167 1.58333 2.16667 2.33333   1.5 T - R 0.16667 0.04167 0.25000 0.00000 0.16667   0.0 T / R 1.20000 1.03226 1.15789 1.00000 1.07143   1.0

Close shave for the median (+16%). Here no problems with the range because we have two contaminations.
A goody: Replace in the script the lines

x <- rtruncnorm(n = n, a = a, b = b, mean = mu, sd = mu * CV) T <- R <- roundClosest(x, spl) T[T == min(T)] <- max(T) R[R == max(R)] <- min(R)

by

R <- roundClosest(rtruncnorm(n = n, a = a, b = b, mean = mu, sd = mu * CV), spl) T <- R + 20 / 60

to delay T by 20 minutes.

         Min. 1st Qu.  Median 3rd Qu.    Max.   Range   T   1.16667 1.66667 2.00000 2.50000 2.83333 1.66667   R   0.83333 1.33333 1.66667 2.16667 2.50000 1.66667 T - R 0.33333 0.33333 0.33333 0.33333 0.33333 0.00000 T / R 1.40000 1.25000 1.20000 1.15385 1.13333 1.00000

» » Calculating the ratio of values is a questionable procedure.
»
» Whether we like it or not, we have to find a way forward. And this has a lot of degrees of freedom.

I’ve read a lot in the meantime. Still not sure whether it is allowed at all (‼) to calculate a ratio of discrete values with potentially unequal intervals.

» In a nonparametric universe where we try to resolve it There could be all sorts of debate re. Hodges-Lehman, Kruskal-Wallis, Wilcoxon test, confidence levels, bootstrapping, pairing and what not.

Didn’t have the stamina to figure out why you get so many warnings in your code. However, you are aware that nonparametrics gives the EMA an anaphylactic shock?

» Shoot me.

Later.

» How would you prefer to implement the comparability exercise for Tmax? (I am not so much interested in your thoughts on alpha/confidence level, exact T or F, etc. I am mainly interested in a way to make the comparison itself, so please make me happy and focus on that ).

I’m working on it.

» […] if the comparability thing also applies to range, how to implement that?

Sorry, I think that’s just bizarre. Honestly, despite you excellent exegesis, I guess (or rather hope?) that only the median is meant. If otherwise, wouldn’t the almighty oracle written this:

Comparable (≤ 20% difference) median and range for Tmax.

» […] sample size calculation is going to get messy for these products, if we have to factor in comparability of Tmax at the 20% level. I am not outright saying I have a bad taste in my mouse, but I am leaning towards thinking this could easy translate into a complete showstopper for sponsors developing the products. What's your gut feeling?

From some preliminary simulations I guess that we would need somewhat tighter sampling intervals than usual in order to ‘catch’ tmax in any and every case.

» At the end of the day answers to Q1-Q4 above hinge not only on what you think is the right thing to do; of equal importance is what you think regulators will accept.

Of course. If we would go back to the 2001 Note for Guidance (and the current one of the WHO), with a nonparametric test and pre-specified acceptance range everything would be much easier.

P.S.: I updated the article. It’s a work in progress. Perhaps you will come up with more questions.

library(truncnorm) roundClosest <- function(x, y) {   # Round x to the closest multiple of y   return(y * round(x / y)) } sum.simple <- function(x) {   # Nonparametric summary: Remove Mean but keep eventual NAs   y <- summary(x)   if (length(y) == 6) {     y <- y[c(1:3, 5:6)]   } else {     y <- y[c(1:3, 5:7)]   }   names <- c(names(y), "Range")   y[length(y) + 1] <- y[length(y)] - y[1]   y     <- setNames(as.vector(y), names)   return(y) } set.seed(123456) spl <-  10 / 60 # Sampling every 10 (!) minutes a   <-  40/60   # Lower limit of truncated normal (40 minutes) b   <- 150/60   # Upper limit of truncated normal (2.5 hours) mu  <- 100/60   # Common for ibuprofen CV  <- 0.50     # Realistic acc. to my studies n   <- 16       # Sufficient given the low variability x   <- rtruncnorm(n = n, a = a, b = b, mean = mu, sd = mu * CV) T   <- R <- roundClosest(x, spl) # both are identical! # ‘Contaminations’ T[T == min(T)] <- max(T) R[R == max(R)] <- min(R) res <- as.data.frame(matrix(ncol = 6, nrow = 4,                             dimnames = list(c("  T", "  R",                                               "T - R", "T / R"),                                             names(sum.simple(T))))) res[1, ] <- sum.simple(T) res[2, ] <- sum.simple(R) res[3, ] <- res[1, ] - res[2, ] res[4, ] <- res[1, ] / res[2, ] print(round(res, 5))

Dif-tor heh smusma 🖖
Helmut Schütz

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