Jump to content


Photo

Adding dissolution to semi-physiologic lung model

lung dissolution PBPK

  • Please log in to reply
12 replies to this topic

#1 Graham Blakey

Graham Blakey

    Member

  • Members
  • PipPip
  • 12 posts

Posted 01 December 2020 - 02:44 PM

I have been using a semi-physiologic model reported by Hendrickx (CPT, 2018) to investigate lung and plasma PK.  The Hendrickx model as published has worked well for the datasets I have been using.  For the next stage of work I would like to simulate the effects of dissolution in the lung.  There is a published model (Franek F, 2018) that I have incorporated into the Hendrickx model.  Output from the simulation demonstrated an effect of dissolution on the lung curve.  Nevertheless, the lung output was insenstive to changes in the amount of drug delivered to the lung.  I have detailed the model text below, that in blue reflects the changes I made incorporating the lung dissolution model.  Has the rate (dissolution) been correctly applied to the lung dosing point A2?

 

test(){
# dose 
 
dosepoint(A2,rate=Fd) # Lung deposited dose in shallow lung, compartment 2 (Table S4) 
 
dosepoint(Aa,bioavail=F) # Portion of inhaled dose ending up in gastro-intestinal tract 
 
 Fd = (1- exp(-(t/t63)^B))
 
# differential equations describing rate of change for the amounts over time in each of the 5 compartments 
 
# Aa = amount in GI tract 
 
deriv(Aa = -ka*Aa) 
 
# A1 = amount in plasma 
 
deriv(A1 = (ka*Aa)+(C2*fu2*CLD12)+(C4u*CLD14)-(C1*CL)-(C1*fu1*CLD12)-(C1*fu1*CLD14)) 
 
# A2 = amount in ‘shallow’ lung 
 
deriv(A2 = (K32*A3)+(CLD12*fu1*C1)-(C2*fu2*CLD12)-(C2*fu2*CLD23)) 
 
# A3 = amount in ’deep’ lung  
 
deriv(A3 = (fu2*CLD23*C2)-(K32*A3)) 
 
# A4 = amount in ‘shallow’ tissue (without lung) 
 
deriv(A4 = (K32*A5)+(CLD14*fu1*C1)-(C4u*CLD14)-(C4u*CLD45)) 
 
# A5 = amount in ’deep’ tissue (without lung) 
 
deriv(A5 = (CLD45*C4u)-(K32*A5)) 
 
 
 
# initial values residual error standard deviations  
 
#error(CEps = 0.1)# st. dev residual error connected to plasma concentrations 
 
#error(LEps = 0.1)# st. dev. residual error connected to lung concentrations 
 
 
 
# concentration terms 
 
C1=A1/V1# total plasma concentrations, compartment 1 
 
C2=A2/V2# total concentration in ‘shallow’ lung, compartment 2 
 
C4u=A4*fu4_V4# unbound concentration in ‘shallow’ tissue (without lung), compartment 4  
 
Clung = (A2+A3)/V2 # total lung concentrations 
 
 
 
# residual error model 
 
#observe(LObs= Clung  *(1 + LEps)) # proportional residual error on total lung concentrations 
 
#observe(CObs=C1  *(1 + CEps))# proprotional residual error on total plasma concentrations 
 
 
 
# parameters 
 
stparm(K32 = tvK32)#  fractional distribution rate constant from ‘deep’ to ‘shallow’ lung  
 
stparm(CLD23 = tvCLD23)#  unbound distributional clearance from ‘shallow’ to ‘deep’ lung 
 
stparm(CLD45 = tvCLD45)# unbound distributional clearance from ‘shallow’ to ‘deep’ tissue 
 
stparm(CLD12 = tvCLD12)# unbound distributional clearance between ‘shallow’ lung and #plasma 
 
stparm(CLD14 = tvCLD14)# unbound distributional clearance between plasma and ‘shallow’ #tissue (without lung) 
 
stparm(CL = tvCL)# elimination clearance from total plasma 
 
stparm(V1 = tvV1)# volume of plasma compartment 
 
stparm(V2 = tvV2)# volume of ’shallow’ lung compartment 
 
stparm(fu1 = tvfu1)# unbound fraction in plasma 
 
stparm(fu2 = tvfu2)# unbound fraction in ’shallow’ lung compartment  
 
stparm(fu4_V4 = tvfu4_V4)# ratio unbound fraction and volume in ’shallow’ tissue (without #lung) 
 
stparm(F=tvF)# bioavailability from GI tract 
stparm(ka=tvka)# first order absorption rate constant  
stparm(t63=tvt63)# dissolution parameter
stparm(b=tvb) #dissolution parameter
 
 
# fixed parameter and constants for simulation 
fixef(tvK32 = c(,1.84,))
 
fixef(tvCLD23 = c(,3895,))  
 
fixef(tvCLD45 (freeze) = c(,4391,))value 
 
fixef(tvCLD12 (freeze) = c(,22327,))
 
fixef(tvCLD14 (freeze) = c(,4327,))
 
fixef(tvCL (freeze)   = c(,200,))
fixef(tvV1 (freeze) = c(,46,))
fixef(tvV2 (freeze)= c(,14,))
 
fixef(tvfu1 (freeze) = c(,0.07,)) 
 
fixef(tvfu2 (freeze) = c(,0.03,))
 
fixef(tvfu4_V4 (freeze)= c(,0.0000442,)) 
 
fixef(tvF (freeze)= c(,0.98,))# constant 
 
fixef(tvka (freeze)= c (,0.94,))# constant 
fixef(tvt63 (freeze)= c (,2.6,))# constant 
fixef(tvb (freeze)= c (,1.2,))# constant
}

 



