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