[英]How to randomly select variables in SAS?
我可以找到有關如何在SAS中隨機選擇觀察值的各種信息,這是一項相當容易的任務。 這不是我所需要的。 我需要隨機選擇變量。 我要具體做的是從我的159個變量列表中隨機選擇20個變量,並執行50次。 我也想確保多樣性。 我已經花了大約兩天的時間,沒有運氣。
很高興您提出這個問題,因為我剛剛為此制定了解決方案! 讓我們逐步詳細地說明需要做的事情。
步驟0:我們需要做什么?
我們需要一種方法來獲取所有變量並隨機選擇20個變量,同時將其保持在SAS語言規則的范圍內。
我們將要求:
讓我們從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.