BookmarkSubscribeRSS Feed
x3d1m4
Fluorite | Level 6

I try to use this macro for counting outlier values in my variables. 

 

 

libname projekt "c:\";
libname projekt list;
data train;
set projekt.abt_sam_beh_train;
run;
data test_;
set train;
keep act_age;
run;

options nomprint mlogic symbolgen;
%macro outliers(input=,var=,output=);
%let Q1=;
%let Q3=;
%let varL=;
%let varH=;

%let n=%sysfunc(countw(&var));
%do i=1 %to &n;
%let val = %scan(&var,&i);
%let Q1=&Q1 &val._P25;
%let Q3=&Q3 &val._P75;
%let varL=&varL &val.L;
%let varH=&varH &val.H;
%end;

/* Calculate the quartiles and inter-quartile range using proc univariate */
proc means data=&input nway noprint;
var &var;
output out=temp P25= P75= /autoname;
run;

/* Extract the upper and lower limits into macro variables */
data temp;
set temp;
ID =1;
array varb(&n) &Q1;
array varc(&n) &Q3;
array lower(&n) &varL;
array upper(&n) &varH;
do i=1 do dim(varb);
lower(i)=varb(i)-3*(varc(i)-varb(i));
upper(i)=varc(i)+3*(varc(i)-varb(i));
end;
drop i _type_ _freq_;
run;

data temp1;
set &input=;
ID = 1;
run;

data &output;
merge tmp1 temp;
by ID;
array var(&n) &var;
array lower(&n) &varL;
array upper(&n) &varH;
do i=1 to dim(var);
if not missing(var(i)) then do;
if var(i) < lower(i) then var(i) = lower(i);
if var(i) > upper(i) then var(i) = upper(i);
end;
end;
drop &Q1 &Q3 &varH &varL ID i;
run;
%mend;
%outliers(input=test_,var=act_age,output=what_i_want);

But I get this error all the time. Have someone's a hint for this error? 

 

1                                                            System SAS                               18:24 Monday, January 18, 2021

1          ;*';*";*/;quit;run;
2          OPTIONS PAGENO=MIN;
3          %LET _CLIENTTASKLABEL='Makro liczby odstajce';
4          %LET _CLIENTPROCESSFLOWNAME='Przebieg procesu';
5          %LET _CLIENTPROJECTPATH='';
6          %LET _CLIENTPROJECTPATHHOST='ACER';
7          %LET _CLIENTPROJECTNAME='Projekt_sas.egp';
8          %LET _SASPROGRAMFILE=''
8        ! ;
9          %LET _SASPROGRAMFILEHOST='ACER';
10         
11         ODS _ALL_ CLOSE;
12         OPTIONS DEV=ACTIVEX;
13         GOPTIONS XPIXELS=0 YPIXELS=0;
14         FILENAME EGSR TEMP;
15         ODS tagsets.sasreport13(ID=EGSR) FILE=EGSR
16             STYLE=EGDefault
17             STYLESHEET=(URL="file:///s")
18             NOGTITLE
19             NOGFOOTNOTE
20             GPATH=&sasworklocation
SYMBOLGEN: Makrozmienną SASWORKLOCATION rozwinięto do postaci 
           "C:\Users\user\AppData\Roaming\SAS\EnterpriseGuide\EGTEMP\SEG-3288-4900df08\contents\SAS Temporary 
           Files\_TD14372_ACER_\Prc2/"
21             ENCODING=UTF8
22             options(rolap="on")
23         ;
NOTE: Writing TAGSETS.SASREPORT13(EGSR) Body file: EGSR
24         
25         GOPTIONS ACCESSIBLE;
26         libname projekt 
NOTE: Bibliotekę PROJEKT udało się przypisać jak następuje: 
      Mechanizm:        V9 
      Nazwa fizyczna: 
27         libname projekt list;
NOTE: Libref=   PROJEKT 
      Scope=    IOM ROOT COMP ENV%2nEngine=   V9%2nPhysical Name= a 
      zaliczeniowa\PROJEKT ZALICZENIOWY
      Nazwa pliku= 
28         data train;
29         set projekt.abt_sam_beh_train;
30         run;

NOTE: There were 52841 observations read from the data set PROJEKT.ABT_SAM_BEH_TRAIN.
NOTE: The data set WORK.TRAIN has 52841 observations and 2310 variables.
NOTE: DATA statement used (Total process time):
      real time           4.87 seconds
      cpu time            1.89 seconds
      

31         data test_;
32         set train;
33         keep act_age;
34         run;

NOTE: There were 52841 observations read from the data set WORK.TRAIN.
NOTE: The data set WORK.TEST_ has 52841 observations and 1 variables.
NOTE: DATA statement used (Total process time):
2                                                            System SAS                               18:24 Monday, January 18, 2021

      real time           4.70 seconds
      cpu time            0.32 seconds
      

35         
36         options nomprint mlogic symbolgen;
37         %macro outliers(input=,var=,output=);
38         %let Q1=;
39         %let Q3=;
40         %let varL=;
41         %let varH=;
42         
43         %let n=%sysfunc(countw(&var));
44         %do i=1 %to &n;
45         %let val = %scan(&var,&i);
46         %let Q1=&Q1 &val._P25;
47         %let Q3=&Q3 &val._P75;
48         %let varL=&varL &val.L;
49         %let varH=&varH &val.H;
50         %end;
51         
52         /* Calculate the quartiles and inter-quartile range using proc univariate */
53         proc means data=&input nway noprint;
54         var &var;
55         output out=temp P25= P75= /autoname;
56         run;
57         
58         /* Extract the upper and lower limits into macro variables */
59         data temp;
60         set temp;
61         ID =1;
62         array varb(&n) &Q1;
63         array varc(&n) &Q3;
64         array lower(&n) &varL;
65         array upper(&n) &varH;
66         do i=1 do dim(varb);
67         lower(i)=varb(i)-3*(varc(i)-varb(i));
68         upper(i)=varc(i)+3*(varc(i)-varb(i));
69         end;
70         drop i _type_ _freq_;
71         run;
72         
73         data temp1;
74         set &input=;
75         ID = 1;
76         run;
77         
78         data &output;
79         merge tmp1 temp;
80         by ID;
81         array var(&n) &var;
82         array lower(&n) &varL;
83         array upper(&n) &varH;
84         do i=1 to dim(var);
85         if not missing(var(i)) then do;
86         if var(i) < lower(i) then var(i) = lower(i);
87         if var(i) > upper(i) then var(i) = upper(i);
88         end;
3                                                            System SAS                               18:24 Monday, January 18, 2021

89         end;
90         drop &Q1 &Q3 &varH &varL ID i;
91         run;
92         %mend;
93         %outliers(input=test_,var=act_age,output=what_i_want);
MLOGIC(OUTLIERS): Początek wykonywania.
MLOGIC(OUTLIERS): Parametr INPUT ma wartość test_
MLOGIC(OUTLIERS): Parametr VAR ma wartość act_age
MLOGIC(OUTLIERS): Parametr OUTPUT ma wartość what_i_want
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to Q1)
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to Q3)
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to VARL)
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to VARH)
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to N)
SYMBOLGEN: Makrozmienną VAR rozwinięto do postaci act_age
SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
MLOGIC(OUTLIERS): Początek pętli %DO. Zmienna indeksująca I. Wartość początkowa 1. Wartość końcowa 1. Wartość BY 1. 
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to VAL)
SYMBOLGEN: Makrozmienną VAR rozwinięto do postaci act_age
SYMBOLGEN: Makrozmienną I rozwinięto do postaci 1
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to Q1)
SYMBOLGEN: Makrozmienną Q1 rozwinięto do postaci 
SYMBOLGEN: Makrozmienną VAL rozwinięto do postaci act_age
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to Q3)
SYMBOLGEN: Makrozmienną Q3 rozwinięto do postaci 
SYMBOLGEN: Makrozmienną VAL rozwinięto do postaci act_age
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to VARL)
SYMBOLGEN: Makrozmienną VARL rozwinięto do postaci 
SYMBOLGEN: Makrozmienną VAL rozwinięto do postaci act_age
MLOGIC(OUTLIERS): %LET (nazwa zmiennej to VARH)
SYMBOLGEN: Makrozmienną VARH rozwinięto do postaci 
SYMBOLGEN: Makrozmienną VAL rozwinięto do postaci act_age
MLOGIC(OUTLIERS):  %DO loop index variable I is now 2; loop will not iterate again.
SYMBOLGEN: Makrozmienną INPUT rozwinięto do postaci test_
SYMBOLGEN: Makrozmienną VAR rozwinięto do postaci act_age

NOTE: There were 52841 observations read from the data set WORK.TEST_.
NOTE: The data set WORK.TEMP has 1 observations and 4 variables.
NOTE: PROCEDURE MEANS used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
      

SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
SYMBOLGEN: Makrozmienną Q1 rozwinięto do postaci act_age_P25
SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
SYMBOLGEN: Makrozmienną Q3 rozwinięto do postaci act_age_P75
SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
SYMBOLGEN: Makrozmienną VARL rozwinięto do postaci act_ageL
SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
SYMBOLGEN: Makrozmienną VARH rozwinięto do postaci act_ageH
388: LINE and COLUMN cannot be determined.
NOTE: NOSPOOL is on. Rerunning with OPTION SPOOL might allow recovery of the LINE and COLUMN where the error has occurred.
ERROR 388-185: Expecting an arithmetic operator.
76: LINE and COLUMN cannot be determined.
NOTE: NOSPOOL is on. Rerunning with OPTION SPOOL might allow recovery of the LINE and COLUMN where the error has occurred.
ERROR 76-322: Błąd składni. Instrukcja zostanie zignorowana.

