/**********************************************************************/ data sample (keep=id time conc weight) parms (keep=time conc cmax tmax rename=(time=lasttime conc=lastconc)); infile cards eof=out; retain cmax tmax time conc; input id time conc weight; output sample; if conc>cmax then do; cmax=conc; tmax=time; end; return; out: output parms; cards; 1 0 0 0 1 0.5 0 0 1 1 1.15 0 1 1.5 1.98 0 1 2 2.82 0 1 8 0.54 1 run; data sample; set sample; if _n_=1 then set parms; run; proc print; run; /**********************************************************************/ proc model data=compart; endogenous conc; exogenous time; parms a1 95.0 a2 120.0 theta1 1.5 theta2 0.12; conc=(a1*exp(-theta1*time))+(a2*exp(-theta2*time)); fit conc start=(a1 90 95 100 a2 110 120 130 theta1 1 1.5 2 theta2 .10 .12 .14); run; quit; /**********************************************************************/ /* Implement parameter BOUNDS using penalty functions */ data nl1ka; input patient time conc @@; dose=51500; wt=1; cards; 2 .5 6.68 2 1 7.5 2 2 6.64 2 4 6.16 2 8 5.23 2 12 4.24 2 18 3.52 2 24 2.59 2 36 1.26 2 48 .77 2 60 .45 2 72 .21 ; proc model data=nl1ka ; endogenous conc; exogenous time; /* Define regression function */ conc=a*exp(-k*time)-a*exp(-ka*time); /* Deny infeasible set so we don't step out */ if a le 0 or ka le 0 or ka ge 30 or k le 0 then stop; /* Add penalty functions to deflect */ /* search from boundary */ penalty= p1 / (a) /* a>0 */ + p2 / (ka) /* ka>0 */ + p3 / (30-ka) /* ka<30 */ + p4 / (k) ; /* k>0 */ resid.conc=sqrt(resid.conc ** 2 + scale * penalty ); /* Set initial parameter guess */ parms a 5 ka 25 k .01; /* Set initial penalty weights */ control p1 1 p2 1 p3 1 p4 1 scale 1e-5; /* Get initial estimates and print results at */ /* each iteration */ fit conc / method=gauss iter=100 itprint; run; /**********************************************************************/