BookmarkSubscribeRSS Feed
🔒 This topic is solved and locked. Need further help from the community? Please sign in and ask a new question.
Alain38
Quartz | Level 8

Hello,

 

I wrote the following code that determines the weights maximizing a ratio. These weights should be positive given the constraint on variables:

 

	var W{Assets_BY} >= 0 <= 0.1;

but many of them are actually negative (admittedly small, with order E-7). However, when I rescale them so that their sum is equal to 1, they are no longer negligible with the smaller value being equal to -0.135.

 

%let byvar = grp;
proc optmodel printlevel=0;
	set OBS;
	num grp {OBS};
	set <string> Assets;
	set <num,str> GROUPS_ASSETS;
	number MVC{GROUPS_ASSETS, Assets};

	read data Work.MVC into Assets=[Name];
	read data Work.MVC into OBS=[_N_] grp;
	read data Work.MVC nomiss into GROUPS_ASSETS=[k=grp i=Name] {j in Assets} <MVC[k,i,j]=col(j)>;

	set BYSET = setof {i in OBS} &byvar.[i];
	num by;

	set OBS_BY = {i in OBS: &byvar.[i] = by};
	set Assets_BY = setof {o in OBS_BY, <(grp[o]),a> in GROUPS_ASSETS} a;
	var W{Assets_BY} >= 0 <= 0.1;
	impvar Denom = sqrt(sum{i in Assets_BY, j in Assets_BY}W[i]*MVC[by,i,j]*W[j]);

	maximize DR =  log(sum{i in Assets_BY}W[i]*sqrt(MVC[by,i,i]) / Denom);

	num W_sol {GROUPS_ASSETS};
	do by = BYSET;
		put by=;
		solve;
		for {i in Assets_BY} W_sol[by,i] = W[i].sol;
	end;

	create data Work.Weights_MD from [&byvar i] W=W_sol;
quit;

Thank you for any advice to obtain weights that respect the lower and upper bounds,

 

Best,

 

PS: if necessary, I will provide a small working example

 

1 ACCEPTED SOLUTION

Accepted Solutions
RobPratt
SAS Super FREQ

The default feasibility tolerance is 1e-6, so 1e-7 is within that tolerance.  You can change the value by using the FEASTOL= option.

 

If you want the sum of W to be 1, it might be best to explicitly declare such a constraint.  If that doesn't suffice, please share your data.

View solution in original post

2 REPLIES 2
RobPratt
SAS Super FREQ

The default feasibility tolerance is 1e-6, so 1e-7 is within that tolerance.  You can change the value by using the FEASTOL= option.

 

If you want the sum of W to be 1, it might be best to explicitly declare such a constraint.  If that doesn't suffice, please share your data.

Alain38
Quartz | Level 8

Thank you very much for your help 🙂

 

I will try to define a lower feasibility tolerance. As for the "sum of weight" constraint, I removed it because it was much longer with it, but perhaps it will be more efficient than a lower feasibility tolerance. I will perform some tests. Thank you!

sas-innovate-white.png

Register Today!

Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9.

 

Early bird rate extended! Save $200 when you sign up by March 31.

Register now!

Discussion stats
  • 2 replies
  • 1287 views
  • 1 like
  • 2 in conversation