#2 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 202 posts

Posted 01 December 2020 - 04:06 PM

Hi Graham,

 

I think the code looks fine when you put parameter b in Fd line to lowercase:

 

 Fd = (1- exp(-(t/t63)^B))

 

and remove 'value' from line:

 

fixef(tvCLD45 (freeze) = c(,4391,))value

 

I don't have the reference available but I can see that the dissolution function works as expected:

 

franek.png

 

Bernd



#3 Graham Blakey

Graham Blakey

    Member

  • Members
  • PipPip
  • 12 posts

Posted 03 December 2020 - 11:57 AM

Hi Graham,

 

I think the code looks fine when you put parameter b in Fd line to lowercase:

 

 Fd = (1- exp(-(t/t63)^ B))

 

and remove 'value' from line:

 

fixef(tvCLD45 (freeze) = c(,4391,))value

 

I don't have the reference available but I can see that the dissolution function works as expected:

 

attachicon.giffranek.png

 

Bernd

 

Hi Graham,

 

I think the code looks fine when you put parameter b in Fd line to lowercase:

 

 Fd = (1- exp(-(t/t63)^ B))

 

and remove 'value' from line:

 

fixef(tvCLD45 (freeze) = c(,4391,))value

 

I don't have the reference available but I can see that the dissolution function works as expected:

 

attachicon.giffranek.png

 

Bernd

 

 

Thanks for the sense check Bernd, inclusion of the dissolution function has had an impact on the lung profile, adding a notable nose to the early part of the profile.  I will now examine the lung dose sensitivity



#4 Arindam Pal1412845459

Arindam Pal1412845459

    Member

  • Members
  • PipPip
  • 12 posts
  • LocationIndia

Posted 14 January 2021 - 12:16 PM

Hi Bernd,

I tried a compartmental model described in Weber & Hochhaus (2013) (DOI: 10.1208/s12248-012-9420-z)

However, I could not integrate the in vitro dissolution into the model. I have followed the above work by Graham Blakey but could not understand where Fd should be used and how the dissolution model convolutes the plasma sampling time.

