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.
April 27 – 30 | Gaylord Texan | Grapevine, Texas
Walk in ready to learn. Walk out ready to deliver. This is the data and AI conference you can't afford to miss.
Register now and lock in 2025 pricing—just $495!