LISTSERV at the University of Georgia
Menubar Imagemap
Home Browse Manage Request Manuals Register
Previous messageNext messagePrevious in topicNext in topicPrevious by same authorNext by same authorPrevious page (November 1997, week 3)Back to main SAS-L pageJoin or leave SAS-L (or change settings)ReplyPost a new messageSearchProportional fontNon-proportional font
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 ;


Back to: Top of message | Previous page | Main SAS-L page