繁体   English   中英

如何在SAS中随机选择变量?

[英]How to randomly select variables in SAS?

我可以找到有关如何在SAS中随机选择观察值的各种信息,这是一项相当容易的任务。 这不是我所需要的。 我需要随机选择变量。 我要具体做的是从我的159个变量列表中随机选择20个变量,并执行50次。 我也想确保多样性。 我已经花了大约两天的时间,没有运气。

很高兴您提出这个问题,因为我刚刚为此制定了解决方案! 让我们逐步详细地说明需要做的事情。

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

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

我们将要求:

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

让我们从1开始。

步骤1:获取所有变量

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM