Jump to content


Photo

Dissolution model in PK simulation


  • Please log in to reply
6 replies to this topic

#1 mjons

mjons

    Newbie

  • Members
  • Pip
  • 6 posts

Posted 09 June 2020 - 01:38 PM

Hi,

I have set up a general PK model for an API based on PK data from an oral solution.

Separately, I have set up a dissolution model based on in vitro tablet dissolution data.

 

Now I would like to combine them to simulate PK profiles based on dissolution data, but i cannot figure out how to achieve that.

 

The dissolution model I want to use is a Weibull model:

 

test(){
covariate(T)
Y=Phi1*(1-exp(-(T/Phi2)^Phi3))
 
error(YEps = 1)
observe(YObs(T) = Y + YEps)
 
stparm(Phi1 = tvPhi1)
stparm(Phi2 = tvPhi2)
stparm(Phi3 = tvPhi3)
 
fixef(tvPhi1 = c(, 100, ))
fixef(tvPhi2 = c(, 3, ))
fixef(tvPhi3 = c(, 1, ))
}

 

where

-Y is cumulative release;

-T is time.

(I guess Phi1 would correspond to the dose for the PK model, however I used it as a parameter for fitting the dissolution model...)

 

I am looking to plug this into a normal 2-compartment, extra-vascular model, before the absorption compartment....

 

Any input would be appreciated.

 

(I was able to get a rough model by adding an additional absorption compartment before the model absorption compartment in graphical mode, however dissolution is poorly modeled by a simple dissolution constant and I was not able to replace the built-in Ka absorption with a Weibull model...)

 

Thanks,

/Martin


Edited by mjons, 09 June 2020 - 01:45 PM.


#2 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 187 posts

Posted 10 June 2020 - 09:17 AM

Hi Martin,

 

if you want to simulate or fit your PK profile using estimates from a fit of a Weibull model to your dissolution data you can try this PML code:

 

test(){
deriv(Aa = - WB *AaDose )
deriv(A1 = WB*AaDose - Cl * C - Cl2 * (C - C2))
deriv(A2 = Cl2 * (C - C2))
dosepoint(Aa,idosevar=AaDose)
C = A1 / V
C2 = A2/V2
# IVIVC
bs=Ascale*b
WB=(bs/MDT)*((t)/MDT)^(bs-1)*exp(-((t)/MDT)^bs)
deriv(Fa= WB)
error(CEps = 20.1559)
observe(CObs = C + CEps)
fixef(MDT(freeze) = c(,4,)) 
fixef(b(freeze) = c(,1.5,))
fixef(Ascale = c(,1,))
fixef(V = c(0, 15, ))
fixef(Cl = c(0, 5, ))
fixef(V2 = c(, 8, ))
fixef(Cl2 = c(, 2,))
}
 

Let me know if this works for you.

 

Bernd


  • mjons likes this

#3 mjons

mjons

    Newbie

  • Members
  • Pip
  • 6 posts

Posted 12 June 2020 - 11:53 AM

Thanks Bernd, this was very useful!

 

I ended up with a similar dissolution-PK model by taking the derivative of the Weibull function and using an open form approach.

 

(I had to dig deep to recall how this was done. I found this web applet to be useful, if your math skills are a bit rusty...: https://www.derivative-calculator.net/)

 

I still did not get it to work properly until I changed the deriv-statement multiplyers from "Aa" to "AaDose", inspired by your input above... (Do you know what the difference is between "Aa" and "AaDose"? I thought they were the same...)

 

I arrived at this model:

 

test(){
deriv(A1 = (Aa * Ka)- (Cl2 * (C - C2))- (Cl * C))
deriv(Aa = - (Aa * Ka) + (DisCptERDose * KdissER))
deriv(A2 = (Cl2 * (C - C2)))
deriv(DisCptER = - (DisCptERDose * KdissER))
C = A1 / V
error(CEps = 1)
observe(CObs = C + CEps)
C2 = A2 / V2
dosepoint(DisCptER, idosevar = DisCptERDose, infdosevar = DisCptERInfDose, infratevar = DisCptERInfRate)
stparm(V = tvV)
stparm(Ka = tvKa)
stparm(V2 = tvV2)
stparm(Cl2 = tvCl2)
stparm(Cl = tvCl)
stparm(KdissER = ((t==0) ? 1:((Phi3*((t)/Phi2)^Phi3 * exp(-((t)/Phi2)^Phi3))/(t))))
stparm(Phi2 = tvPhi2)
stparm(Phi3 = tvPhi3)
fixef(tvV = c(, 1, ))
fixef(tvKa = c(, 1, ))
fixef(tvV2 = c(, 1, ))
fixef(tvCl2 = c(, 1, ))
fixef(tvCl = c(, 1, ))
fixef(tvPhi2 = c(, 1, ))
fixef(tvPhi3 = c(, 1, ))
}

 

I tested the dissolution model in isolation on a simpler 1-compartment model without elimination to see if I could replicate dissolution results using the derivative form (using Phi1 from the closed form model as the dose...):

 

test(){
deriv(A1 = (AaDose * Ka))
deriv(Aa = - (AaDose * Ka))
V = 1
C = A1 / V
dosepoint(Aa, idosevar = AaDose, infdosevar = AaInfDose, infratevar = AaInfRate)
error(CEps = 1)
observe(CObs = C + CEps)
#stparm(V = tvV)
#stparm(Ka = ((Phi3/Phi2)^Phi3 * t^(Phi3-1)* exp(-(t/Phi2)^Phi3)))
stparm(Ka = ((t==0) ? 1:((Phi3*((t)/Phi2)^(Phi3) * exp(-((t)/Phi2)^Phi3))/(t))))
stparm(Phi2 = tvPhi2)
stparm(Phi3 = tvPhi3)
#fixef(tvV = c(, 1, ))
fixef(tvPhi2 = c(, 1, ))
fixef(tvPhi3 = c(, 1, ))
}

 

A peculiar issue I have not figured out yet, was that, although the derivative model was able to simulate the dissolution curve well using the model parameters from the closed form model (i.e. the "Simulation" data output), fitting to this model produced different estimates of constants. When making a simulation using the closed form parameters, the DV, IPRED vs IVAR plot is off (a bit too high), although the resulting Simulation output was spot on!  I.e. it seems that I cannot use the open form to make a correct model fit. However, it still appears to work for simulating dissolution (using constants obtained from the closed form model...).

 

Not sure I get everything in your code, but I interpret it that you are scaling the sigmoidicity factor ("b") to estimate IVIVC but that you keep the slope factor ("MDT") from the in vitro testing constant... Is this correctly interpreted? In your experience, could I make some kind of educated estimation of the sigmoidicity IVIVC scaling factor somehow before going into clinic? (E.g. does it normally tend to be in a specific interval?)

 

I guess until I have figured out the discrepancies between the models, It will be difficult to use the model for IVIVC...


Edited by mjons, 12 June 2020 - 11:57 AM.


#4 mjons

mjons

    Newbie

  • Members
  • Pip
  • 6 posts

Posted 12 June 2020 - 01:42 PM

Update:

Copying your code made the model work flawlessly in the derivative form as well. After some testing I discovered that my error was that I had defined the Ka (your WB) parameter as a structural parameter. Just using 

Ka = ((t==0) ? 1:((Phi3*((t)/Phi2)^(Phi3) * exp(-((t)/Phi2)^Phi3))/(t)))

made my version work for model fitting as well, resulting in the same parameter estimates as the closed form.

 

Problem solved!

 

Thanks again!

/Martin


Edited by mjons, 12 June 2020 - 01:43 PM.


#5 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 187 posts

Posted 12 June 2020 - 02:08 PM

Hi Martin,

 

glad you worked it out on your own. Perhaps just a comment to your questions:

 

Aa is preserved as absorption compartment and is used to define the differential equation that describes for example first order absorption. When you use Aa in your model you need to know that the value changes over time, since it typically starts with the full bolus and gets smaller over time while it transfers compound from Aa to A1. 

AaDose is a useful variable that you can define in the dosepoint() statement, this is a fixed number and represents the amount of dose. If you use your absorption rate ( in my case WB), you just multiply the absorption rate by this fixed amount to get to the individual amount that is transferred from Aa to A1.

 

Hope, this makes sense. Let me know if there are further questions.

 

Bernd



#6 mjons

mjons

    Newbie

  • Members
  • Pip
  • 6 posts

Posted 12 June 2020 - 02:33 PM

Makes sense.

 

One additional thing I am interested in is any real-world experience with Weibull model IVIVC. I guess it is very API dependent, but are there any rules of thumb on how you would expect the sigmoidicity or the slope factor to scale between in vitro and in vivo (and what would be a "common" range). E.g. is a 1:1 scaling the optimal starting point or would it be better to assume some other scaling factor(s) to be more likely?

 

(The API I am working with has comparably good solubility...)

 

(I do understand this is probably difficult to answer on a general level and that any response would be speculative...)

 

/Martin



#7 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 187 posts

Posted 12 June 2020 - 02:44 PM

Can't comment on the general question, but I would always recommend using the Initial Estimates Tab as the first place to look for a good starting value for Ascale.

 

Bernd






0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users