|
地板

楼主 |
发表于 2005-11-11 00:13:13
|
只看该作者
Re
最好是用proc rank……将其设置成哑变量后再分析,下面给出一段宏程序,可以一次对多个变量进行哑变量的设置,请各位指教。
[code:c4c45]%MACRO ranks(data,outdata=,var=,num=,byvar=,indicator=F);
options nodate nonumber;title;
%if &outdata= %then %do; %let outdata=&data; %end;
%local nqvar nqnum nq i j;
%let nqvar = %wordcnt(string=&var, delim=%str( ));
%let nqnum = %wordcnt(string=&num, delim=%str( ));
%if &nqvar>1 & &nqnum>1 & &nqvar^=&nqnum %then %do;
%put ERROR: qvar, qnum not matching; endsas;
%end;
%if &nqvar=1 %then %do;%let nq = &nqnum;
%do i=1 %to &nq;%let qvar&i = &var;%let qnum&i = %scan(&num, &i);%end;
%end;
%if &nqvar>1 %then %do; %let nq = &nqvar;
%if &nqnum=1 %then %do;
%do i=1 %to &nq;%let qnum&i = #%let qvar&i = %scan(&var, &i);%end;
%end;
%else %if &nqnum>1 %then %do;
%do i=1 %to &nq;
%let qvar&i = %scan(&var, &i);%let qnum&i = %scan(&num, &i);
%end;
%end;
%end; %*if &nqvar>1;
%if &byvar^= %then %do;proc sort data=&data; by &byvar;%end;
%do i=1 %to &nq;
proc rank data=&data(keep=&byvar &&qvar&i) out=_out&i groups=&&qnum&i;
var &&qvar&i; ranks &&qvar&i.&&qnum&i ;
%if &byvar^= %then %do;by &byvar;%end;run;
%if &byvar^= %then %do;proc sort data=_out&i;by &byvar;%end;
proc univariate data=_out&i noprint;
var &&qvar&i; class &&qvar&i.&&qnum&i;
%if &byvar^= %then %do;by &byvar;%end;
output out=_tmp1 n=n mean=mean std=std pctlpts=0 50 100 pctlpre=x;
run;
data _out&i; set _out&i; _tmpid=_n_;
proc sort; by &byvar &&qvar&i.&&qnum&i;
data _out&i; merge _out&i _tmp1(keep=&byvar &&qvar&i.&&qnum&i x50);
by &byvar &&qvar&i.&&qnum&i;
rename x50=&&qvar&i.&&qnum&i.._m;
proc sort data=_out&i;by _tmpid;
data _tmp1;set _tmp1;
rank_var="&&qvar&i";rank=&&qvar&i.&&qnum&i;
min=x0; median=x50; max=x100;
keep rank_var rank n median min max mean std &byvar;run;
%if &i=1 %then %do; data _tmpp;set _tmp1;run;%end;
%else %do;data _tmpp;set _tmpp _tmp1;run;%end;
%end;
proc print data=_tmpp noobs;
var &byvar rank_var rank n median min max mean std;run;
data &outdata; merge &data %do i=1 %to &nq; _out&i %end;;drop _tmpid;
%if &indicator=T %then %do;
%do i=1 %to &nq;
%do j=1 %to &&qnum&i;
&&qvar&i.&&qnum&i..&j = (&&qvar&i.&&qnum&i=(&j-1));
%end;
%end;
%end;
run;
%MEND ranks;
%MACRO ranks(aa,outdata=aaa,var=x1 x2 x3,num=2 2 2,byvar=sex,indicator=F);[/code:c4c45] |
|