Here is the model text (though I used graphical model to built it):

 
test(){
deriv(A1 = - (Cl * C) + (Agut * Ka)- (A1 * K12- A2 * K21)- (A1 * K13- A3 * K31) + (LC2 * KpulC) + (LP2 * KpulP))
urinecpt(A0 = (Cl * C))
deriv(Agut = - (Agut * Ka) + (LC1 * Kmuc))
deriv(A2 = (A1 * K12- A2 * K21))
deriv(A3 = (A1 * K13- A3 * K31))
deriv(LC1 = - (LC1 * Kdiss1)- (LC1 * Kmuc))
deriv(LP1 = - (LP1 * Kdiss2))
deriv(LC2 = (LC1 * Kdiss1)- (LC2 * KpulC))
deriv(LP2 = (LP1 * Kdiss2)- (LP2 * KpulP))
C = A1 / V
dosepoint(Agut, bioavail = (1-Flung), idosevar = AgutDose, infdosevar = AgutInfDose, infratevar = AgutInfRate)
C2 = A2 / V2
C3 = A3 / V3
error(CEps = 0.129113)
observe(CObs = C * (1 + CEps))
dosepoint(LC1, bioavail = (Flung*Fc), idosevar = LC1Dose, infdosevar = LC1InfDose, infratevar = LC1InfRate)
dosepoint(LP1, bioavail = (Flung*(1-Fc)), idosevar = LP1Dose, infdosevar = LP1InfDose, infratevar = LP1InfRate)
dosepoint(LC2, idosevar = LC2Dose, infdosevar = LC2InfDose, infratevar = LC2InfRate)
dosepoint(LP2, idosevar = LP2Dose, infdosevar = LP2InfDose, infratevar = LP2InfRate)
V2 = V * K12 / K21
V3 = V * K13 / K31
stparm(V = tvV * exp(nV))
stparm(Cl = tvCl * exp(nCl))
stparm(Ka = tvKa * exp(nKa))
stparm(K12 = tvK12 * exp(nK12))
stparm(K21 = tvK21 * exp(nK21))
stparm(K13 = tvK13 * exp(nK13))
stparm(K31 = tvK31 * exp(nK31))
stparm(Kdiss1 = tvKdiss1 * exp(nKdiss1))
stparm(Kdiss2 = tvKdiss2 * exp(nKdiss2))
stparm(KpulC = tvKpulC * exp(nKpulC))
stparm(KpulP = tvKpulP * exp(nKpulP))
stparm(Kmuc = tvKmuc * exp(nKmuc))
stparm(Flung = tvFlung * exp(nFlung))
stparm(Fc = tvFc * exp(nFc))
fixef(tvV = c(0, 449977, ))
fixef(tvCl = c(0, 891215, ))
fixef(tvKa = c(0, 0.000186342, ))
fixef(tvK12 = c(0, 26.9125, ))
fixef(tvK21 = c(0, 2.40337, ))
fixef(tvK13 = c(0, 4.34205, ))
fixef(tvK31 = c(0, 0.137184, ))
fixef(tvKdiss1 = c(0, 0.611705, ))
fixef(tvKdiss2 = c(0, 0.515543, ))
fixef(tvKpulC = c(0, 0.640902, ))
fixef(tvKpulP = c(0, 2.00652, ))
fixef(tvKmuc = c(0, 0.867809, ))
fixef(tvFlung = c(0, 0.122029, ))
fixef(tvFc = c(0, 0.419845, ))
ranef(diag(nV, nCl, nKa, nKdiss1, nKdiss2, nKpulC, nKpulP, nKmuc, nFlung, nFc, nK13, nK31, nK12, nK21) = c(0.076019038, 0.10589686, 0.014178068, 0.088570482, 0.042196109, 0.028507407, 0.49173247, 0.010473541, 0.022482389, 0.020713788, 0.003693953, 0.036396117, 0.078878827, 0.068986523))
}

 

Can you kindly help me understand to utilize Kdiss1 and Kdiss2 more as a function of dissolution rather than as a rate constant?

 

Kind regards

Arindam



#5 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 202 posts

Posted 15 January 2021 - 03:13 PM

Hi Arindam,

 

I believe you tried to use the rate function inside the dosepoint statement with the fraction dissolved(Fd). If that does not work, you can try another way:

 

