BookmarkSubscribeRSS Feed
hellohere
Pyrite | Level 9

Inside PROC IML, constants like pi need be self-defined(or am I right? at least tried, complains).

Also like the need to save/store MACROs, the self-defined functions inside PROC IML prefer to be saved/stored

in many occasions. How to do so? Thanks, 

 

proc iml;
	pi=3.1415916;	/*need self-defined*/
	indtemp=1:100;
	ind=indtemp/100*pi;
run;quit;
5 REPLIES 5
mkeintz
PROC Star

You can use the constant function, as in:

proc iml;
    pi=constant('pi');
	indtemp=1:100;
    ind=indtemp/100*pi;
run;quit;   

 

You can also avoid naming the scalar pi, as in:

 

proc iml;
	indtemp=1:100;
    ind=indtemp/100*constant('pi');
run;quit;   

 

 

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
hellohere
Pyrite | Level 9

Thanks. This works.

 

BTW, is there any doc/weblink on list of constant? And how about to save/store function for IML?

PaigeMiller
Diamond | Level 26

@hellohere wrote:

 

BTW, is there any doc/weblink on list of constant? And how about to save/store function for IML?


Google can find the docs.

--
Paige Miller
mkeintz
PROC Star

Take a look at the SAS/IML User's Guide which has a section on Packages, which is the functionality you are probably looking for.

--------------------------
The hash OUTPUT method will overwrite a SAS data set, but not append. That can be costly. Consider voting for Add a HASH object method which would append a hash object to an existing SAS data set

Would enabling PROC SORT to simultaneously output multiple datasets be useful? Then vote for
Allow PROC SORT to output multiple datasets

--------------------------
hellohere
Pyrite | Level 9

The DOC helps huge. Still what is diff. between Function and Module?!

I tried and saved out the three Functions, and can see it in IMLSTOR.

When show-storage, log shows load of three matrices. 

When invoke, it complains... Any help?!

Awkward enough, the dataset is created with expected values. 

 

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 out;
store MA WMA EWMA;			/* store function*/
run;quit;

proc iml;
show storage;
load MA WMA;
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 */ 
 
create _air_out_x var{t y MA WMA};  append;  close out;
run;quit;
Contents of storage library = WORK.IMLSTOR

Matrices:
EWMA                             MA
WMA

Modules:




43508  proc iml;
NOTE: IML Ready
43509  show storage;
NOTE: Opening storage library WORK.IMLSTOR
43510  load MA WMA;
43511  use Sashelp.Air;
43512     read all var "date" into t;
43513     read all var "air" into y;
43514  close;
NOTE: Closing SASHELP.AIR
43515  MA   = MA(y, 5);
ERROR: Invocation of unresolved module MA.

 statement : ASSIGN at line 43515 column 1
43515!                            /* moving average, k=5 */
43516  WMA  = WMA(y, 1:5);
ERROR: Invocation of unresolved module WMA.

 statement : ASSIGN at line 43516 column 1
43516!                            /* weighted moving average */
43517
43518  create _air_out_x var{t y MA WMA};
43518!                                     append;
43518!                                              close out;
NOTE: Cannot close WORK.OUT; it is not open.
43519  run;
NOTE: Module MAIN is undefined in IML; cannot be RUN.
43519!     quit;
NOTE: Exiting IML.
NOTE: The data set WORK._AIR_OUT_X has 144 observations and 4 variables.
NOTE: Storage library WORK.IMLSTOR closed.
NOTE: The SAS System stopped processing this step because of errors.
NOTE: PROCEDURE IML used (Total process time):
      real time           0.04 seconds
      cpu time

hackathon24-white-horiz.png

2025 SAS Hackathon: There is still time!

Good news: We've extended SAS Hackathon registration until Sept. 12, so you still have time to be part of our biggest event yet – our five-year anniversary!

Register Now

How to Concatenate Values

Learn how use the CAT functions in SAS to join values from multiple variables into a single value.

Find more tutorials on the SAS Users YouTube channel.

SAS Training: Just a Click Away

 Ready to level-up your skills? Choose your own adventure.

Browse our catalog!

Discussion stats
  • 5 replies
  • 1537 views
  • 0 likes
  • 3 in conversation