Variables 如何在SAS中随机选择变量?
我可以找到关于如何在SAS中随机选择观测值的各种信息,这是一项相当简单的任务。这不是我需要的。我需要随机选择变量。我特别想做的是从我的159个变量列表中随机选择20个变量,然后做50次。我也想确保多样性。我已经花了大约两天的时间在这个问题上,现在运气不好。我很高兴你问了这个问题,因为我刚刚开发了一个解决方案!让我们一步一步地详细说明需要做什么 第0步:我们需要做什么? 我们需要一种方法来获取所有变量并随机选择其中20个,同时将它们保持在SAS语言规则的范围内 我们将要求:Variables 如何在SAS中随机选择变量?,variables,random,sas,selection,Variables,Random,Sas,Selection,我可以找到关于如何在SAS中随机选择观测值的各种信息,这是一项相当简单的任务。这不是我需要的。我需要随机选择变量。我特别想做的是从我的159个变量列表中随机选择20个变量,然后做50次。我也想确保多样性。我已经花了大约两天的时间在这个问题上,现在运气不好。我很高兴你问了这个问题,因为我刚刚开发了一个解决方案!让我们一步一步地详细说明需要做什么 第0步:我们需要做什么? 我们需要一种方法来获取所有变量并随机选择其中20个,同时将它们保持在SAS语言规则的范围内 我们将要求: 数据集中的所有变量 一
sashelp.vcolumn
提供数据集中所有变量的列表。让我们把它们全部选中
proc sql noprint;
create table all_vars as
select name
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
;
quit;
这将为我们提供数据集中所有变量的列表。现在,我们需要对它们进行随机排序
第2步:随机设置
SAS提供了rand
功能,允许您从想要的任何分发中提取。您可以在rand
函数之前使用call streaminit(seedhere)
设置特定的种子,创建可复制的结果
我们只需修改原始SQL语句,并使用rand()
函数对数据集进行排序
data _null_;
call streaminit(1234);
run;
proc sql noprint;
create table all_vars as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform');
quit;
现在我们得到了所有变量的随机顺序,通过uniform
分布均匀分布
步骤3:限制为20个变量
你可以用几种方法来做到这一点。一种方法是在单独的过程中使用obs=
dataset选项,另一种方法是使用outobs=
proc sql
选项。就个人而言,我喜欢obs=
dataset选项,因为它不会在日志中生成警告,并且可以在其他过程中使用
data _null_;
call streaminit(1234);
run;
proc sql noprint outobs=20;
create table all_vars as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform');
quit;
第4步:循环50次
我们将使用SAS宏语言来完成这一部分。我们可以用这种方式创建50个单独的数据集,或者稍微向上切换代码并将它们读入宏变量
%macro selectVars(loop=50, seed=1234);
data _null_;
call streaminit(&seed);
run;
%do i = 1 %to &loop;
proc sql noprint outobs=20;
create table all_vars&i as
select name
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform')
;
quit;
%end;
%mend;
%selectVars;
或者,选择2:
%macro selectVars(loop=50, seed=1234);
data _null_;
call streaminit(&seed);
run;
%do i = 1 %to &loop;
proc sql noprint outobs=20;
select name
into :varlist separated by ' '
from sashelp.vcolumn
where libname = 'LIBRARYHERE' AND memname = 'HAVE'
order by rand('uniform')
;
quit;
%end;
%mend;
%selectVars;
第二个选项将创建一个名为&varlist
的本地宏变量,其中随机的20个变量用空格分隔。这对于各种建模过程都很方便,而且更可取,因为它不会每次都创建单独的数据集
希望这有帮助 您需要将元数据视为数据,并使用SURVEYSELECT选择观察值。然后,可能将这些名称放入宏变量中,但您没有提到所需的确切输出
data v;
array rvars[159];
run;
proc transpose data=v(obs=0) out=vars name=name;
var rvars:;
run;
proc surveyselect reps=4 sampsize=20 data=vars out=selection;
run;
proc transpose data=selection out=lists(drop=_:);
by replicate;
var name;
run;
proc print;
run;
data _null_;
set lists;
by replicate;
call symputx(cats('VLIST',_n_),catx(' ',of col:));
run;
%put _global_;
你能举例说明你曾经尝试过的约会吗?你能描述一下你所说的“确保多样性”是什么意思吗?您是否出于某种原因试图避免相邻变量的序列?