2013-11-01 181 views
1

我想执行一些回归,我想要计算每个变量的nonmissing观测数。但我不知道我将使用哪个变量。我想出了下面的解决方案,它不起作用。任何帮助?Sas宏与proc sql

这里基本上我把我的每个解释变量都放在变量中。例如 var1 var 2 - > w1 = var1,w2 = var2。
请注意,我不知道我有多少变量,所以我留下了十个变量的空间。
然后使用symput存储潜在变量。

data _null_; 
cntw=countw(&parameters); 
i = 1; 
array w{10} $15.; 
do while(i <= cntw); 
w[i]= scan((&parameters"),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个变量吗?

回答

2

你没有得到所有的结果, t为这个项目提供了完整的背景,所以目前还不清楚这是否会对你有用 - 但我认为这是我应该做的。

首先,你在SAS,在最好的地方使用SAS - 计数而不是PROC SQL和数据步骤,请使用PROC MEANS:

proc means data=estimation n; 
var &parameters.; 
run; 

也就是说,没有任何额外的工作,让你在一个漂亮的表非缺失值的所有变量的数目。

其次,如果有理由去执行PROC SQL,那么以这种方式构建它可能更合乎逻辑。

proc sql; 
select 
%do i = 1 %to %sysfunc(countw(&parameters.)); 
    count(%scan(&parameters.,&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),那么您甚至可以从估算内容中推动它。

+0

非常感谢。我没有考虑proc的意思,我会记住你的建议。你的第三个选项似乎很有趣,但我承认我没有理解它。你能更具体地说明你将如何使用这种方法吗? – DJJ

+0

你必须问一个更具体的问题。我为第三个选项发布的是完全实现第三个选项(除了它需要数据集“参数”)。 – Joe

0

我不知道你的SAS宏,但SQL查询将与这两个音符工作:

1)如果你不按照你的COUNT()与标识的功能,如“COUNT( )作为VAR1“,你的结果将不会有字段标题。如果这对你很好,那么你可能不需要担心它。但是,如果您导出数据,如果通过添加“...... AS”MY_NAME“来命名它们将对您有所帮助。

2)对于变量少于10个的观察值,查询将返回NULL值。因为只要你查询的表格有10个变量的空间(10个独立的字段),你就会得到数据。