Obsidian | Level 7

## error in calling optimization subroutine nlpdd()

I defined my own function named "loglik" to compute loglikelihood of State Space Model, and then call optimization subroutine "nlpdd()" to maximize my target function "loglik". The IML codes are following

``````proc iml;
m_p=0.002;sp=0.02;/*pars in the measurement eq.1*/
m_v1=0.05;m_v2=0.028;sv=0.04;/*pars in the measurement eq.2*/
beta=0.95;sq=0.03;a=0.85;/*pars in Transition*/
n=150;/*length of time series */
/*simulating state model*/
l=j(n+50,1,0);r=l;
do i=2 to nrow(l);
l[i]=0.85*l[i-1]+rannor(3432);
r[i]=0.95*r[i-1]+0.03*rannor(45345);
end;
l=l[51:n+50];r=r[51:n+50];I=exp(r);
/*generate observation Y=(Dp,V)*/
Dp=0.002*I+0.02*sqrt(I)#randfun(n,"norm");
v=0.05*I+0.028*L+0.04*sqrt(I)#randfun(n,"norm");

/*estimate the model using EKF */
/*build the loglik function for linearized DP SSM */
start loglik(mp,sp,beta,sq) global(dp,n);/*'m' stand for 'mean' and 's' for 'sigma'*/
alp_f=j(n,1,0);sig_f=j(n,1,0);
v=j(n,1,0);F=j(n,1,0);
alp_f[1]=0;sig_f[1]=sq/(1-beta);
v[1]=dp[1]-mp*exp(alp_f[1]);
do i=2 to n;
F[i-1]=exp(2*alp_f[i-1])*sig_f[i-1]+sp##2*exp(alp_f[i-1]);
K=beta*sig_f[i-1]*exp(alp_f[i-1])/F[i-1];
L=beta-K*exp(alp_f[i-1]);
sig_f[i]=beta*sig_f[i-1]*L+sq**2;
alp_f[i]=beta*alp_f[i-1]+K*v[i-1];
v[i]=dp[i]-mp*exp(alp_f[i]);
end;
F[n]=exp(2*alp_f[n])*sig_f[n]+sp##2*exp(alp_f[n]);
loglik=-0.5*sum(log(F)+v##2/F);
return(loglik);
finish;
x0={0.1 0.1 0.1 0.1};
call nlpdd(xr,xc,"loglik",x0);``````

Run the code, error message pops up in Log window as following.

``````ERROR: Too many arguments for function LOGLIK.
ERROR: NLPDD call: Error in argument module FUN.
ERROR: (execution) Unknown or error operation executed.
operation : NLPDD at line 1009 column 1
operands  : *LIT1067, x0
*LIT1067      1 row       1 col     (character, size 6)
loglik
x0      1 row       4 cols    (numeric)

0.1       0.1       0.1       0.1

statement : CALL at line 1009 column 1``````

`Pleas tell me how to correct the error. `

1 ACCEPTED SOLUTION

Accepted Solutions
SAS Super FREQ

## Re: error in calling optimization subroutine nlpdd()

The objective function in an optimization must take ONE parameter, although the parameter can be a vector. I see that you defined x0 to be a four-element vector, so I assume you want pass in a four-element vector, like this:

``````start loglik(parms) global(dp,n);
mp=parms[1]; sp=parms[2]; beta=parms[3]; sq=parms[4];
...
finish;``````

1. If any of these parameters represent variance or standard deviation, be sure to define bounds so that the parameters are positive. For example, if the 2nd and 4th parameters must be positive, you could define

``````blc = {. 0 . 0,  /* lower bounds */
. . . .}; /* upper bounds */
call nlpdd(xr,xc,"loglik",x0) blc=blc;``````

2. Before you try to optimize, you should look at the "Ten tips before you run an optimization."

2 REPLIES 2
Super User

## Re: error in calling optimization subroutine nlpdd()

Better pose it at IML forum and calling @Rick_SAS

SAS Super FREQ

## Re: error in calling optimization subroutine nlpdd()

The objective function in an optimization must take ONE parameter, although the parameter can be a vector. I see that you defined x0 to be a four-element vector, so I assume you want pass in a four-element vector, like this:

``````start loglik(parms) global(dp,n);
mp=parms[1]; sp=parms[2]; beta=parms[3]; sq=parms[4];
...
finish;``````

1. If any of these parameters represent variance or standard deviation, be sure to define bounds so that the parameters are positive. For example, if the 2nd and 4th parameters must be positive, you could define

``````blc = {. 0 . 0,  /* lower bounds */
. . . .}; /* upper bounds */
call nlpdd(xr,xc,"loglik",x0) blc=blc;``````

2. Before you try to optimize, you should look at the "Ten tips before you run an optimization."

From The DO Loop