Jump to content


Photo

PopPK Post-hoc Estimates With Phoenix NLME

nlme population pk pharmacokinetics posthoc modeling and simulation

  • Please log in to reply
10 replies to this topic

#1 csheme

csheme

    Advanced Member

  • Members
  • PipPipPip
  • 59 posts

Posted 17 June 2019 - 03:34 PM

Hi all,

 

I have established a population PK model using Phoenix NLME. My dataset contains 93 subjects and follows a 2-cmpt model with an intravenous bolus input given over 5 minutes with a weekly regimen. 

 

I am interested in calculating exposure metrics including (Cmax: post-infusion e.g. 5min;  Cmin immediately pre-dose e.g. 167.99hrs and 1175.99hrs; and AUC) from:

 

0-168hrs (First week of exposure from the first dose). Cmax, Cmin, AUC

 

1008-1176hrs (Seventh week of exposure from the seventh dose onwards). Cmax, Cmin, AUC

 

After running the model I do get a Table of IDs, and post-hoc parameter estimates for each of the 93 patients in the model (e.g. V, V2, CL, and CL2). 

 

How can I use the actual post-hoc PK parameter estimates in my model for the 93 subjects to estimate the exposure estimates for each subject (Cmax, Cmin, and AUC) for the First week and Seventh week, based off of the post-hoc exposure metrics I have obtained. 

 

This would be very helpful for me as I have been unsuccessful in using PHX NLME to do this so far. 

 

My complete PHX Project is attached. Thanks Sincerely.

Attached Files


Edited by csheme, 17 June 2019 - 03:40 PM.

  • LavillKaH, DevinNap, RucasinoDig and 19 others like this

#2 smouksassi1

smouksassi1

    Advanced Member

  • Val_Members
  • PipPipPip
  • 232 posts
  • LocationMontreal

Posted 17 June 2019 - 07:04 PM

I dont see that you have specified a 5 min  infusion in your model.

What you want is to simulate individual concentrations © using your final individual post hoc estimates at the desired time points and with rich enough scheme to compute whatever PK parameter you need.

 

The simulation is a general solution, but for simple models a formula for ss/ multiple dose and single dose prediction might exist.

 

Please explain what you tried and what is not working.



#3 csheme

csheme

    Advanced Member

  • Members
  • PipPipPip
  • 59 posts

Posted 17 June 2019 - 07:11 PM

Hi,

 

I actually have not tried anything here, as I am unfamiliar with how to do this. I do not know how to setup a simulation based off the actual post-hoc estimates for the actual patients in the study, and not off the population estimates. 

 

No worries about the dosing input, I think its the subsequent process that I am unfamiliar with (e.g. obtaining exposure metrics based on post-hoc estimates for each subject), if you might be able to please demonstrate how it is done in an actual project it would be very helpful.

 

How would I setup a simulation table using the actual post-hoc estimates of the actual subjects, also, you mentioned a formula, which/how would you implement this.

 

Thank you.


Edited by csheme, 17 June 2019 - 07:15 PM.


#4 smouksassi1

smouksassi1

    Advanced Member

  • Val_Members
  • PipPipPip
  • 232 posts
  • LocationMontreal

Posted 17 June 2019 - 08:11 PM

The classical way is to copy paste your model.

Merge your data with your individual parameters so now you have a set of new colums

ID TIME CLposthoc Vposthoc.. 

 

where posthoc are whatever your model find out to be your individual subject parameter.

 

Then use your individual parameters as covariates in your new simulation model.

 

so  

 

fcovariate(CLposthoc)

 

stparm(Cl =CLposthoc) # no random effect sut telling that clearance is taken from the column you mapped and used as covaraite and so on

you might need to trick the software to have a dummy theta and omega just to make it work
 

stparm(dum = tvdum* exp(ndum))
fixef(tvdum= c(, 1, ))
ranef(diag( ndum) = c(0.000001))

 

 

then you ask for a table with fine grid simulation of time: time : seq(0,168,0.01) or c(whatever time you want to predict C at)

 

 

alternatively you can use the sequential PKPD trick where you freexe pop pk parameter and you use nCL ,... as covariate



#5 csheme

csheme

    Advanced Member

  • Members
  • PipPipPip
  • 59 posts

Posted 17 June 2019 - 09:13 PM

The classical way is to copy paste your model.

Merge your data with your individual parameters so now you have a set of new colums

ID TIME CLposthoc Vposthoc.. 

 

where posthoc are whatever your model find out to be your individual subject parameter.

 

Then use your individual parameters as covariates in your new simulation model.

 

so  

 

fcovariate(CLposthoc)

 

stparm(Cl =CLposthoc) # no random effect sut telling that clearance is taken from the column you mapped and used as covaraite and so on

you might need to trick the software to have a dummy theta and omega just to make it work
 

stparm(dum = tvdum* exp(ndum))
fixef(tvdum= c(, 1, ))
ranef(diag( ndum) = c(0.000001))

 

 

