martin
★★  

Austria,
2009-12-23 11:12
(5209 d 23:52 ago)

Posting: # 4520
Views: 5,765
 

 dose selection to investigate dose-proportionality [Surveys]

Dear colleagues!

Motiviated by a recent discussion with HS I would like to set up a simulation study to evaluate power properties of different approaches to investigate dose-proportionality. To mimic the real world situation I would like to start a little survey and discussion regarding dose selection for these kind of studies.

I would be happy to get your points of view regarding the following questions:
  1. how many doses are usually used in these kind of studies?
  2. how doses are selected? I encountered that doses are often doubled in these kind of studies (eg. 0.5 mg, 1 mg, 2 mg, 4 mg).

best regards

martin
Helmut
★★★
avatar
Homepage
Vienna, Austria,
2009-12-23 17:16
(5209 d 17:49 ago)

@ martin
Posting: # 4521
Views: 5,545
 

 Dose-proportionality

Dear Martin,

following our inspiring yesterday's discussion some points:
  1. At least three :-D... In my experience four is most commonly employed.
  2. Not necessarily doubled, but equally spaced in the logarithmic domain (modifying your example: 4 levels, lowest 0.5 mg, highest 8 mg: intermediates at 1.26 mg, 3.17 mg).
Have a look at two classical papers:
  • Gough K, Byrom B, Ellis S, Lacey L, McKellar J, Hutchison M, and O Keene
    Assessment of Dose Proportionality: Report From the Statisticians in the Pharmaceutical Industry/Pharmacokinetics UK Joint Working Party
    Drug Information Journal 29(3), 1039–48 (1995)
  • Smith BP, Vandenhende FR, DeSante KA, Farid NA, Welch PA, Callaghan JT, and ST Forgue
    Confidence Interval Criteria for Assessment of Dose Proportionality
    Pharm Res 17(10), 1278–83 (2000)
I came across some Fibonacci-stuff; too lazy to search.

It should be noted that the power model is a purely empirical one - i.e., is not based on physiological grounds. Unlike dose-corrected BE-assessments between two dose levels, any deviation of the exponent (beta>1: enzyme limited excretion, saturation; beta<1: enzyme induction) is not described in PK-models. Pharmacokineticists are not happy with the power model anyway. To quote Nick Holford (PKPD-List, 2006):

I am aware of the whacky power function used by non-pharmacological statistians to 'declare dose proportionality'.
Any rational attempt to understand kinetics in relation to dose would use PK theory not empirical ad hoc 'beat it to death with a P value' statistics.


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
martin
★★  

Austria,
2009-12-29 23:47
(5203 d 11:18 ago)

(edited by martin on 2009-12-30 16:37)
@ Helmut
Posting: # 4534
Views: 5,598
 

 Dose-proportionality

Dear HS !

thank you for your input and the references!

below some code to play around; it is an optimal contrast problem – the power to detect a deviation from dose-proportionality depend on the unknown monotone dose-response shape. Theoretically, the hypothesis regarding dose-proportionality should be specified in detail to “maximise power”. For example, the hypothesis

H0: all 4 doses are within the proportional range
H1: 3 highest doses are outside the proportional range

would suggest application of the reverse helmert contrast. Additionally, one-sided step-down testing allows a formal estimation of the minimum dose where we can not reject the null hypothesis of dose-proportionality – similar as estimation of the minimum effective dose.

best regards

martin

