SAS如何创建宏程序procsurveyselect

SAS how to create a macro program procsurveyselect

我需要在 500k 数据的 df 上进行随机简单采样而不替换 50k。

所以我有这个数据框位于 lib_d1.df

|变量 A |变量 B ||变量 C |变量 D ||变量 E |变量 F ||变量 G |变量 H |

我要制作宏程序data_sample(list_var,nb_obs,table_name)

%macro data_sample(list_var, nb_obs, table_name)
data_null_ nobs= n;       
Set lib_d1.df;
call symput("nb_obs", n);
run;

    
proc surveyselect seed=30602 data=&list_var n=&nb_obs out=&table_name;
run;         
%mend        
%let list_var= Var A, Var D, Var E, Var H;
&let nb_obs= &nb_obs;
%let table_name= data_50000;
%data_sample(list_var,nb_obs,table_name);

是的,这就是我所在的位置,我不知道什么是对的(或什么是错的...任何帮助将不胜感激)

首先,您可能要考虑重命名所有变量的名称以符合 SAS naming conventions。我不建议使用名称中带有 space 的变量。但是,如果您希望保持当前的数据集不变,请尝试以下操作:

%macro data_sample(input=,list_var=,obs=,output=);
proc surveyselect seed=30602 
                  data=&input.(keep= &list_var.)
                  n=&obs. 
                  out=&output.;
run;         
%mend;
   
%data_sample(input=have,
            list_var='Var A'n 'Var D'n 'Var E'n 'Var H'n,
            obs=50000,
            output=want);

method=srs是简单随机抽样,是等概率选择,不放回。在 PROC SURVEYSELECT 文档中查找更多信息。默认情况下,这设置为 SRS,但总是很高兴知道。

顺便说一句,我不认为你做的第一个数据步骤会 运行 因为 nobs=n 必须放在 set 语句之后。另外,如果您只对 50 000 个观测值的固定样本感兴趣,我不知道为什么要计算数据集中观测值的数量。

如果您想使用数据集中的观测值计算宏变量(在这种情况下 nbobs),我建议考虑使用以下方法:

data _null_;
if 0 then set lib_d1.df nobs=n;
call symputx('nbobs',n);
stop;
run;