Date: Thu, 20 Nov 1997 10:41:00 +0100
Reply-To: "Stuerzl, Heinr.,DE,Diagnostics" <STUERZL@MSMBWMA.HOECHST.COM>
Sender: "SAS(r) Discussion" <SAS-L@UGA.CC.UGA.EDU>
From: "Stuerzl, Heinr.,DE,Diagnostics" <STUERZL@MSMBWMA.HOECHST.COM>
Subject: Tip: Macro UNISTATS (quick version)
Content-Type: text/plain; charset="iso-8859-1"
The macro I showed yesterday runs fine, but becomes slow with increasing
number of by-groups.
This is because of the resolve statements in the step of __u2, which
were unnessesarily done in each group.
So here is an improved version, which runs much quicker!
The output dataset of PROC UNIVARIATE __u1 can be transposed and labeled
in one data step with simple output statements. This avoids one PROC
SORT and both PROC TRANSPOSE and simplifies the PROC DATASETS.
To test the improvement use the following example in both versions,
where variable i is used as by-variable. (on my 166MHz Pentium, NT 4.0,
SAS 6.12 it's 0.4 sec instead of 45 sec)
Heinrich Stuerzl
Data Management & Biostatistics
Behring Diagnostics GmbH, Marburg, Germany
eMail:stuerzl@msmbwma.hoechst.com
_________
Example:
data temp;
do i=1 to 1000;
gruppe=mod(i,2);
x=normal(-1);
y=normal(-1);
z=normal(-1);
if mod(i, 100)=0 then x=.;
output;
end;
run;
%unistats (data=work.temp, vars=x y z, by=i, out=work.stat,
stats=n min max median mean);
____________________________
%macro unistats (data=&syslast, vars=, out=work.stat1, by=, print=Y,
stats=N MEDIAN MEAN STD CV MIN MAX) /
des="Univariate Statistics";
%local i j stat hvar stdstats nstats lib mem h1 h2
N NOBS NMISS SUM MEDIAN MEAN VAR STD CV MIN MAX Q1 Q3 P1 P5
P10 P90 P95 P99
NORMAL PROBN T PROBT MSIGN PROBM SIGNRANK PROBS
STDMEAN USS CSS SKEWNESS KURTOSIS SUMWGT RANGE QRANGE MODE ;
%* Unterstützte Statistiken (werden gelabelt);
%let stdstats = N NOBS NMISS SUM MEDIAN MEAN VAR STD CV MIN MAX Q1
Q3 P1 P5 P10 P90 P95 P99
NORMAL PROBN T PROBT MSIGN PROBM SIGNRANK PROBS
STDMEAN USS CSS SKEWNESS KURTOSIS SUMWGT RANGE
QRANGE MODE ;
%* Label Definitionen;
%let n = N ;
%let nobs = N total ;
%let nmiss = N missing ;
%let sum = Sum ;
%let median = Median ;
%let mean = Mean ;
%let var = Variance ;
%let std = Standard deviation ;
%let cv = %nrstr(CV % ) ;
%let min = Min ;
%let max = Max ;
%let q1 = Lower quartile ;
%let q3 = Upper quartile ;
%let p1 = %nrstr(Percentile 1% ) ;
%let p5 = %nrstr(Percentile 5% ) ;
%let p10 = %nrstr(Percentile 10% ) ;
%let p90 = %nrstr(Percentile 90% ) ;
%let p95 = %nrstr(Percentile 95% ) ;
%let p99 = %nrstr(Percentile 99% ) ;
%let normal = Normality ;
%let probn = Prob Norm ;
%let t = T ;
%let probt = Prob >|T| ;
%let msign = M(Sign) ;
%let probm = Prob >=|M| ;
%let signrank= Sgn Rank ;
%let probs = Prob >=|S| ;
%let stdmean = STDMEAN ;
%let uss = uncorr. SSQ ;
%let css = corr. SSQ ;
%let skewness= Skewness ;
%let kurtosis= Kurtosis ;
%let sumwgt = Sum of weights ;
%let range = Range ;
%let qrange = Q3-Q1 ;
%let mode = Mode ;
%if &data= %then %let data = &syslast;
%if &vars= %then %do;
%put ---> ACHTUNG: Keine Variable angegeben!;
%goto ende;
%end;
%if &stats= %then %let stats = N MEDIAN MEAN STD CV MIN MAX ;
%if %qscan ( &out , 2 , . ) = %then
%do ;
%let lib = WORK ;
%let mem = &out ;
%end ;
%else %do;
%let lib = %qscan ( &out , 1 , . ) ;
%let mem = %qscan ( &out , 2 , . ) ;
%end ;
%if &by ^= %then %do;
proc sort data=&data;
by &by;
run ;
%end;
proc univariate data=&data normal noprint ;
var &vars ;
output out = __u1
%let i = 1 ; %* Statistiken;
%let stat = %qscan ( &stats , &i ) ;
%do %while ( &stat ^= ) ;
&stat=
%let i = %sysfunc ( putn ( &i , z2. ) ) ;
%let j = 1 ; %* Variablen;
%let hvar = %qscan ( &vars , &j ) ;
%do %while ( &hvar ^= ) ;
%let j = %sysfunc ( putn ( &j , z3. ) ) ;
v&j._s&i.
%let j = %eval ( &j + 1 ) ;
%let hvar = %qscan ( &vars , &j ) ;
%end ;
%let nvars = %eval ( &j - 1 ) ;
%let i = %eval ( &i + 1 ) ;
%let stat = %qscan ( &stats , &i ) ;
%end ;
%let nstats = %eval ( &i - 1 ) ;
;
by &by;
run ;
%if &syserr=1 %then %goto ende;
data &out;
length vname $8;
set __u1;
keep &by vname &stats;
%do i=1 %to &nvars;
vname="%upcase(%scan(&vars, &i))";
%do j=1 %to &nstats;
%let stat=%scan(&stats, &j);
%let h1 =%sysfunc(putn(&i,z3.));
%let h2 =%sysfunc(putn(&j,z2.));
&stat=v&h1._s&h2;
%end;
output;
%end;
label vname=Name
%do i = 1 %to &nstats ;
%let stat = %upcase ( %qscan ( &stats , &i ) ) ;
%if %index ( &stdstats , &stat ) %then &stat = &&&stat ;
%end ;
;
run;
proc datasets lib = work nolist ;
delete __u1 ;
quit;
%if %upcase(&print) = Y %then %do;
proc print data=&out label uniform noobs;
by &by;
run ;
%end;
%ende:
%mend unistats ;