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 
_______________________________________________________

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
_______________________________________________________