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



我有关于美国各州变化的数据。现在我想创建许多假人来控制状态修复效果。在 stata 中,这是一项简单的工作,而在 sas 中,我似乎必须手动创建所有假人。然而,具有固定效果的 logit 回归在 stata 中运行得非常慢。我想知道是否有更有效的方法可以在 sas 中从 char 变量(不是数字,我知道一些应用的方法)创建虚拟人,因为我有太多的 char 变量需要创建为假人。干杯伊娃

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

并非所有 procs 都支持 class 语句,在这些情况下,您可以使用proc glmmod或各种其他方法来创建虚拟变量。

http://blogs.sas.com/content/iml/2016/02/22/create-dummy-variables-in-sas.html

如果你绝对需要手动创建虚拟变量,你可以使用像这样的宏。您需要为每个变量调用它。

%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;

最新更新