在所有其他变量上回归一个变量

时间:2014-12-16 20:52:39

标签: sas regression

我有一个包含数百个变量的SAS数据集。我想取第十个变量并在所有其他变量上回归,比如

   proc reg data=mydata;
      model [10th one] = [all the others];
   run;

有没有一种简单的方法可以在不输入完整变量列表的情况下执行此操作?我可以想象一个非常繁琐的解决方案,其中我(a)查找第10个变量名并在左侧手动输入,(b)使用sql语句将所有其他变量放入宏变量中右手边。

3 个答案:

答案 0 :(得分:3)

让我们说你知道以下变量: 第1名 - Var_1st 9日 - Var_9th 11日 - Var_11th Nth - Var120th

proc reg data=mydata;
  model [10th one] = var_1st--var_9th var_11th--var_120th;
run;quit;

如果您完全想要自动使用sashelp.vcolumn:

proc sql noprint;
select name into :reg_list separated by " " from sashelp.vcolumn where upper(libname)='WORK' and    upper(memname)='MYDATA' and varnum ne 10;
select name into :dep_list from sashelp.vcolumn where upper(libname)='WORK' and upper(memname)='MYDATA' and varnum eq 10;
quit;

proc reg data=mydata;
model &dep_list = &reg_list;
run;quit;

答案 1 :(得分:2)

这是迄今为止我发现的最好的东西,它假定你不会懒得查找第10个变量的名称:

proc contents data=mydat(drop=[name of 10th variable]) out=varnames(keep=name) noprint; 
run;
proc sql noprint;
   select name into : reg_varlist separated by ' '
   from varnames;
quit;
run;

proc reg data=mydat;
   model [name of 10th variable]) = &reg_varlist;
run;

答案 2 :(得分:2)

使用dictionary.columns简化您的方法。这与最终发生的proc contents方法完全相同,只需要花费更少的代码和更少的时间。

proc sql;
  select name into :reg_varlist separated by ' '
    from dictionary.columns
    where libname='WORK' and memname='MYDAT'
      and name ne "&tenth_Variable";
quit;

proc reg data=mydat;
   model &tenth_variable = &reg_varlist;
run;

如果你愿意的话,你可以在宏中包含它,并以tenth_variable作为参数。

如果你真的想要倒退'"第十个变量"具体而言,并不关心它的所谓,然后你可以使用varnum

这是一个以基本形式执行此操作的宏。下面建模的回归可能完全是荒谬的,并且这不会阻止选择的字符变量等等;您可能希望在(and type="num"中)添加它。

%macro regress_onevar(varnum=,dataset=,libname=work);
    proc sql;
      select name into :reg_varlist separated by ' '
        from dictionary.columns
        where libname=upcase("&libname.") and memname=upcase("&dataset.")
          and varnum ne &varnum.;    *varnum=position in dataset;

      select name into :tenth_variable
        from dictionary.columns
        where libname=upcase("&libname.") and memname=upcase("&dataset.")
          and varnum eq &varnum.;
     quit;

    proc reg data=&libname..&dataset.;
       model &tenth_variable = &reg_varlist;
    run;
%mend regress_onevar;

%regress_onevar(varnum=10,dataset=usecon,libname=sashelp);