Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 如何在SAS中随机选择变量?_Variables_Random_Sas_Selection - Fatal编程技术网

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

Variables 如何在SAS中随机选择变量?,variables,random,sas,selection,Variables,Random,Sas,Selection,我可以找到关于如何在SAS中随机选择观测值的各种信息,这是一项相当简单的任务。这不是我需要的。我需要随机选择变量。我特别想做的是从我的159个变量列表中随机选择20个变量,然后做50次。我也想确保多样性。我已经花了大约两天的时间在这个问题上,现在运气不好。我很高兴你问了这个问题,因为我刚刚开发了一个解决方案!让我们一步一步地详细说明需要做什么 第0步:我们需要做什么? 我们需要一种方法来获取所有变量并随机选择其中20个,同时将它们保持在SAS语言规则的范围内 我们将要求: 数据集中的所有变量 一

我可以找到关于如何在SAS中随机选择观测值的各种信息,这是一项相当简单的任务。这不是我需要的。我需要随机选择变量。我特别想做的是从我的159个变量列表中随机选择20个变量,然后做50次。我也想确保多样性。我已经花了大约两天的时间在这个问题上,现在运气不好。

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

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

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

我们将要求:

  • 数据集中的所有变量
  • 一种随机重新排序的方法
  • 20个变量的限制
  • 一种循环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_;
    

    你能举例说明你曾经尝试过的约会吗?你能描述一下你所说的“确保多样性”是什么意思吗?您是否出于某种原因试图避免相邻变量的序列?