- Contemporary messages sorted: [ by date ] [ by thread ] [ by subject ] [ by author ] [ by messages with attachments ]

From: Alison Boeckmann <alisonboeckmann_at_fastmail.fm>

Date: Wed, 28 Oct 2015 13:01:20 -0700

Thanks Nick,

This is a good answer (other than obvious typo THEN instead of ELSE).

Examples of recursion code are given in the help item for abbreviated

code starting with "In $PK, $ERROR, and $PRED records, recursion code

may be used in an explicit manner ...". See also "Introduction to

Version VI" (file vi.pdf in the guides directory, Section I.4.1.

General, page 10).

Another point is that, even if the verbatim code could be corrected so

that it compiled without errors, the results would probably be wrong

if compartment amount A(3) depends on etas. NMTRAN does not parse

verbatim code and does not cause eta derivatives to be calculated. A

statement like

"A3(I) = A(3)

will not assign the eta derivatives to A3(I) (or to PBDREF_ or PBDREF).

If Y depends on any of these, it will not have the correct eta

derivatives. This will cause the objective function to be computed

incorrectly and NONMEM will not reach the correct minimum, even if runs

to normal completion.

Alison

On Thu, Oct 22, 2015, at 11:56 AM, Nick Holford wrote:

*> 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.
*

*>
*

--

Alison Boeckmann

alisonboeckmann_at_fastmail.fm

Received on Wed Oct 28 2015 - 16:01:20 EDT

Date: Wed, 28 Oct 2015 13:01:20 -0700

Thanks Nick,

This is a good answer (other than obvious typo THEN instead of ELSE).

Examples of recursion code are given in the help item for abbreviated

code starting with "In $PK, $ERROR, and $PRED records, recursion code

may be used in an explicit manner ...". See also "Introduction to

Version VI" (file vi.pdf in the guides directory, Section I.4.1.

General, page 10).

Another point is that, even if the verbatim code could be corrected so

that it compiled without errors, the results would probably be wrong

if compartment amount A(3) depends on etas. NMTRAN does not parse

verbatim code and does not cause eta derivatives to be calculated. A

statement like

"A3(I) = A(3)

will not assign the eta derivatives to A3(I) (or to PBDREF_ or PBDREF).

If Y depends on any of these, it will not have the correct eta

derivatives. This will cause the objective function to be computed

incorrectly and NONMEM will not reach the correct minimum, even if runs

to normal completion.

Alison

On Thu, Oct 22, 2015, at 11:56 AM, Nick Holford wrote:

--

Alison Boeckmann

alisonboeckmann_at_fastmail.fm

Received on Wed Oct 28 2015 - 16:01:20 EDT