Hi. I guest you are looking for something like this: %macro outliers(input=, vars=, output= ); %let nvars=%sysfunc(countw(&vars));
%do i= 1 %to &nvars;
%let val = %scan(&vars,&i);
/* Calculate the quartiles and inter-quartile range using proc univariate */
proc univariate data=&input noprint;
var &vars;
* get qr, q1, q3 for each vars;
output out=&output QRANGE= %do j=1 %to &nvars; IQR_&j %end;
Q1= %do j=1 %to &nvars; First_Qtl_&j %end;
Q3= %do j=1 %to &nvars; Third_Qtl_&j %end;
;
run;
/* Extract the upper and lower limits into macro variables */
data _null_;
set &output;
* get lower/upper limits for each vars;
%do j=1 %to &nvars;
call symput("Llimit_&j",put(First_Qtl_&j+1.5*IQR_&j,best.));
call symput("Ulimit_&j",put(Third_Qtl_&j+1.5*IQR_&j,best.));
%end;
run;
/* Final dataset excluding outliers*/
data &output;
set &input;
* adjust limits for each vars;
%do j=1 %to &nvars;
%let var=%scan(&vars,&j,%str( ));
%put Var=&var Llimit=&&Llimit_&j Ulimit=&&Ulimit_&j;
if &var < &&Llimit_&j then &var = &&Llimit_&j;
if &var > &&Ulimit_&j then &var = &&Ulimit_&j;
%end;
run;
%end; * get rid of temporaries; proc datasets lib=work nolist; delete _:; quit;
%mend;
%outliers(Input=abcd, Vars = a b, output= test); Hope it helps. Daniel Santos @ www.cgd.pt
... View more