1. the idosevar function of the dosepoint holds the information about the dose amount

2. you can use LC1Dose (the amount dosed into LC1) and multiply it with the fraction dissolved (Fd) directly within the deriv statement

 

You have to replace your differential equation for LC1:

 

 

deriv(LC1 = Fd * LC1Dose - (LC1 * Kmuc))

Fd = (1- exp(-(t/t63)^B))

 

and provide parameter estimates for t63 and b.

 

Hope, this helps.

 

Bernd



#6 Arindam Pal1412845459

Arindam Pal1412845459

    Member

  • Members
  • PipPip
  • 12 posts
  • LocationIndia

Posted 18 January 2021 - 07:11 PM

Dear Bernd,

Thanks for your guidance.

As you assumed, "I believe you tried to use the rate function inside the dosepoint statement with the fraction dissolved(Fd)", I didn't do that as I couldn't find the rate function in dosepoint. Is it a feature in Phoenix v. 8.1, I'm still using v. 6.4 and I didn't see that.

On the other hand, I used expression for Fd and added and defined the parameters. It worked for me.

 

However, there are other problems that I encountered:

1. the model didn't converge in FOCE-ELS even after taking > 3 hrs, I resorted to QRPEM and it instantly converged. Why is this?

2. when I re-executed my model with parameters defined, I got thetas without %CV (except the final estimates all colums were blank). Why is this? Is it due to wrong initial estimates?

3. Since GI absorption is negligible I'm considering "ka=0.0001" (rate constant from GI absorption). Am I doing something wrong here?

 

Regards

Arindam

 

Here is the model code:

 