then you ask for a table with fine grid simulation of time: time : seq(0,168,0.01) or c(whatever time you want to predict C at)

 

 

alternatively you can use the sequential PKPD trick where you freexe pop pk parameter and you use nCL ,... as covariate

 

Thanks Samer, might you be able to view my new project to see if I am on the right track as something appears odd here with this setup, I do not think the posthoc estimates are reading in right with the covariate trick as the simulated profiles appear very odd/extreme with this technique.

Attached Files


Edited by csheme, 17 June 2019 - 09:50 PM.


#6 smouksassi1

smouksassi1

    Advanced Member

  • Val_Members
  • PipPipPip
  • 232 posts
  • LocationMontreal

Posted 19 June 2019 - 01:03 PM

make sure that you set tvV and dVdposthocV to 1 so the equation will become whatever posthoc you mapped 
I usually go to text mode to edit the equation and model 
 
stparm(V = tvV * posthocV^dVdposthocV)
fcovariate(posthocV)
fixef(tvV(freeze) = c(, 1, ))
fixef(dVdposthocV(freeze) = c(, 1, ))
 
or edit in textual  and remove redundant fixef statements
fcovariate(posthocV)
stparm(V = posthocV) 


#7 csheme

csheme

    Advanced Member

  • Members
  • PipPipPip
  • 59 posts

Posted 19 June 2019 - 02:57 PM

I do appear to see an error with the code on lines 12 and 14.

 

