我有关于美国各州变化的数据。现在我想创建许多假人来控制状态修复效果。在 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;