Pyrite | Level 9

## IML/STORE, why one stored and the other did not

Trying to STORE Functions inside Proc IML. Somehow get confused. One stored and the other did not.

Anyone can run the two codes, find the tricky thing?! Thanks,

My Run, the first code says store. The second did not (code and log are below).

``````proc iml;
/* Simple moving average of k data values.
First k-1 values are assigned the mean of all previous values.
Inputs:     y     column vector of length N >= k
k     number of data points to use to construct each average
*/
start MA(y, k);
MA = j(nrow(y), 1, .);
do i = 1 to nrow(y);
idx = max(1,(i-k+1)):i;   /* rolling window of data points */
MA[i] = mean( y[idx] );   /* compute average */
end;
return ( MA );
finish;

/* Weighted moving average of k data values.
First k-1 values are assigned the weighted mean of all preceding values.
Inputs:     y     column vector of length N >= k
wt    column vector of weights. w[k] is weight for most recent
data; wt[1] is for most distant data value.  The function
internally standardizes the weights so that sum(wt)=1.
Example call: WMA  = WMA(y, 1:5);
*/
start WMA(y, wt);
w = colvec(wt) / sum(wt);       /* standardize weights so that sum(w)=1 */
k = nrow(w);
MA = j(nrow(y), 1, .);
/* handle first k values separately */
do i = 1 to k-1;
wIdx = k-i+1:k;                 /* index for previous i weights */
tIdx = 1:i;                     /* index for previous i data values */
MA[i] = sum(wt[wIdx]#y[tIdx]) / sum(wt[wIdx]);  /* weighted average */
end;
/* main computation: average of current and previous k-1 data values */
do i = k to nrow(y);
idx = (i-k+1):i;               /* rolling window of k data points */
MA[i] = sum( w#y[idx] );       /* weighted sum of k data values */
end;
return ( MA );
finish;

/* Exponentially weighted moving average (EWMA) with smoothing parameter alpha.
REF: http://www.sascommunity.org/sugi/SUGI90/Sugi-90-76%20Brocklebank.pdf
https://en.wikipedia.org/wiki/Exponential_smoothing
Inputs:      y     column vector of length N
alpha scalar value 0 < alpha < 1
*/
start EWMA(y, alpha);
MA = j(nrow(y), 1, .);
MA[1] = y[1];              /* initialize first value of smoother */
do i = 2 to nrow(y);
MA[i] = alpha*y[i] + (1-alpha)*MA[i-1];
end;
return ( MA );
finish;

/* read time series data */
use Sashelp.Air;
read all var "date" into t;
read all var "air" into y;
close;
MA   = MA(y, 5);           /* moving average, k=5 */
WMA  = WMA(y, 1:5);        /* weighted moving average */
EWMA = EWMA(y, 0.3);       /* exponentially WMA, alpha=0.3 */

create _air_out var{t y MA WMA EWMA};  append;  close _air_out;
store MA WMA EWMA;			/* store function*/

run;quit;``````
``````proc iml;
start reverse1D(revx, A);
len=max(dimension(A));
ind=len:1;
revx=A[ind];
finish;

start reverse2D(revx, B);
dim=dimension(B);
dim1=dim[1]; dim2=dim[2];
rowind=dim1:1;
colind=dim2:1;
revx=B[rowind, colind];
finish;
A={1 2 3 4 5 6 7 8 9 . . .};
B={1 2 3 4, 8 7 6 5};
run reverse1D(revA,A);
run reverse2D(revB,B);
print revA revB;

store reverse1D reverse2D; /*why complains and fails!!?*/
run;quit;``````
``````314  proc iml;
315      start reverse1D(revx, A);
316          len=max(dimension(A));
317          ind=len:1;
318          revx=A[ind];
319      finish;
NOTE: Module REVERSE1D defined.
320
321      start reverse2D(revx, B);
322          dim=dimension(B);
323          dim1=dim[1];
323!                      dim2=dim[2];
324          rowind=dim1:1;
325          colind=dim2:1;
326          revx=B[rowind, colind];
327      finish;
NOTE: Module REVERSE2D defined.
328      A={1 2 3 4 5 6 7 8 9 . . .};
329      B={1 2 3 4, 8 7 6 5};
330      run reverse1D(revA,A);
331      run reverse2D(revB,B);
332      print revA revB;
333
334      store reverse1D reverse2D;
NOTE: Opening storage library WORK.IMLSTOR
ERROR: Matrix reverse1D has not been set to a value.
334!                                /*why complains and fails!!?*/
335  run;
NOTE: Module MAIN is undefined in IML; cannot be RUN.
335!     quit;
NOTE: Exiting IML.
NOTE: Storage library WORK.IMLSTOR closed.
NOTE: PROCEDURE IML used (Total process time):
real time           0.03 seconds
cpu time            0.03 seconds

``````

1 ACCEPTED SOLUTION

Accepted Solutions
Pyrite | Level 9

## Re: IML/STORE, why one stored and the other did not

SRY to bother. Finally get the diff. between Function and Module.

2 REPLIES 2
Pyrite | Level 9

## Re: IML/STORE, why one stored and the other did not

SRY to bother. Finally get the diff. between Function and Module.

SAS Super FREQ

## Re: IML/STORE, why one stored and the other did not

Here is a link to the documentation of the STORE statement. The correct syntax for storing a module is

``store module=(MA WMA EWMA);``
From The DO Loop