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.
Available on demand!
Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.
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.