test(){
deriv(A1 = - (Cl * C) + (LC1 * KpulC)- (A1 * K12- A2 * K21)- (A1 * K13- A3 * K31) + (Agut * Ka) + (LP1 * KpulP))
urinecpt(A0 = (Cl * C))
deriv(LC1 = - (LC1 * KpulC)- (LC1 * Kmuc))
deriv(A2 = (A1 * K12- A2 * K21))
deriv(A3 = (A1 * K13- A3 * K31))
deriv(LP1 = - (LP1 * KpulP))
deriv(Agut = - (Agut * Ka) + (LC1 * Kmuc))
C = A1 / V
dosepoint(LC1, tlag = (Tlag), bioavail = (Flung*Fc*Fd1), idosevar = LC1Dose, infdosevar = LC1InfDose, infratevar = LC1InfRate)
C2 = A2 / V2
C3 = A3 / V3
error(CEps = 1.83739)
observe(CObs = C + CEps)
dosepoint(LP1, bioavail = (Flung*(1-Fc)*Fd2), idosevar = LP1Dose, infdosevar = LP1InfDose, infratevar = LP1InfRate)
dosepoint(Agut, bioavail = (1-Flung), idosevar = AgutDose, infdosevar = AgutInfDose, infratevar = AgutInfRate)
Fd1 = 1-exp(-((t/t63)^b1))
Fd2 = 1-exp(-((t/t60)^b2))
V2 = V * K12 / K21
V3 = V * K13 / K31
stparm(V = tvV * exp(nV))
stparm(Cl = tvCl * exp(nCl))
stparm(Tlag = tvTlag * exp(nTlag))
stparm(KpulC = tvKpulC * exp(nKpulC))
stparm(K12 = tvK12 * exp(nK12))
stparm(K21 = tvK21 * exp(nK21))
stparm(K13 = tvK13 * exp(nK13))
stparm(K31 = tvK31 * exp(nK31))
stparm(Ka = tvKa * exp(nKa))
stparm(KpulP = tvKpulP * exp(nKpulP))
stparm(Kmuc = tvKmuc * exp(nKmuc))
stparm(Flung = tvFlung * exp(nFlung))
stparm(Fc = tvFc * exp(nFc))
stparm(t63 = tvt63 * exp(nt63))
stparm(b1 = tvb1 * exp(nb1))
stparm(t60 = tvt60 * exp(nt60))
stparm(b2 = tvb2 * exp(nb2))

Edited by Arindam Pal1412845459, 19 January 2021 - 06:26 AM.


#7 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 202 posts

Posted 19 January 2021 - 10:42 AM

Hi Arindam,

 

re your questions:

 

1. the model didn't converge in FOCE-ELS even after taking > 3 hrs, I resorted to QRPEM and it instantly converged. Why is this?

 

Glad you found out that QRPEM is by far the best method to run models, depending on the specific nature of the model and the data, you would need to change the method or the ODE solver.

 

2. when I re-executed my model with parameters defined, I got thetas without %CV (except the final estimates all colums were blank). Why is this? Is it due to wrong initial estimates?

 

The final step in fitting is to do standard error calculation, this step can fail if the model is not robust enough as it happens to be the case here. If you insist on getting standard errors, CV% calculated, please consider doing bootstraps.

 

3. Since GI absorption is negligible I'm considering "ka=0.0001" (rate constant from GI absorption). Am I doing something wrong here?

 

I am not sure this is correct. If you say that the absorption in the gut is negligible, you don't want to decrease the absorption rate, you'd rather want to limit the amounts, e.g. bioavailability. At least that is what I would do.

 

 

Bernd



#8 Arindam Pal1412845459

Arindam Pal1412845459

    Member

  • Members
  • PipPip
  • 12 posts
  • LocationIndia

Posted 19 January 2021 - 10:56 AM

Hi Bernd,

 

I will certainly do bootstrapping and VPC to ascertain the parameters' robustness and model evaluation, respectively.

 

However in 3rd point, I would like to restrict absorption to central compartment from gut. For this inhaled product, about 80% of the drug passes to GI system but majority of which is metabolized and leaves with 1-2% of drug reaching systemic circulation.

I am thinking of resorting to add another elimination compartment linked to gut absorption compartment mimicking clearance through metabolism.

Otherwise, how can I limit the bioavailability in gut?

 

Regards

Arindam



#9 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 202 posts

Posted 19 January 2021 - 11:01 AM

Arindam,

 

bioavailability is specified on the dosepoint for Agut:

 

dosepoint(Agut, bioavail = (1-Flung), idosevar = AgutDose, infdosevar = AgutInfDose, infratevar = AgutInfRate)

 

You did limit it already, but it does not seem to work well. I can't tell without the full data/project.

 

Bernd



#10 Arindam Pal1412845459

Arindam Pal1412845459

    Member

  • Members
  • PipPip
  • 12 posts
  • LocationIndia

Posted 19 January 2021 - 11:59 AM

Arindam,

 

bioavailability is specified on the dosepoint for Agut:

 

dosepoint(Agut, bioavail = (1-Flung), idosevar = AgutDose, infdosevar = AgutInfDose, infratevar = AgutInfRate)

 

You did limit it already, but it does not seem to work well. I can't tell without the full data/project.

 

Bernd

 

 

Hi Bernd,

I am posting the model code here with initial estimates but not attaching the project as it is done in v. 6.4. Any project run in v.8.0 or more cannot run in system with v.6.4.

 

test(){

deriv(A1 = - (Cl * C) + (LC1 * KpulC)- (A1 * K12- A2 * K21)- (A1 * K13- A3 * K31) + (LP1 * KpulP) + (Agut * Kgut))
urinecpt(A0 = (Cl * C))
deriv(LC1 = - (LC1 * KpulC)- (LC1 * Kmuc))
deriv(A2 = (A1 * K12- A2 * K21))
deriv(A3 = (A1 * K13- A3 * K31))
deriv(LP1 = - (LP1 * KpulP))
deriv(Agut = - (Agut * Kgut) + (LC1 * Kmuc)- (Agut * Ke1))
urinecpt(A4 = (Agut * Ke1))
C = A1 / V
dosepoint(LC1, tlag = (Tlag), bioavail = (Flung*Fc*Fd1), idosevar = LC1Dose, infdosevar = LC1InfDose, infratevar = LC1InfRate)
error(CEps = 0.1)
observe(CObs = C * (1 + CEps))
dosepoint(LP1, bioavail = (Flung*(1 - Fc)*Fd2), idosevar = LP1Dose, infdosevar = LP1InfDose, infratevar = LP1InfRate)
dosepoint(Agut, bioavail = (1 - Flung), idosevar = AgutDose, infdosevar = AgutInfDose, infratevar = AgutInfRate)
Fd1 = 1-exp(-((t/t63)^b1))
Fd2 = 1-exp(-((t/t60)^b2))
stparm(V = tvV * exp(nV))
stparm(Cl = tvCl * exp(nCl))
stparm(Tlag = tvTlag * exp(nTlag))
stparm(KpulC = tvKpulC * exp(nKpulC))
stparm(K12 = tvK12 * exp(nK12))
stparm(K21 = tvK21 * exp(nK21))
stparm(K13 = tvK13 * exp(nK13))
stparm(K31 = tvK31 * exp(nK31))
stparm(KpulP = tvKpulP * exp(nKpulP))
stparm(Kgut = tvKgut * exp(nKgut))
stparm(Kmuc = tvKmuc * exp(nKmuc))
stparm(Ke1 = tvKe1 * exp(nKe1))
stparm(Flung = tvFlung * exp(nFlung))
stparm(Fc = tvFc * exp(nFc))
stparm(t63 = tvt63 * exp(nt63))
stparm(b1 = tvb1 * exp(nb1))
stparm(t60 = tvt60 * exp(nt60))
stparm(b2 = tvb2 * exp(nb2))
fixef(tvV = c(0, 370000, ))
fixef(tvCl = c(0, 300000, ))
fixef(tvTlag = c(0, 0.33, ))
fixef(tvKpulC = c(0, 0.6, ))
fixef(tvK12 = c(0, 3.3, ))
fixef(tvK21 = c(0, 0.7, ))
fixef(tvK13 = c(0, 1.7, ))
fixef(tvK31 = c(0, 0.11, ))
fixef(tvKpulP = c(0, 6, ))
fixef(tvKgut = c(0, 0.55, ))
fixef(tvKmuc = c(0, 1, ))
fixef(tvKe1 = c(0, 0.1, ))
fixef(tvFlung = c(0, 0.16, ))
fixef(tvFc = c(0, 0.5, ))
fixef(tvt63 = c(0, 1, ))
fixef(tvb1 = c(0, 1.1, ))
fixef(tvt60 = c(0, 0.33, ))
fixef(tvb2 = c(0, 0.7, ))
ranef(diag(nV, nK12, nK21, nK13, nK31, nTlag, nKpulC, nKpulP, nKgut, nKmuc, nKe1, nFlung, nFc, nt63, nb1, nt60, nb2, nCl) = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1))
}


#11 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 202 posts

Posted 19 January 2021 - 01:17 PM

Arindam,

 

based on your estimates, Flung is set to 0.16, therefore the fraction in Agut is 1-Flung=0.84. Don't you think this is too high?

I don't have the dose amounts so I can't simulate the model. 

 

Bernd



#12 Arindam Pal1412845459

Arindam Pal1412845459

    Member

  • Members
  • PipPip
  • 12 posts
  • LocationIndia

Posted 19 January 2021 - 01:32 PM

Arindam,

 

based on your estimates, Flung is set to 0.16, therefore the fraction in Agut is 1-Flung=0.84. Don't you think this is too high?

I don't have the dose amounts so I can't simulate the model. 

 

Bernd

 

 

Hi Bernd,

 

Yes, this is true. The dose is 100 ug. The lung bioavailability varies between 15 and 20%, that's what I saw when I deconvoluted it with IV dose.



#13 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 202 posts

Posted 19 January 2021 - 01:35 PM

Arindam,

 

I guess it would make more sense to discuss this topic in a remote session. Can you send a message to support@certara.com to trigger a ticket and we can schedule through that.

 

Bernd


  • Arindam Pal1412845459 likes this





Also tagged with one or more of these keywords: lung, dissolution, PBPK

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users