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

From: Nick Holford Date: October 22, 2015 technical Source: cognigen.com
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
Quoted reply history
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.
Oct 22, 2015 Nick Holford Re: Saving solution to differential equation from previous time point and carry over to next time point
Oct 28, 2015 Alison Boeckmann Re: Saving solution to differential equation from previous time point and carry over to next time point