我想进行一些回归,我想计算每个变量的非缺失观察数。但我还不知道我将使用哪个变量。我想出了以下不起作用的解决方案。有什么帮助吗?
这里基本上我将每个解释变量放在变量中。例如
var1 var 2 - > w1 = var1,w2 = var2。
请注意,我不知道我提前有多少变量,所以我留下十个变量的空间。
然后使用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;
我的下一步是使用我存储的变量执行proc sql。它不起作用 如果我的变量少于10个。
proc sql;
select count(&explanVar1), count(&explanVar2),
count(&explanVar3), count(&explanVar4),
count(&explanVar5), count(&explanVar6),
count(&explanVar7), count(&explanVar8),
count(&explanVar9), count(&explanVar10)
from estimation
;quit;
此代码可以使用少于10个变量吗?
答案 0 :(得分:2)
您尚未提供此项目的完整背景信息,因此目前尚不清楚这是否适合您 - 但我认为这就是我要做的事情。
首先,你在SAS,使用SAS最好的地方 - 计算东西。而不是PROC SQL和数据步骤,使用PROC MEANS:
proc means data=estimation n;
var ¶meters.;
run;
在没有任何额外工作的情况下,在一个漂亮的表中获取所有变量的非缺失值的数量。
其次,如果有理由进行PROC SQL,以这种方式构造它可能更合乎逻辑。
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列对于简化代码很有用(处理额外的逗号有点烦人)。你也可以把它放在开头并加上逗号。
您最终还可以从数据集而不是宏变量中驱动它。总的来说,我更喜欢这样,因为它在很多方面更容易处理。如果参数列表位于某个数据集中(每行一个参数,在数据集“参数”中,“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
),您甚至可以从估算内容中驱动它。
答案 1 :(得分:0)
我不确定您的SAS宏,但SQL查询将使用这两个注释:
1)如果您没有使用诸如“COUNT()AS VAR1”之类的标识符关注COUNT()函数,则结果将不具有字段标题。如果你没问题,那么你可能不需要担心它。但是,如果您导出数据,如果您通过添加“... AS”MY_NAME来命名它们将对您有所帮助。
2)对于少于10个变量的观察,查询将返回NULL值。因此,不要担心没有获得所有结果,因为只要您查询的表有10个变量的空间(10个单独的字段),您将获得数据。