/* superposition */ /* requires each dose on file */ /* loop until all rows processed (nn) */ /* if first.subject, must have loading dose - Dose[0] */ /* if dose record, count dose and time (mm) , put into array */ /* if conc record, loop j=0 to mm, input dose and time from array */ void nlme_one_comp_first (longint *nrow, double *Resp, double *inmat) { longint i, j, nn = *nrow, mm = 0; double v, cl, *tl = Calloc(nn, double), *ds = Calloc(nn, double), *Subject, *Time, *Dose, *V, *Cl, sl = DOUBLE_EPS; /* sl is last subject number, usually */ /* an integer but passed as double. */ /* It is started at an unlikely value. */ Subject = inmat; Time = inmat + nn; Dose = inmat + 2 * nn; V = inmat + 3 * nn; Cl = inmat + 4 * nn; for(i = nn; i--; Resp++, Subject++, Time++, Dose++, V++, Cl++) { v = *V; cl = *Cl; *Resp = 0; if (*Subject != sl) { /* new Subject */ if (is_na_DOUBLE(Dose)) { PROBLEM "First observation on an individual must have a dose" RECOVER(NULL_ENTRY); } sl = *Subject; mm = 0; tl[mm] = *Time; ds[mm] = *Dose; } else { /* same Subject */ if (!is_na_DOUBLE(Dose)) { /* Dose measurement */ mm++; tl[mm] = *Time; ds[mm] = *Dose; } else { /* Concentration measurement */ for(j = 0; j <= mm; j++) { *Resp += ds[j] * exp(-cl * (*Time - tl[j]) / v) / v; } } } } Free(ds); Free(tl); }