在SAS中更有效地使用类别变量创建虚拟变量

时间:2016-05-27 05:24:58

标签: sas

我在美国有关于状态变化的数据现在我想创建许多虚拟对象来控制状态修复效果。在stata中它是一个简单的工作,而在sas中似乎我必须手动创建所有的假人。然而使用修复效果的logit回归在stata中运行相当慢。我想知道是否有更有效的方法来创建char变量(不是数字,我知道一些应用的方法)在sas中,因为我有太多的char变量需要创建为假人。 干杯, EVA

2 个答案:

答案 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; 

https://support.sas.com/documentation/cdl/en/statug/63347/HTML/default/viewer.htm#statug_logistic_sect006.htm

并非所有的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;