如何删除SAS中高度相关的变量?

时间:2016-01-23 15:56:40

标签: sas

我有一个数据集,其中有57个变量,其中一些变量与其他变量高度相关(corr = 1)。 SAS中是否有任何可以从相关矩阵中删除高度相关变量的程序?

1 个答案:

答案 0 :(得分:0)

您可以从模型中排除这些变量。例如:

proc glm data=have;
     model y = x1 x2 x3;
run;

如果x1和x2高度相关,请从模型中删除一个:

proc glm data=have;
     model y = x1 x3;
run;

如果您有很多变量过于繁琐而无法输出,您可以使用drop=选项直接从数据集中删除它们:

proc glm data=have(drop=x2 x32 x49);
    model y = x1--x57;
run;

--选择x1x57之间的所有变量,其中x2x32x49从数据集中删除proc glm正在阅读。

如果你有一个包含类变量和数值变量的更复杂的模型,你可以结合SAS列字典表和宏语言来准确存储你需要的东西。

以下代码将从您的数据集中获取所有字符和数字变量,我们假设它被称为have并存储在名为LIBREF的库中。我们正在过滤掉我们不想包含的相关变量。请注意,在第二个查询中,我们会过滤掉y。我们总是希望在此处过滤掉y变量,否则我们将创建一个显示y = itself + other factors的模型。

proc sql noprint;
    select name
    into :classvars separated by ' '
    from sashelp.vcolumn
    where libname = 'LIBREF'
          AND memname = 'HAVE'
          AND type = 'num'
          AND name NOT IN('x3', 'x4')
   ;

   select name
   into :numvars separated by ' '
   from sashelp.vcolumn
   where libname = 'LIBREF'
         AND memname = 'HAVE'
         AND type = 'num'
         AND name NOT IN('y', 'x1', 'x6')
   ;
quit;

您会发现宏变量&numvars&classvars存储了所需的值。现在你不需要全部输入它们!您可以通过运行以下内容并查看日志来检查:

%put CLASS VARIABLES: &classvars;
%put NUMERIC VARIABLES: &numvars;

然后,您可以使用这些宏变量运行proc glm来仅表示您要建模的变量:

proc glm data=have;
    class &classvars;
    model y = &classvars &numvars;
run;