我在美国有关于状态变化的数据现在我想创建许多虚拟对象来控制状态修复效果。在stata中它是一个简单的工作,而在sas中似乎我必须手动创建所有的假人。然而使用修复效果的logit回归在stata中运行相当慢。我想知道是否有更有效的方法来创建char变量(不是数字,我知道一些应用的方法)在sas中,因为我有太多的char变量需要创建为假人。 干杯, EVA
答案 0 :(得分:0)
proc logistic
支持class
语句。将变量放在class
语句中,您也可以指定您喜欢的参数化类型。最常见的方法是参考编码。
proc logistic data=sashelp.heart;
class sex bp_status/param=ref;
model status = sex ageAtStart height weight bp_status;
run;
并非所有的proc都支持class
语句,在这种情况下,您可以使用proc glmmod
或其他各种方法来创建虚拟变量。
http://blogs.sas.com/content/iml/2016/02/22/create-dummy-variables-in-sas.html
答案 1 :(得分:0)
如果您绝对需要手动创建虚拟变量,可以使用像这样的宏。您需要为每个变量调用它。
%macro create_dummy(dataset=, var=);
%* Save Distinct Values and Dummy Variable Names;
proc sql noprint;
select distinct
&var,
tranwrd(tranwrd(trim(&var), " ", "_"), ".", "")
into
:value1-,
:name1-
from
&dataset
;
select
count(distinct(&var))
into
:total
from
&dataset
;
quit;
%* Create Dummy Variables;
data &dataset;
set &dataset;
%do i=1 %to &total;
if &var = "&&value&i" then &&name&i = 1; else &&name&i = 0;
%end;
run;
%mend create_dummy;
如果只想调用宏一次,可以向宏添加循环。在顶部添加一个do循环,如:
%macro create_dummy(dataset=, var=);
%do l %to %sysfunc(countw(&var));
%let var1 = %scan(&var, &l);
%* Save Distinct Values and Dummy Variable Names;
proc sql noprint;
select distinct
&var1,
tranwrd(tranwrd(trim(&var1), " ", "_"), ".", "")
into
:value1-,
:name1-
from
&dataset
;
select
count(distinct(&var1))
into
:total
from
&dataset
;
quit;
%* Create Dummy Variables;
data &dataset;
set &dataset;
%do i=1 %to &total;
if &var1 = "&&value&i" then &&name&i = 1; else &&name&i = 0;
%end;
run;
%end;
%mend create_dummy;