如何随机 select SAS中的变量?

How to randomly select variables in SAS?

我可以找到关于如何在 SAS 中随机 select 观察的各种信息,这是一项相当容易的任务。这不是我需要的。我需要随机 select 个变量。我特别想做的是从我的 159 个变量列表中随机选择 20 个变量,然后重复 50 次。我也想确保多样性。我已经在这上面花了大约两天时间了,但没有运气。

很高兴您提出这个问题,因为我刚刚为此开发了一个解决方案!让我们一步一步地详细说明需要做什么。

第0步:我们需要做什么?

我们需要一种方法来获取所有变量并随机获取其中的 select 20 个,同时将它们保持在 SAS 语言规则的范围内。

我们需要:

  1. 数据集中的所有变量
  2. 一种随机重新排序的方法
  3. 限制为 20 个变量
  4. 循环 50 次的方法

让我们从 1 开始。

第 1 步:获取所有变量

sashelp.vcolumn 提供数据集中所有变量的列表。让我们 select 他们全部。

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= 数据集选项,另一种方法是 outobs= proc sql 选项。就个人而言,我喜欢 obs= 数据集选项,因为它不会在日志中生成警告,并且可以在其他过程中使用。

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 进行 select 观察。然后也许将这些名称放入宏变量但您没有提到您想要的确切输出。

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_;