Tuesday, October 18, 2011

Convert Categorical Variable to Dummy Variables (Indicators)

说明:
假如变量School有1000个观测值,其中unique的观测值有50个,也就是有50个不同的学校。在linear regression中要把School这个变量变成50个dummy ariable才可以(实际用49个,因为有一个是reference)。怎么做?一个SAS Macro如下:


%macro DUMMY ( dsn = ,
var = ,
prefix = ) ;
proc summary data = &dsn nway ;
class &var ;
output out = x ( keep = &var ) ;
proc print ;
*;
data _null_ ;
set x nobs=last ;
if _n_ = 1 then call symput ( 'num',
trim(left(put( last, best. ) ) ) ) ;
call symput ( 'c' || trim ( left (
put ( _n_, best. ) ) ),trim ( left
( &var ) ) ) ;
run ;
data &dsn ;
set &dsn nobs=last;
array ct ( &num ) %do k=1 %to
&num ;
&prefix&&c&k
%end ; ;
%do i = 1 %to &num ;
select;
when (&var="&&c&i" ) ct(&i)=1;
otherwise ct(&i)=0;
end;
%end;
run ;
%mend Dummy ;

%Dummy ( dsn = name , var = name,
prefix = sic_ ) ;

proc print ;
run;
quit;

说明:
1:第一步proc summary产生dataset X。X是原data dsn中var的unique的值。所以这一步可以用 proc sort noduplicate来得到;

2: 第二步_null_产生两个macro variable,第一个是&num,是原data dsn中var的unique值的size,也就是X的size,记为#第二个macro variable是一系列macro variable,从&&c&1到&&c&num。也就是把X的变量的每一个值赋给对应的&&c&i;

3:来产生dummy variable。总共有&num个dummy variable,所以建立一个array,有&num列,叫ct(&1) 到 ct(&num),对应的变量名为&prefix&&c&k。然后就是比较。从dsn中读进来的var的每个值,跟相应的&&c&i比较,相同为1,否则为0.最终得到所要的东西。

更直接一点,源程序分解:
data name;
      input name $;
      cards;
      zhao
      qian
      sun
      li
      zou
      wu
      zeng
      wang
      zhao
      wang
      sun
      wu
      ;
run;

proc summary data = name nway ;
class name;
output out = x ( keep = name ) ;
proc print ;



data _null_ ;
set x nobs=last ;
if _n_ = 1 then call symput ( 'num',
trim(left(put( last, best. ) ) ) ) ;
call symput ( 'c' || trim ( left (
put ( _n_, best. ) ) ),trim ( left
( name ) ) ) ;
run ;

%put #
%put &c1;
%put &c2;
%put &c3;
%put &c4;
%put &c5;
%put &c6;
%put &c7;
%put &c8;






No comments:

Post a Comment