简体   繁体   中英

SAS Macro: How can I record proc means output in one dataset?

[I have this piece of code. However, the Macro in proc univariate generate too many separate dataset due to loop t from 1 to 310. How can I modify this code to include all proc univariate output into one dataset and then modify the rest of the code for a more efficient run?]


%let L=10; %* 10th percentile *;
%let H=%eval(100 - &L); %* 90th percentile*;
%let wlo=V1&L V2&L V3&L ;
%let whi=V1&H V2&H V3&H ;
%let wval=wV1 wV2 wV3 ;
%let val=V1 V2 V3;

%macro winsorise();

%do v=1 %to %sysfunc(countw(&val));
%do t=1 %to 310;
proc univariate data=regressors noprint;
var &val;
output out=_winsor&t._V&v pctlpts=&H &L
prtlpre=&val&t._V&v;
where time_count<=&t;run;
%end;
data regressors (drop=__:);
set regressors;
if _n_=1 then set _winsor&t._V&v;
&wval&t._V&v=min(max(&val&t._V&v,&wlo&t._V&v),&whi&t._V&v);
run;
%end;
%mend;

Thank you.

Presume you have data time_count , x1 , x2 , x3 with samples at every 0.5 time unit.

data regressors;
  call streaminit(123);
  do time_count = 0 to 310 by .5;
    x1 = 2 ** (sin(time_count/6) * log(time_count+1));
    x2 = log2 (time_count+1) + log(time_count/10+.1);
    x3 = rand('normal', 
    output;
  end;
  format x: 7.3;
run;

Stack the data into groups based on integer time_count levels. The stack is constructed from a full outer join with a less than ( <= ) criteria. Each group is identified by the top time_count in the group.

proc sql;
  create table stack as
  select 
    a.time_count
  , a.x1
  , a.x2
  , a.x3
  , b.time_count as time_count_group            /* save top value in group variable */
  from      regressors as a
  full join regressors as b                     /* self full join */
  on a.time_count <= b.time_count               /* triangular criteria */
  where
  int(b.time_count)=b.time_count                /* select integer top values */
  order by
  b.time_count,  a.time_count
  ;
quit;

Now compute ALL your stats for ALL your variables for ALL your groups in one go. No macro, no muss, no fuss.

proc univariate data=stack noprint;
 by time_count_group;
 var x1 x2 x3;
 output out=_winsor n=group_size pctlpts=90 10 pctlpre=x1_ x2_ x3_; 
run;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM