Can also say that a variable is normally distributed when at least 95% of the observations fall in the range: (average - 2*stddev) ,(average + 2*stddev) So you can write: %macro normality_test(lib, ds, var); data &lib..&ds.;set &lib..&ds.; sum_&var.+&var.; run; data &lib..&ds.;set &lib..&ds.; by sum_&var.; if last.sum_&var. then do; call symputx('nobs',_n_); call symputx('mean',sum_&var./symget('nobs')); end; run; data &lib..&ds.;set &lib..&ds.; x1=(&var.-&mean.)**2; x2=&var.-abs(&mean.); x3=abs(x2); run; data &lib..&ds.;set &lib..&ds.; sum_x1+x1; sum_x2+x2; sum_x3+x3; run; data &lib..&ds.;set &lib..&ds.; by sum_&var.; if last.sum_&var. then do; call symputx('var',sum_x1/(&nobs.-1)); call symputx('std',sqrt(sum_x1/(&nobs.-1))); call symputx('CV',(symget('std')/&mean.)*100); call symputx('MAD',sum_x3/&nobs.); call symputx('minus2ds', &mean. - (2*symget('std'))); call symputx('plus2ds', &mean. + (2*symget('std'))); end; run; data &lib..&ds.;set &lib..&ds.; if &minus2ds. le x le &plus2ds. then check=1;else check=0; if check eq 1 then sum_check+1; call symputx('pct', put((sum_check/&nobs.)*100,8.)); run; data _null_; if &pct. ge 95 then put '--------------->>>>> The variable is normally distribuited'; else put '--------------->>>>> The variable is NOT normally distribuited'; run; %put &pct.; %mend normality_test; And example then call the macro: %normality_test(work,test,x);
... View more