test(){

                  cfMicro(A1, Cl / V, Cl2 / V, Cl2 / V2)

                  dosepoint(A1)

                  C = A1 / V

                  error(CEps = 0.400566)

                  observe(CObs = C * (1 + CEps))

                  stparm(V = tvV * Vposthoc^dVdVposthoc * exp(nV))

                  stparm(V2 = tvV2 * V2posthoc^dV2dV2posthoc * exp(nV2))

                  stparm(Cl = tvCl * Clposthoc^dCldClposthoc * exp(nCl))

                  stparm(Cl2 = tvCl2 * Cl2posthoc^dCl2dCl2posthoc * exp(nCl2))

                  fixef(tvV(freeze) = c(, 1, )

                  fixef(tvV2(freeze) = c(, 1, )

                  fixef(tvCl(freeze) = c(, 1, )

                  fixef(tvCl2(freeze) = c(, 1, )

                  fixef(dVdVposthoc(freeze) = c(, 1, ))

                  fixef(dVdV2posthoc(freeze) = c(, 1, ))

                  fixef(dVdClposthoc(freeze) = c(, 1, ))

                  fixef(dVdCl2posthoc(freeze) = c(, 1, ))

                  ranef(diag(nV, nCl, nV2, nCl2) = c(0.13664072, 0.40639426, 0.53078685, 0.41292548))

}

 

Further revised to, still having a warning here 

 

test(){

                  cfMicro(A1, Cl / V, Cl2 / V, Cl2 / V2)

                  dosepoint(A1)

                  C = A1 / V

                  error(CEps = 0.400566)

                  observe(CObs = C * (1 + CEps))

                  stparm(V = Vposthoc)

                  stparm(V2 = V2posthoc)

                  stparm(Cl = Clposthoc)

                  stparm(Cl2 = Cl2posthoc)

                  fixef(tvV(freeze) = c(, 1, )

                  fixef(tvV2(freeze) = c(, 1, )

                  fixef(tvCl(freeze) = c(, 1, )

                  fixef(tvCl2(freeze) = c(, 1, )

                  fixef(dVdVposthoc(freeze) = c(, 1, ))

                  fixef(dVdV2posthoc(freeze) = c(, 1, ))

                  fixef(dVdClposthoc(freeze) = c(, 1, ))

                  fixef(dVdCl2posthoc(freeze) = c(, 1, ))

                  ranef(diag(nV, nCl, nV2, nCl2) = c(0.000001, 0.0000010.0000010.000001))

}


Edited by csheme, 19 June 2019 - 05:32 PM.


#8 bwendt@certara.com

bwendt@certara.com

    Advanced Member

  • Administrators
  • 282 posts

Posted 19 June 2019 - 07:39 PM

Hi Colby,

 

there were a few missing close-parenthesis, please try this:

 

test(){
 
                  cfMicro(A1, Cl / V, Cl2 / V, Cl2 / V2)
 
                  dosepoint(A1)
 
                  C = A1 / V
 
                  error(CEps = 0.400566)
 
                  observe(CObs = C * (1 + CEps))
 
                  stparm(V = tvV * Vposthoc^dVdVposthoc * exp(nV))
 
                  stparm(V2 = tvV2 * V2posthoc^dV2dV2posthoc * exp(nV2))
 
                  stparm(Cl = tvCl * Clposthoc^dCldClposthoc * exp(nCl))
 
                  stparm(Cl2 = tvCl2 * Cl2posthoc^dCl2dCl2posthoc * exp(nCl2))
 
                  fixef(tvV(freeze) = c(, 1, ))
 
                  fixef(tvV2(freeze) = c(, 1, ))
 
                  fixef(tvCl(freeze) = c(, 1, ))
 
                  fixef(tvCl2(freeze) = c(, 1, ))
 
                  fixef(dVdVposthoc(freeze) = c(, 1, ))
 
                  fixef(dVdV2posthoc(freeze) = c(, 1, ))
 
                  fixef(dVdClposthoc(freeze) = c(, 1, ))
 
                  fixef(dVdCl2posthoc(freeze) = c(, 1, ))
 
                  ranef(diag(nV, nCl, nV2, nCl2) = c(0.13664072, 0.40639426, 0.53078685, 0.41292548))
 
}
 
 
Bernd


#9 csheme

csheme

    Advanced Member

  • Members
  • PipPipPip
  • 59 posts

Posted 19 June 2019 - 07:55 PM

Apparently I do see several undefined variable warning messages?

 

test(){

 

                  cfMicro(A1, Cl / V, Cl2 / V, Cl2 / V2)

                  dosepoint(A1)

                  C = A1 / V

                  error(CEps = 0.400566)

                  observe(CObs = C * (1 + CEps))

                  stparm(V = tvV * Vposthoc^dVdVposthoc * exp(nV))

                  stparm(V2 = tvV2 * V2posthoc^dV2dV2posthoc * exp(nV2))

                  stparm(Cl = tvCl * Clposthoc^dCldClposthoc * exp(nCl))

                  stparm(Cl2 = tvCl2 * Cl2posthoc^dCl2dCl2posthoc * exp(nCl2))

                  fixef(tvV(freeze) = c(, 1, ))

                  fixef(tvV2(freeze) = c(, 1, ))

                  fixef(tvCl(freeze) = c(, 1, ))

                  fixef(tvCl2(freeze) = c(, 1, ))

                  fixef(dVdVposthoc(freeze) = c(, 1, ))

                  fixef(dVdV2posthoc(freeze) = c(, 1, ))

                  fixef(dVdClposthoc(freeze) = c(, 1, ))

                  fixef(dVdCl2posthoc(freeze) = c(, 1, ))

                  ranef(diag(nV, nCl, nV2, nCl2) = c(0.13664072, 0.40639426, 0.53078685, 0.41292548))

 

}

 

Variable 'Vposthoc' undefined

 

Variable 'V2posthoc' undefined

 

Variable 'dV2dV2posthoc' undefined

 

Variable 'Clposthoc' undefined

 

Variable 'dCldClposthoc' undefined

 

Variable 'Cl2posthoc' undefined

 

Variable 'dCl2dCl2posthoc' undefined


Edited by csheme, 19 June 2019 - 07:56 PM.


#10 smouksassi1

smouksassi1

    Advanced Member

  • Val_Members
  • PipPipPip
  • 232 posts
  • LocationMontreal

Posted 20 June 2019 - 08:38 AM

you need to define them as covariates:

facovariate(Vposthoc,Cl2posthoc)  

if you are in textual you can clean the model code

 

posthocmodelest(){

 

                  cfMicro(A1, Cl / V, Cl2 / V, Cl2 / V2)

                  dosepoint(A1)

                  C = A1 / V

                  error(CEps = 0.400566)

                  observe(CObs = C * (1 + CEps))

                  stparm(V =  Vposthoc)

                  stparm(V2 =  V2posthoc)

                  stparm(Cl =  Clposthoc)

                  stparm(Cl2 =  Cl2posthoc)

 

                  fixef(tvCldum = c(, 1, ))

 

 

                  ranef(diag(ncldum ) = c(0.00001))

 

}



#11 csheme

csheme

    Advanced Member

  • Members
  • PipPipPip
  • 59 posts

Posted 23 June 2019 - 03:38 AM

I see, do you mean to simplify the model code to:

 

posthocmodelest(){
 
 
 
                  cfMicro(A1, Cl / V, Cl2 / V, Cl2 / V2)
 
                  dosepoint(A1)
 
                  C = A1 / V
 
                  error(CEps = 0.400566)
 
                  observe(CObs = C * (1 + CEps))
 
                  stparm(V =  Vposthoc)
 
                  stparm(V2 =  V2posthoc)
 
                  stparm(Cl =  Clposthoc)
 
                  stparm(Cl2 =  Cl2posthoc)
 
                  fcovariate(Vposthoc,Cl2posthoc,Clposthoc, V2posthoc)  
 
                  fixef(tvCldum = c(, 1, ))
 
                  ranef(diag(ncldum ) = c(0.00001))
 
 
 
}
 
Thanks!

Edited by csheme, 23 June 2019 - 04:10 AM.






Also tagged with one or more of these keywords: nlme, population pk, pharmacokinetics, posthoc, modeling and simulation

2 user(s) are reading this topic

0 members, 2 guests, 0 anonymous users