簡體   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