【发布时间】:2016-01-23 15:56:40
【问题描述】:
我有一个数据集,其中有 57 个变量,其中一些变量与其他变量高度相关(corr=1)。 SAS中是否有任何程序可以从相关矩阵中删除高度相关的变量?
【问题讨论】:
-
所有变量的类型是否相同——数值型、序数型、分类型?
-
您是否只关心与另一个变量的高相关性或线性组合。 IE v10 = 1 + 5*v8 - 2*v13?
标签: sas
我有一个数据集,其中有 57 个变量,其中一些变量与其他变量高度相关(corr=1)。 SAS中是否有任何程序可以从相关矩阵中删除高度相关的变量?
【问题讨论】:
标签: sas
您可以从模型中排除这些变量。例如:
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;
【讨论】: