从分类变量在SAS中创建虚拟变量

时间:2018-02-08 04:41:32

标签: loops macros sas categorical-data dummy-variable

我希望为SAS中的分类变量创建虚拟变量。分类变量包括有关站点的信息,并且具有马尼拉,拉巴特等值,所有这些都有大约50个不同的站点。如果不使用“if then”分别创建每个虚拟对象,创建虚拟对象的最有效方法是什么?也许使用循环?看起来怎么样?

3 个答案:

答案 0 :(得分:0)

简短回答:是的。如果没有进一步的投入,恐怕我们无法提供。这里有几个例子:

data with_categoric(keep=category:);
    set sashelp.zipcode; 
    category1 = (TIMEZONE='Central' and length(COUNTYNM) <=4); 
    if      35>Y then category2='low'; 
    else if 35<Y<41 then category2='medium'; 
    else category2='high'; 
run;

执行Category2的另一种方法是通过proc format

proc format; 
    value level 
    low-35 = 'low'
    35-41 = 'med'
    41-high ='high';
quit;

data W_proc_foramt; 
    set sashelp.zipcode; 
    levelled = Y; 
    format levelled level.; 
run;

您可以从Documentation

查看更多内容

答案 1 :(得分:0)

创建虚拟类别的最简单方法是使用观察编号作为后缀。

解决方案:

/*Create Table with 5 Records*/
data input;  
input Category $40.;  
cards;  
A 
B 
C 
D 
E 
;;;; 
run; 
/*Create dummy categories using "_N_" record number as suffix */
data work.dummy;
set work.input;
dummy= catx("-","CAT",put(_N_,8.));
put _all_;
run;

输出:

Category=A dummy=CAT-1 _ERROR_=0 _N_=1
Category=B dummy=CAT-2 _ERROR_=0 _N_=2
Category=C dummy=CAT-3 _ERROR_=0 _N_=3
Category=D dummy=CAT-4 _ERROR_=0 _N_=4
Category=E dummy=CAT-5 _ERROR_=0 _N_=5

答案 2 :(得分:0)

我需要在SAS中将分类转换为虚拟变量并运行线性回归,但是没有找到所有答案的一个地方,因此我将搜索结果放在这里。
假设我们有一个数据集(mydata),其中包含因变量Y和分类变量A1,A2 ... An。每个独立变量具有X1,X2 ... Xm有效值。例如:

A1 | A2 | A3
---|----|---
x1 | y1 | z1
x2 | y1 | z2
x1 | y2 | z3

虚拟转换后的输出为:

A1x1 | A1x2 | A2y1 | A2y2| A3z1| A3z2 | A3z3
-----|------|------|-----|-----|------|-----
 1   |  0   |  1   |  0  |  1  |  0   |  0
 0   |  1   |  1   |  0  |  0  |  1   |  0
 1   |  0   |  0   |  0  |  0  |  0   |  1

完成转换为虚拟的代码为:
DATA mydata;
   set mydata;
   dummy=1;
RUN;
PROC logistic data=mydata  outdesignonly  outdesign=design;
   CLASS A1 A2 A3/param=glm;
   MODEL dummy=A1 A2 A3;
RUN; 
DATA  mydata_dummy;
  merge mydata(drop=dummy)   design(drop=dummy intercept);
RUN;
DATA  mydata_dummy;
   SET mydata_dummy;
   DROP A1 A2 A3;
RUN;

将类别变量转换为虚拟变量的副作用是变量名中的通货膨胀。
为避免列出所有新的列名(例如REG)
您不能使用(MODEL Y = all ),因为Y也会在 all

而不是。

MODEL Y=A1x1 A1x2 A2y1 A2y2 A3z1 A3z2  A3z3

执行以下操作:

PROC CONTENTS data=mydata_dummy noprint out=_contents_; 
RUN;
PROC sql noprint;
  SELECT name into :names separated by ' ' 
  from _contents_ where upcase(name) ^='Y';
RUN;

PROC reg DATA=mydata_dummy;
    MODEL Y=&names;
RUN;

....谢谢