rm(list=ls(all=TRUE))
# function to simulate power for an overall assessment of dose-proportionality based on the power-law model and 4 dose levels
sim.dose4prop <- function(nsim, cv, n, a, b, mindose, maxdose, range, alpha=0.05){

# input parameters:
# nsim ... number of simulation runs
# cv ... coefficient of variation of random variables (e.g. AUCs)
# n ... n per dose level
# a, b ... parameters for power law model: AUC = a*dose^b
# mindose ... lowest dose
# maxdose ... highest dose
# range ... doses (index) for which parameter b of power law model is applied (e.g. b=1.1 and range=c(2:4) specifies that doses 2 to 4 are outside proportional range)
# alpha ... type I error, two-sided (default = 0.05)

   # function to define AUC using power law model
   powermod <- function(dose, a, b, range){return(c(a*dose[-range]^1, a*dose[range]^b))}

   # function to generate log-normal distributed RVs (e.g. AUCs) with identical CVs per dose. See e.g. Jaki et al. (2009) for more detail.
   # Jaki T, Wolfsegger MJ, Ploner M (2009). Confidence intervals for ratios of AUCs in the case of serial sampling: A comparison of seven methods.
   # Pharmaceutical Statistics, 8(1):12-24. DOI:10.1002/pst.321.
   data.gen <- function(dose, mue, n, cv){
      k <- length(dose)   
      sd.log <- sqrt(log(1+cv^2))
      res <- as.data.frame(matrix(nrow=k*n, ncol=6))
      res[,1] <- sort(rep(dose,n))
      res[,2] <- sort(rep(mue,n))
      res[,3] <- log(res[,2]) - 1/2 * log(1+cv^2)
      res[,4] <- sd.log
      res[,5] <- rlnorm(n=k*n, meanlog=res[,3], sdlog=res[,4])
      res[,6] <- res[,5]/res[,1]       
      colnames(res) <- c('dose', 'mue', 'mue.log', 'sd.log', 'auc', 'auc.adj')
      return(res)
   }

   # definition of contrasts see e.g. Bretz and Hothorn (2003) for more detail
   # Bretz F and Hothorn LA (2003). Statistical Analysis of Monotone or Non-monotone Dose–Response Data from In Vitro Toxicological Assays.
   # ATLA-ALTERN LAB ANIM 31:81-96 Suppl. 1 JUN 2003. URL: http://ecvam.jrc.it/publication/Bretz-Hothorn.pdf last visited at 2009-12-27
   numdose <- 4
   contr.lowhigh <- c(-1,0,0,1) # t-test of highest versus lowest dose (pairwise contrast)
   contr.helmert <- c(-1,-1,-1,3) # helmert contrast   
   contr.revhelm <- c(-3,1,1,1) # reverse helmert contrast   
   contr.linearc <- c(-3,-1,1,3) # linear contrast
   contr.jonckht <- c(-1, -0.67, -0.17, 1.83) # Jonkheere-Terpstra analogon contrast
   contr.maximum <- c(-0.87, -0.13, 0.13, 0.87) # Maximum contrast
   contr.linr24t <- c(-12, -2, 2, 12) # Linear 2–4 contrast

   # define doses: to be equidistant on log-scale
   step <- (log(maxdose)-log(mindose))/(numdose-1)
   log.dose <- c(log(mindose), rep(NA, numdose-1))
   for(i in 2:numdose){log.dose[i] <- log.dose[i-1]+step}
   dose <- exp(log.dose)
   mue <- powermod(dose=dose, a=a, b=b, range=range)
   k <- length(dose)
   power <- rep(0,9)

   for(i in 1:nsim){

      # generate log-normal distributed random variables
      data <- data.gen(dose=dose, mue=mue, n=n, cv=cv)

      # log-log regression approach: two-sided CI
      res1 <- confint(lm(log(data$auc) ~ log(data$dose)), level=1-alpha)[2,]
      
      # ANOVA approach
      temp <- summary(lm(log(data$auc.adj) ~ as.factor(data$dose)))
      res2 <- 1-pf(q=temp$fstatistic[1], df1=temp$fstatistic[2], df2=temp$fstatistic[3])
   
      # contrast approaches: two-sided hypothesis
      xq <- tapply(log(data$auc.adj), data$dose, mean)
      sd.pooled <- sqrt(sum((n-1)*tapply(log(data$auc.adj), data$dose, var))/(n*k-k))
      df <- n*k - k
   
      nom3 <- sum(contr.lowhigh*xq)
      den3 <- (sd.pooled/sqrt(n))*sqrt(sum((contr.lowhigh)^2))

      nom4 <- sum(contr.helmert*xq)
      den4 <- (sd.pooled/sqrt(n))*sqrt(sum((contr.helmert)^2))

      nom5 <- sum(contr.revhelm*xq)
      den5 <- (sd.pooled/sqrt(n))*sqrt(sum((contr.revhelm)^2))

      nom6 <- sum(contr.linearc*xq)
      den6 <- (sd.pooled/sqrt(n))*sqrt(sum((contr.linearc)^2))

      nom7 <- sum(contr.jonckht*xq)
      den7 <- (sd.pooled/sqrt(n))*sqrt(sum((contr.jonckht)^2))

      nom8 <- sum(contr.maximum*xq)
      den8 <- (sd.pooled/sqrt(n))*sqrt(sum((contr.maximum)^2))

      nom9 <- sum(contr.linr24t*xq)
      den9 <- (sd.pooled/sqrt(n))*sqrt(sum((contr.linr24t)^2))

      res3 <- 2*(1-pt(q=abs(nom3/den3), df=df))
      res4 <- 2*(1-pt(q=abs(nom4/den4), df=df))
      res5 <- 2*(1-pt(q=abs(nom5/den5), df=df))
      res6 <- 2*(1-pt(q=abs(nom6/den6), df=df))
      res7 <- 2*(1-pt(q=abs(nom7/den7), df=df))
      res8 <- 2*(1-pt(q=abs(nom8/den8), df=df))
      res9 <- 2*(1-pt(q=abs(nom9/den9), df=df))

      if(res1[1] > 1 | res1[2] < 1){power[1] <- power[1] + 1}
      if(res2 < alpha){power[2] <- power[2] + 1}
      if(res3 < alpha){power[3] <- power[3] + 1}
      if(res4 < alpha){power[4] <- power[4] + 1}
      if(res5 < alpha){power[5] <- power[5] + 1}
      if(res6 < alpha){power[6] <- power[6] + 1}
      if(res7 < alpha){power[7] <- power[7] + 1}
      if(res8 < alpha){power[8] <- power[8] + 1}
      if(res9 < alpha){power[9] <- power[9] + 1}
   }

   res <- rep(NA, 11)
   res[1] <- mindose
   res[2] <- maxdose
   res[c(3:11)] <- power/nsim
   names(res) <- c('mindose', 'maxdose', 'log-log reg', 'anova', 't-test', 'helmert', 'revhelm', 'linearc', 'jonckht', 'maximum', 'linr24t')
   return(res)
}


