带proc-sql的Sas宏
我想进行一些回归,我想计算每个变量的非缺失观测数。但我还不知道我将使用哪个变量。我想出了下面的解决方案,但它不起作用。有什么帮助吗 这里基本上我把每个解释变量都放在变量中。例如 var1 var 2->w1=var1,w2=var2带proc-sql的Sas宏,sas,sas-macro,Sas,Sas Macro,我想进行一些回归,我想计算每个变量的非缺失观测数。但我还不知道我将使用哪个变量。我想出了下面的解决方案,但它不起作用。有什么帮助吗 这里基本上我把每个解释变量都放在变量中。例如 var1 var 2->w1=var1,w2=var2请注意,我不知道预先准备了多少变量,所以我留出了十个变量的空间 然后使用symput存储潜在变量 data _null_; cntw=countw(¶meters); i = 1; array w{10} $15.; do while(i <=
请注意,我不知道预先准备了多少变量,所以我留出了十个变量的空间
然后使用symput存储潜在变量
data _null_;
cntw=countw(¶meters);
i = 1;
array w{10} $15.;
do while(i <= cntw);
w[i]= scan((¶meters"),i, ' ');
i = i +1;
end;
/* store a variable globally*/
do j=1 to 10;
call symput("explanVar"||left(put(j,3.)), w(j));
end;
run;
这段代码可以使用少于10个变量吗?我不确定您的SAS宏,但SQL查询可以使用以下两个注释: 1) 如果不使用标识符(如“COUNT()为VAR1”)跟踪COUNT()函数,则结果将不会有字段标题。如果你不介意的话,那么你可能不需要担心。但是,如果您导出数据,如果您通过添加“…作为“我的名字”来命名它们,将对您有所帮助
2) 对于少于10个变量的观测值,查询将返回空值。因此,不要担心无法获得所有结果,因为只要您查询的表有10个变量的空间(10个单独的字段),您将获得数据。您尚未提供此项目的完整背景,因此不清楚这是否适用于您,但我认为这是我应该做的 首先,您在SAS中,在最适合的地方使用SAS—计算事物。使用PROC表示,而不是PROC SQL和数据步骤:
proc means data=estimation n;
var ¶meters.;
run;
在没有任何额外工作的情况下,可以在一个漂亮的表中获得所有变量的非缺失值的数量
第二,如果有理由使用procsql,那么用这种方式构造它可能更符合逻辑
proc sql;
select
%do i = 1 %to %sysfunc(countw(¶meters.));
count(%scan(¶meters.,&i.) ) as Parameter_&i., /* or could reuse the %scan result to name this better*/
%end; count(1) as Total_Obs
from estimation;
quit;
最后一个Total Obs列有助于简化代码(处理多余的逗号有点烦人)。您还可以将其放在逗号的开头和前面
最后,您还可以从数据集而不是宏变量来驱动它。一般来说,我更喜欢这样,因为它在很多方面都更容易处理。如果您的参数列表位于某个数据集中(每行一个参数,在数据集“Parameters”中,“var”是包含参数的列的名称),您可以这样做
proc sql;
select cats('%countme(var=',var,')') into :countlist separated by ','
from parameters;
quit;
%macro countme(var=);
count(&var.) as &var._count
%mend countme;
proc sql;
select &countlist from estimation;
quit;
这是我最喜欢的,因为它是最简单的代码,而且很容易修改。如果可以很容易地确定您的潜在参数,您甚至可以通过估算的内容来驱动它(或通过
dictionary.columns
).非常感谢。我没有考虑proc的意思,我会记住你的建议。你的第三个选项看起来很有趣,尽管我承认我不理解。你能更具体地说明你将如何使用这个方法吗?你必须问一个更具体的问题。我为第三个选项发布的是实现完全使用第三个选项(除了它需要数据集参数
)。
proc sql;
select cats('%countme(var=',var,')') into :countlist separated by ','
from parameters;
quit;
%macro countme(var=);
count(&var.) as &var._count
%mend countme;
proc sql;
select &countlist from estimation;
quit;