Re: [NMusers] Saving solution to differential equation from previous time point and carry over to next time point

From: Nick Holford <n.holford_at_auckland.ac.nz>
Date: Fri, 23 Oct 2015 07:56:30 +1300

Tommy,

When a variable is defined in NM-TRAN it persists to all subsequent
records in the data set.
You could do something like this:

$ERROR
IF (NEWIND.LE.1) lastA3=0 ; initialize lastA3 for each subject to an
appropriate value
PBDREF_ = -PBINT*EXP(-PBRATE*TIME_) + DEACR*(1-lastA3)
IF (TIME_.NE.0.AND.EVID.NE.1) THEN
    lastA3=A(3)
THEN ; special trick is to re-assign lastA3 to itself
    lastA3=lastA3
ENDIF

I've not attempted to reproduce the logic of your code example. This is
just to illustrate the principle.

Note that if A(3) is computed with a random variable and if you compute
lastA3 in a conditional block then you need to use a special trick to
save the value. This trick is required because otherwise lastA3 will
have a value of 0 ( the default behaviour for random variables).

Nick

On 23-Oct-15 06:34, Tommy Li wrote:
> I am currently developing a nonmem model that attempt to correlate
> binary endpoint with binary endpoint from previous time point. This
> requires me to save solution to differential at a time record (for
> example TIME = 1) so that I can use that value (solution at TIME = 1)
> and perform computation at the next TIME record (TIME =2 for example).
> Essentially, I need to A(3)t=1 and A(3)t=2 at TIME=2, where A(3)
> represent integrated solution of the differential equation specified
> in the nonmem model.
>
> In my data, i have current TIME record as well as TIME_, which
> represent previous time value. In addition, I have DV and DV_, which
> represent current and previous observations. I want to calculate the
> effect (PBDREF) at current time as well as effect (PBDREF_) at
> previous time. For PBDREF_, i need value A(3) at previous time
> (A(3)Previous).
>
> example data structure:
> ID,DV,DV_,TIME,TIME_
> 1,0,0,.,1,0
> 1,0,0,0,2,1
> 1,0,0,0,4,2
> 1,0,0,0,8,4
> 1,0,0,0,16,8
> 1,0,0,0,24,16
> 1,0,0,0,36,24
>
> I came up with the following code but I am not sure if it will work:
> I have a PK model and an effect compartment described by DADT(3)
>
> $DES
> DADT(1) = -KA * A(1)
> DADT(2) = KA * A(1) - CL/V * A(2)
> CP = A(2)/V
> DADT(3) = KIN * (1 - (CP/(IC50+CP))) - KOUT * A(3)
>
> $ERROR
> "USE SIZES, ONLY: NO
> "REAL (KIND=DPSIZE) :: A3(NO)
> "INTEGER (KING=ISIZE) :: I
>
> ..... ## Theta declarations
>
> "IF (NEWIND.NE.2) THEN
> "I = 0
> "ENDIF
> "IF (TIME_.EQ.0.AND.EVID.NE.1) THEN
> "I = I+1
> "A3(I)=A(3)
> "PBDREF = -PBINT*EXP(-PBRATE*TIME) + DEACR*(1-A(3))
> "PBDREF_ = PBDREF
> "ELSE IF (TIME_.NE.0.AND.EVID.NE.1) THEN
> "I = I+1
> "A3(I) = A(3)
> "PBDREF = -PBINT*EXP(-PBRATE*TIME) + DEACR*(1-A(3))
> "PBDREF_ = -PBINT*EXP(-PBRATE*TIME_) + DEACR*(1-A3(I-1))
> "ENDIF
>
> .....
>
> What I want to do with the code is to save the values of A(3) in an
> array (A3). By saving the values of A(3) in order and using the
> indexing variable I, I would be able to recall previous value of A(3)
> from A3 by doing: A3(I-1). The first conditional statements is to test
> if the current time point is the first record of an individual. In
> that case, the indexing variable I is reset. Second conditional
> statement is to test the case where previous time is 0 and there is no
> observation at time 0. In that case, PBDREF and PBDREF_ will be both
> be current value. In the last conditional statement, PBDREF is
> assigned value based on A(3)'s current value while PBDREF is assigned
> value based on A(3)'s previous value, extracted from the array A3.
>
> What I am not sure is whether the declared variable (A3 and I) will
> stick around, since it appears to me that these two variable is
> redeclared as nonmem move through data record. In that case,
> redeclaring those variable would likely erase the values stored in
> them. I tried to only declaring (A3 and I) when nonmem is at the first
> record of an individual by moving the declaration under the first
> conditional statement. However, fortran doesn't seem to allow that.
> This there a way to declare persistent variables such that my code
> would work as intended?
>
> Thank you
> Tommy Li

--
Nick Holford, Professor Clinical Pharmacology
Dept Pharmacology & Clinical Pharmacology, Bldg 503 Room 302A
University of Auckland,85 Park Rd,Private Bag 92019,Auckland,New Zealand
office:+64(9)923-6730 mobile:NZ+64(21)46 23 53
email: n.holford_at_auckland.ac.nz
http://holford.fmhs.auckland.ac.nz/

Holford SD, Allegaert K, Anderson BJ, Kukanich B, Sousa AB, Steinman A, Pypendop, B., Mehvar, R., Giorgi, M., Holford,N.H.G. Parent-metabolite pharmacokinetic models - tests of assumptions and predictions. Journal of Pharmacology & Clinical Toxicology. 2014;2(2):1023-34.
Holford N. Clinical pharmacology = disease progression + drug action. Br J Clin Pharmacol. 2015;79(1):18-27.

Received on Thu Oct 22 2015 - 14:56:30 EDT

This archive was generated by hypermail 2.3.0 : Fri Sep 27 2019 - 16:46:44 EDT