# set parameters for simulations
nsim <- 1E4
cv <- 0.5
n <- 10
a <- 1

# dose-proportionality for complete dose range (simulate type I error)
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1, mindose=10, maxdose=20, range=c(1:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1, mindose=10, maxdose=100, range=c(1:4))

# all 4 doses outside proportional range
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=20, range=c(1:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=100, range=c(1:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=100, range=c(1:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=1000, range=c(1:4))

# last 3 doses outside proportional range
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=20, range=c(2:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=100, range=c(2:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=100, range=c(2:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=1000, range=c(2:4))

# last 2 doses outside proportional range
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=20, range=c(3:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=100, range=c(3:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=100, range=c(3:4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=1000, range=c(3:4))

# only highest dose outside proportional range
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=20, range=c(4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.1, mindose=10, maxdose=100, range=c(4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=100, range=c(4))
sim.dose4prop(nsim=nsim, cv=cv, n=n, a=a, b=1.15, mindose=10, maxdose=1000, range=c(4))
UA Flag
Activity
 Admin contact
22,957 posts in 4,819 threads, 1,636 registered users;
102 visitors (0 registered, 102 guests [including 8 identified bots]).
Forum time: 11:05 CET (Europe/Vienna)

With four parameters I can fit an elephant,
and with five I can make him wiggle his trunk.    John von Neumann

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