Hi
I am trying to optimize the following code. It tries to find the values of and AR(2) given an initial error variance and a convergence variance.
I have been able to set the problem in Excel Solver and the solution converges. When I try to solve it in SAS I am getting two errors:
Either it doesnt compute anything and give me values of the objective function with the same initial parameters that are larger than if I just call the function with the same values, or it gives me ERROR: Overflow error in *`.
I have noticed that the value of the gradient is very large. What puzzles me is why Solver using a gradient search algorithm would be able and SAS IML wont. I have use several routines with no success.
Below is the code I am using
Thanks
proc iml; free;
h=10; /*maximum projection horizon*/
W=j(h,h,0); /*Create starting covariance matrix*/
F=j(h,h,0); /*Create parameter matrix*/
int=j(h,h,0);
year=7; /*Create vector with variance convergence*/
var_y=1.7935990244;
fc_cov=j(h,h,0); /*Create covariance matrix*/
lowIdx = do(h+1, (h*h)-1, h+1); /*Index for lower diagonal*/
F[lowIdx]=1;
weight=j(h,1,0);
weight[1:(h-year)]=1;
/*map variance matrix W and paramter matrix F*/
W[1,1]=0.77;
start minsqre(param) global(h, W, F, int, var_y, fc_cov, weight);
F[1,1]=param[1];
F[1,2]=param[2];
/*Project forecast error variance*/
do j=0 to (h-1);
int=(F**j)*W*(t(F**j));
fc_cov=fc_cov+int;
end;
y_var=diag(j(h,1,var_y));
target=sum(diag(weight)#((fc_cov-y_var)##2));
return(target);
finish minsqre;
theta={0.1 0.1};
opt=j(1,11,.); opt[1]=0; opt[2]=5;
cons={ .-1 . .,
. 1 . .,
1 1 -1 1,
-1 1 -1 1 };
/*check4=minsqre(theta);*/
/*print check4;*/
call nlpqn(rc,thetares,"minsqre",theta,opt);
quit;
So let me see if I undestand your problem. You are MINIMIZING a constrained problem on the triangular region formed by
-1 <= p2 <= 1
p1 + p2 <= 1
-p1 + p2 <= 1
I don't understand what your objective function is computing, but I'm guessing that you have a mistake there. For example, do you really intend for the fc_cov matrix to persist across calls? It looks like you are using that matrix to accumulate some weighted matrix products. If so, you probably want to zero out the fc_cov matrix at the beginning of each call.
If I add the line
fc_cov=j(h,h,0);
at the top of the objective function, the NLP routine computes a minimum near (0.9, -0.2) for the initial conditions you specified.
There might not a unique solution for this problem, since other initial conditions seem to converge to other local minima.
So let me see if I undestand your problem. You are MINIMIZING a constrained problem on the triangular region formed by
-1 <= p2 <= 1
p1 + p2 <= 1
-p1 + p2 <= 1
I don't understand what your objective function is computing, but I'm guessing that you have a mistake there. For example, do you really intend for the fc_cov matrix to persist across calls? It looks like you are using that matrix to accumulate some weighted matrix products. If so, you probably want to zero out the fc_cov matrix at the beginning of each call.
If I add the line
fc_cov=j(h,h,0);
at the top of the objective function, the NLP routine computes a minimum near (0.9, -0.2) for the initial conditions you specified.
There might not a unique solution for this problem, since other initial conditions seem to converge to other local minima.
Hi Rick,
That was the problem. I thought that for each functoin call the function would call again the global as it was proviously defined! Once I have reset to value of the storing matrices it all works!
Thanks four your help!
Jorge
SAS Innovate 2025 is scheduled for May 6-9 in Orlando, FL. Sign up to be first to learn about the agenda and registration!
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.