我有一个数据集,其中有57个变量,其中一些变量与其他变量高度相关(corr = 1)。 SAS中是否有任何可以从相关矩阵中删除高度相关变量的程序?
答案 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;
--
选择x1
和x57
之间的所有变量,其中x2
,x32
和x49
从数据集中删除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;