4                                                            System SAS                               18:24 Monday, January 18, 2021

NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.TEMP may be incomplete.  When this step was stopped there were 0 observations and 5 variables.
WARNING: Data set WORK.TEMP was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
      

SYMBOLGEN: Makrozmienną INPUT rozwinięto do postaci test_
22: LINE and COLUMN cannot be determined.
NOTE 242-205: NOSPOOL is on. Rerunning with OPTION SPOOL might allow recovery of the LINE and COLUMN where the error has occurred.
ERROR 22-322: Błąd składni. Oczekiwano jednej z następujących: nazwy, łańcucha w nawiasach, (, -, :, ;, CUROBS, END, INDSNAME, KEY, 
              KEYRESET, KEYS, NOBS, OPEN, POINT, _DATA_, _LAST_, _NULL_.  
200: LINE and COLUMN cannot be determined.
NOTE: NOSPOOL is on. Rerunning with OPTION SPOOL might allow recovery of the LINE and COLUMN where the error has occurred.
ERROR 200-322: The symbol is not recognized and will be ignored.
NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.TEMP1 may be incomplete.  When this step was stopped there were 0 observations and 2 variables.
WARNING: Data set WORK.TEMP1 was not replaced because this step was stopped.
NOTE: DATA statement used (Total process time):
      real time           0.00 seconds
      cpu time            0.00 seconds
      

SYMBOLGEN: Makrozmienną OUTPUT rozwinięto do postaci what_i_want
ERROR: Plik WORK.TMP1.DATA nie istnieje.
NOTE: The array var has the same name as a SAS-supplied or user-defined function.  Parentheses following this name are treated as 
      array references and not function references.
SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
SYMBOLGEN: Makrozmienną VAR rozwinięto do postaci act_age
SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
SYMBOLGEN: Makrozmienną VARL rozwinięto do postaci act_ageL
SYMBOLGEN: Makrozmienną N rozwinięto do postaci 1
SYMBOLGEN: Makrozmienną VARH rozwinięto do postaci act_ageH
SYMBOLGEN: Makrozmienną Q1 rozwinięto do postaci act_age_P25
SYMBOLGEN: Makrozmienną Q3 rozwinięto do postaci act_age_P75
SYMBOLGEN: Makrozmienną VARH rozwinięto do postaci act_ageH
SYMBOLGEN: Makrozmienną VARL rozwinięto do postaci act_ageL

WARNING: The variable ID in the DROP, KEEP, or RENAME list has never been referenced.
NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.WHAT_I_WANT may be incomplete.  When this step was stopped there were 0 observations and 3 variables.
NOTE: DATA statement used (Total process time):
      real time           0.01 seconds
      cpu time            0.01 seconds
      

MLOGIC(OUTLIERS): Koniec wykonywania.
94         
95         GOPTIONS NOACCESSIBLE;
96         %LET _CLIENTTASKLABEL=;
97         %LET _CLIENTPROCESSFLOWNAME=;
98         %LET _CLIENTPROJECTPATH=;
99         %LET _CLIENTPROJECTPATHHOST=;
100        %LET _CLIENTPROJECTNAME=;
101        %LET _SASPROGRAMFILE=;
102        %LET _SASPROGRAMFILEHOST=;
103        
5                                                            System SAS                               18:24 Monday, January 18, 2021

104        ;*';*";*/;quit;run;
105        ODS _ALL_ CLOSE;
106        
107        
108        QUIT; RUN;
109        

 

 

1 REPLY 1
FreelanceReinh
Jade | Level 19

Hello @x3d1m4,

 

There are just a few typos in the code:

  1. do i=1 do dim(varb);
  2. set &input=;
  3. merge tmp1 temp;

The code can also be simplified, e.g., you don't need to create the dummy BY variable ID=1 if you use two SET statements (instead of the MERGE statement) like this:

data &output;
if _n_=1 then set temp;
set temp1;
...

 I would also avoid using a function name (var) as an array name (see the corresponding note in the log: "The array var has the same name as a SAS-supplied or user-defined function. ..."). To guard against possible name conflicts I would use the %LOCAL statement and avoid generic dataset names like temp in a macro (remembering a case where a standard macro using that name was applied to a dataset temp containing temperature measurements ...). Also the comments need a revision (univariate? macro variables?).

sas-innovate-2024.png

Available on demand!

Missed SAS Innovate Las Vegas? Watch all the action for free! View the keynotes, general sessions and 22 breakouts on demand.

 

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.

Click image to register for webinarClick image to register for webinar

Classroom Training Available!

Select SAS Training centers are offering in-person courses. View upcoming courses for:

View all other training opportunities.

Discussion stats
  • 1 reply
  • 552 views
  • 1 like
  • 2 in conversation