You're welcome.
I think the BOUNDS statement is more suitable for constraints in the form of inequalities about the parameters. Given that all these numbers are non-integers, an exact equality such as d+a=value would be a risky requirement anyway. (Note that, e.g., 0.1+0.2 ne 0.3 in Windows SAS due to rounding errors in the binary system.) Also, the BOUNDS statement, unlike the PARAMETERS statement, does not allow for varying values coming from a dataset. There is a different procedure, PROC HPNLMOD, which offers a RESTRICT statement where you could specify your linear constraint. But I have never used PROC HPNLMOD before today, so let's stay with PROC NLIN.
In PROC NLIN it's probably better to implement the constraint d+a=value in the model equation. You have two options for that: Either replace d with value-a, or replace a with value-d. Let's follow the first approach, i.e., eliminate parameter d in the model equation and introduce value as a new variable (not parameter) in the input dataset participant_data.
Here is the example from my earlier post, with the new constraint implemented. Changes are highlighted in blue.
/* Create test data for demonstration */
data temp;
input subject a b c value; /* parameter d has been eliminated by the constraint d+a=value */
cards;
1 8 2 0.2 9
2 7 1 0.3 6
;
proc transpose data=temp(drop=value) out=init_params(rename=(col1=estimate)) name=parameter;
by subject;
run;
data participant_data(drop=a--c);
set temp;
do time=1 to 5;
response=a*exp(time/b) + c*time + value - a + rannor(1);
output;
end;
run;
/* Use BY-group processing and the PDATA= option in PROC NLIN */
proc nlin data = participant_data g4 plots = fit maxiter = 50 outest = params_out;
by subject;
parameters / pdata=init_params;
model response = a*exp(time/b) + c*time + value - a;
run;
As you can see in dataset participant_data, variable value is a subject-dependent constant over time. Parameters a, b, c are estimated, starting with (unchanged) subject-specific initial values from dataset init_params, as before. For each subject, you could use the estimate for parameter a computed by PROC NLIN and the known value of variable value to compute d = value - a, if needed:
data est(drop=_:);
set params_out;
where _type_='FINAL';
run;
data values;
set participant_data(keep=subject value);
by subject;
if first.subject;
run;
data want;
merge values est;
by subject;
d=value-a;
run;
Obviously, the estimates will satisfy the constraint a+d = value, possibly up to tiny rounding differences like 1E-16 as in this example:
138 data _null_;
139 d=0.9-0.3;
140 if 0.3+d ne 0.9 then put 'Surprised?';
141 delta=0.3+d-0.9;
142 put delta=;
143 run;
Surprised?
delta=1.110223E-16
... View more