From: "Eleveld, DJ" d.j.eleveld@anest.umcg.nl
Subject: [NMusers] Model building advice
Date: Wed, April 27, 2005 10:39 am
Hello everyone,
I am having difficulties getting a model to work with NONMEM and I hope someone can give me some advice.
During simulation one model state variable must undergo step changes of various sizes at certain events.
Between these events the same variable decays towards zero. I cant code the step changes as 'doses'
directly in the input file because the size of the step change depends on the state of other variables
in the simulation.
When I try to code these step changes in DADT() portions of $DES there are endless problems with integration.
My current best attempt uses COM variabels to force the step change but i get ERROR IN LSODI1: CODE 205
MESSAGE ISSUED FROM TABLE STEP even from simulation.
I think being able to manipulate the A() values from within $DES would help, but NONMEM does not allow this.
Another possibility would be to simulate a 'dose' to a compartment from within the $DES code but I dont
know if this is possible.
Does anyone have any advice as to how I can force step-like changes to a model state varaible in a way that
NONMEMs integration routines can handle it?
Thank you,
Doug Eleveld
Model building advice
8 messages
5 people
Latest: May 19, 2005
From: "Leonid Gibiansky" leonidg@metrumrg.com
Subject: Re: [NMusers] Model building advice
Date: Wed, April 27, 2005 11:19 am
It is hard to understand without an example what exactly you trying to achieve, but
you may be able
to code your step changes as doses, and then change the steps during the computation
using the
bioavailability parameter (that may reduce or increase the dose depending on other
variables)
Leonid
From: "Bachman, William (MYD)" bachmanw@iconus.com
Subject: RE: [NMusers] Model building advice
Date: Wed, April 27, 2005 2:52 pm
Generally, these "I got this error message" but not sharing the control stream
and sufficient data to reproduce the message (either disguised data or
simulated to protect the guilty) lead to lots of general and not very helpful
suggestions. If you can't or won't be more specific, a consultant may be the way to go.
From: "Serge Guzy" GUZY@xoma.com
Subject: RE: [NMusers] Model building advice
Date: Wed, April 27, 2005 3:51 pm
I do agree with Bill that no information is given here to help you out. Only one
suggestion may be has some value.
If you know the times at which your state variable variable undergo step changes,
you must create nodes in your integration routines, each node corresponding to the
times at which a discrete change in the state variable(s) occur. I believe that at
each node, the previous integration step allows you to know the step change of the
state variable and this will automatically generate a new initial condition for
that state variable for the next integration step.
If you do not cut your problem in pieces, then no integration routine will work
because of the gradient discontinuity caused by the step change at the node positions
Serge Guzy
President POP_PHARM
From: "Eleveld, DJ" d.j.eleveld@anest.umcg.nl
Subject: RE: [NMusers] Model building advice
Date: Thu, April 28, 2005 7:04 am
Thank you for your suggestions...
Serge, i'm not exactly sure what you mean by 'node' in the intergration
routine, do you mean event?
I tried to use the bioavalibility parameter as Leonid Gibiansky suggested
in a mail to me. I added dose events (fixed size) at the appropriate times
into the appropriate compartment and manipulate the bioavalibility to change
the size of step but this does not work. I am not allowed to change
bioavalability constants in the $DES code. Neither may I change bioavailability
in the $ERROR code. When using fixed dose sizes and and fixed bioavalibility
then all the step changes will be the same. But I need the size of the step
change to change during the integration.
To better describe what I mean by step change in state variable, essentially
what I would like to have in my $DES and $ERROR code is:
$DES
...
DADT(5)=-POTK*A(5) ; Decay bewteen twitches
...
$ERROR
CALLFL=0
...
STEP=....
A(5)=A(5)+STEP ; Produce the step change
But I cannot manipulate A(5) within the $ERROR code.
The relevant part of the control stream is: (error line at the bottom)
-------Control stream--------
$PROB Potentiation fitting
$DATA potent.da2
$INPUT ID TIME DV CFLG MDV AMT RATE CMT
$SUBROUTINES ADVAN9 TOL=3
$MODEL NCOMPARTMENTS=5
NPARAMETERS=12
COMP(CENTRAL DEFDOSE)
COMP(PERIF1 NOOFF NODOSE)
COMP(PERIF2 NOOFF NODOSE)
COMP(EFFECT NOOFF NODOSE)
COMP(POTENT NOOFF)
$PK
CALLFL=1
V1=THETA(1)*EXP(ETA(1))
V2=THETA(2)*EXP(ETA(2))
V3=THETA(3)*EXP(ETA(3))
CL=THETA(4)*EXP(ETA(4))
Q3=THETA(6)*EXP(ETA(6))
Q2=(THETA(2)*(THETA(6)/THETA(3) + THETA(5)))*EXP(ETA(5))
S1=V1
KEO=THETA(7)*EXP(ETA(7))
EC50=THETA(8)*EXP(ETA(8))
GAMM=THETA(9)*EXP(ETA(9))
POTR=THETA(10)+ETA(10) ; r has normal dist
POTK=THETA(11)*EXP(ETA(11))
SCAL=THETA(12)*EXP(ETA(12))
$DES
C1=A(1)/V1 ; Conc in V1
C2=A(2)/V2 ; Conc in V2
C3=A(3)/V3 ; Conc in V3
DADT(1)=Q2*(C2-C1)+Q3*(C3-C1)-CL*C1 ; Change in V1
DADT(2)=Q2*(C1-C2) ; Change in V2
DADT(3)=Q3*(C1-C3) ; Change in V3
DADT(4)=(C1-A(4))*KEO ; Effect compartment conc
DADT(5)=-POTK*A(5) ; Decay potentiation
$ERROR
CALLFL=0
PTMP=A(5)
CPRE=A(1)/V1*EXP(ERR(1))
PD1=A(4)**GAMM ; Sigmoidal Emax model
NMB=PD1/(PD1+(EC50**GAMM))
RPRE=SCAL*(1+A(5))*(1-NMB)+ERR(2) ; Twitch in %
IF (DV.EQ.-999) RPRE=-999+ERR(2)
Y=CFLG*CPRE+(1-CFLG)*RPRE
; *** Step change once per twitch *** ERROR ***
IF (CFLG.NE.0) A(5)=A(5)+POTR*(1-NMB)
I hope this makes more clear what I mean by 'step' change in state variable.
Does anyone have any advice as to how I can achieve this kind of effect?
Thanks very much,
Doug Eleveld
From: "Ekaterina Gibiansky" GibianskyE@guilfordpharm.com
Subject: RE: [NMusers] Model building advice
Date: Thu, April 28, 2005 9:08 am
Doug,
bioavailability approach should work, but not by inserting F in the DES
block. You may reserve a place in the COMMON BLOCK using COM variable
($ABBREV COMRES=1). In the error block you can change it (ex, COM(1)=
POTR*(1-NMB)), and in $PK block you can change F5, when certain
conditions are met (IF(...) F5 = (COM(1)). You may need to insert the
second record with the same time and with a dose, if you want to test
for condition and add the dose to compartment 5 at the same time.
Otherwise, it'll change COM(1) in the error block, but will change F at
the time of the next record. And if the condition that you set is false
in the next record, F will not be changed.
Katya
Ekaterina Gibiansky, PhD
Head, Pharmacometrics
Guilford Pharmaceuticals Inc
Phone: (410)-631-6828
Fax: (410)-631-6828
E-mail: gibianskye@guilfordpharm.com
From: "Eleveld, DJ" d.j.eleveld@anest.umcg.nl
Subject: [NMusers] Follow up: Model building advice
Date: Thu, May 19, 2005 7:01 am
Thanks everyone for the model building advice. I implemented Katya's advice and
used COM(1) for communication between $ERROR and $PK to set the appropriate bioavailibility
and added dose records at the appropriate times in the datafile. This almost doubled
the amount of records to about 6100 and as expected also increased runtimes. The code
looks clean and simulations are visually quite reasonable. But I still cant get any
estimation methods to converge. Using the FO method to start here is a brief summary
my results so far:
Using ADVAN6:
-------------
0MINIMIZATION TERMINATED
DUE TO MAX. NO. OF FUNCTION EVALUATIONS EXCEEDED
NO. OF FUNCTION EVALUATIONS USED:10024
NO. OF SIG. DIGITS UNREPORTABLE
The resulting theta values are completly unreasonable so I cant use them to try and
improve the inital theta values.
Using ADVAN9:
-------------
ERROR IN LSODI1: CODE 204
0PROGRAM TERMINATED BY OBJ
MESSAGE ISSUED FROM ESTIMATION STEP
Using ADVAN8:
-------------
Nonmem has been running for more than 48 hours now and still no results.
This is too long for a FO method? Should I assume that something has gone wrong?
Here is my control file:
------------------------
$PROB Potentiation fitting
$DATA potent.da2
$INPUT ID TIME DV CFLG MDV AMT RATE CMT
$SUBROUTINES ADVAN9 TOL=6
$ABBREVIATED COMRES=1
$MODEL NCOMPARTMENTS=5
NPARAMETERS=12
COMP(CENTRAL DEFDOSE)
COMP(PERIF1 NOOFF NODOSE)
COMP(PERIF2 NOOFF NODOSE)
COMP(EFFECT NOOFF NODOSE)
COMP(POTENT NOOFF)
$PK
V1=THETA(1)*EXP(ETA(1))
V2=THETA(2)*EXP(ETA(2))
V3=THETA(3)*EXP(ETA(3))
CL=THETA(4)*EXP(ETA(4))
Q3=THETA(6)*EXP(ETA(6))
Q2=(THETA(2)*(THETA(6)/THETA(3) + THETA(5)))*EXP(ETA(5))
S1=V1
KEO=THETA(7)*EXP(ETA(7))
EC50=THETA(8)*EXP(ETA(8))
GAMM=THETA(9)*EXP(ETA(9))
POTR=ABS(THETA(10)+ETA(10)) ; r has normal dist
POTK=THETA(11)*EXP(ETA(11))
SCAL=THETA(12)+ETA(12) ; scale has normal dist
IF (NEWIND.EQ.0) COM(1)=0
F5=POTR*(1-COM(1))
$DES
C1=A(1)/V1 ; Conc in V1
C2=A(2)/V2 ; Conc in V2
C3=A(3)/V3 ; Conc in V3
DADT(1)=Q2*(C2-C1)+Q3*(C3-C1)-CL*C1 ; Change in V1
DADT(2)=Q2*(C1-C2) ; Change in V2
DADT(3)=Q3*(C1-C3) ; Change in V3
DADT(4)=(C1-A(4))*KEO ; Effect compartment conc
DADT(5)=-POTK*A(5) ; Decay potentiation
$ERROR
DPOT=A(5) ; The degree of potentiation
IF (DPOT.LT.0) DPOT=0
CEFF=A(4)
IF (CEFF.LT.0) CEFF=0
DPD1=CEFF**GAMM ; Degree of NMB
NMB=DPD1/(DPD1+(EC50**GAMM))
COM(1)=NMB
CPRE=A(1)/V1*EXP(ERR(1)) ; Conc prediction
RPRE=SCAL*(1+DPOT)*(1-NMB)+ERR(2) ; Twitch prediction
IF (DV.EQ.-999) RPRE=-999+ERR(2) ; Missing twitch sizes
Y=CFLG*CPRE+(1-CFLG)*RPRE
$THETA (0,0.042,0.07)(0,0.041,0.08)(0,0.089,0.15)
(0,0.003,0.03)(0,0.005,1)(0,0.001,0.01)
(0.05,0.15,0.3)(1100,1500,1800)(3,4.5,5.5)
(0,0.006,0.006)(0.01,0.10,0.35)(90,100,110)
$OMEGA 0.04 0.04 0.04 0.04 0.04 0.04 0.04 0.04 0.04 0.001 0.04 2.
$SIGMA 0.2 1.
$ESTIMATION MAX=9999 SIG=6
;$SIMULATION (434, 372) (2, 3) ONLY
;$ESTIMATION MAX=9999 SIG=3 METHOD=COND NOABORT POSTHOC
;$ESTIMATION MAX=9999 NOABORT POSTHOC
$TABLE TIME V1 V2 V3 CL Q2 Q3 NOPRINT FILE=potent1.txt
$TABLE TIME KEO EC50 GAMM POTR POTK SCAL NOPRINT FILE=potent2.txt
$TABLE TIME NMB CPRE RPRE DPOT NOPRINT FILE=potent3.txt
Thanks,
Doug Eleveld
From: "Leonid Gibiansky" leonidg@metrumrg.com
Subject: Re: [NMusers] Follow up: Model building advice
Date: Thu, May 19, 2005 7:39 am
You have too many random effects. Try to restrict it to 4-5, at least initially:
CL,V,KE0,EMAX. If this would run, add new ones if needed.
But the problem may be deeper: with new doses, you introduce jumps in the solution
while gradient
methods (that are in the foundation of nonmem search algorithms) and objective
function
approximations do not like jumps. You may need to look for a more smooth
approximation of your jumps
(something like a sharp sigmoid rather than a jump in the solution) if this is
possible.
Leonid
_______________________________________________________