Hi All,
I have below 3 inputs, one is data "Have" and two values "value1" and "Value2". I want to arrive at "final data want" (as described below) such that sum product of col2 and col3 equals a constant by changing value1 and keeping value2 same.
data have ;
infile cards ;
input col1;
cards;
1
2
3
4
5
6
7
;
run;
value1 = -4.56266639
value2 = 0.28179071
I want to calculate col2 as value1 + (value2*col1)
and col3 as EXP(col2)/(1+EXP(col2)) such that sum product of col2 and col3 equals 0.036 by changing the value1.
Final data want:
col1 | col2 | col3 |
1 | -4.28088 | 0.013642 |
2 | -3.99908 | 0.018002 |
3 | -3.71729 | 0.023723 |
4 | -3.4355 | 0.031204 |
5 | -3.15371 | 0.040945 |
6 | -2.87192 | 0.053559 |
7 | -2.59013 | 0.069776 |
Here's one way to do it:
%let value1 = -4.56266639;
%let value2 = 0.28179071;
proc optmodel;
set OBS;
num col1 {OBS};
read data have into OBS=[_N_] col1;
var value1;
num value2 = &value2;
impvar col2 {i in OBS} = value1 + value2 * col1[i];
impvar col3 {i in OBS} = EXP(col2[i]) / (1 + EXP(col2[i]));
con SumProduct:
sum {i in OBS} col2[i] * col3[i] = 0.036;
/* fix value1 = &value1;*/
solve noobj;
print value1;
print col1 col2 col3;
create data want(drop=i) from [i] col1 col2 col3;
quit;
On my machine, I get:
value1 |
---|
-1.2786 |
[1] | col1 | col2 | col3 |
---|---|---|---|
1 | 1 | -0.99685 | 0.26956 |
2 | 2 | -0.71506 | 0.32848 |
3 | 3 | -0.43327 | 0.39335 |
4 | 4 | -0.15147 | 0.46220 |
5 | 5 | 0.13032 | 0.53253 |
6 | 6 | 0.41211 | 0.60159 |
7 | 7 | 0.69390 | 0.66683 |
To recover the values you showed, you can uncomment the FIX statement to force the solver to return that specific solution:
value1 |
---|
-4.5627 |
[1] | col1 | col2 | col3 |
---|---|---|---|
1 | 1 | -4.2809 | 0.013642 |
2 | 2 | -3.9991 | 0.018002 |
3 | 3 | -3.7173 | 0.023723 |
4 | 4 | -3.4355 | 0.031204 |
5 | 5 | -3.1537 | 0.040945 |
6 | 6 | -2.8719 | 0.053559 |
7 | 7 | -2.5901 | 0.069776 |
But that solution does not satisfy the equality constraint because the resulting SumProduct is -0.789 instead of 0.036.
It turns out that value1 = -1.2786 is the unique feasible solution. Here is a portion of the plot of SumProduct as a function of value1, with a horizontal reference line at 0.036:
You can initialize the solver at &value1 by changing the VAR statement:
var value1 init &value1;
But initial values to the left of the minimum at about value1 = -2.6 are likely to lead the solver astray.
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.
Learn how to run multiple linear regression models with and without interactions, presented by SAS user Alex Chaplin.
Find more tutorials on the SAS Users YouTube channel.