1

我想执行一些回归,我想计算每个变量的非缺失观察数。但我还不知道我将使用哪个变量。我想出了以下不起作用的解决方案。有什么帮助吗?

这里基本上我把我的每一个解释变量都放在变量中。例如 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 个变量吗?

4

2 回答 2

2

你没有提供这个项目的完整背景,所以不清楚这是否适合你——但我认为这就是我要做的。

首先,您在 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 列有助于简化代码(处理额外的逗号有点烦人)。您也可以将其放在开头并添加逗号。

您最终也可以从数据集而不是宏变量中驱动它。总的来说,我更喜欢这样,因为它在很多方面都更容易处理。如果您的参数列表在某处的数据集中(每行一个参数,在数据集“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)。

于 2013-11-02T01:05:07.213 回答
0

我不确定您的 SAS 宏,但 SQL 查询将使用以下两个注释:

1) 如果您不使用诸如“COUNT() AS VAR1”之类的标识符跟随您的 COUNT() 函数,则您的结果将没有字段标题。如果这对你来说没问题,那么你可能不需要担心它。但是,如果您导出数据,如果您通过添加“...AS "MY_NAME" 来命名它们将对您有所帮助。

2) 对于少于 10 个变量的观察,查询将返回 NULL 值。所以不要担心没有得到你所拥有的所有结果,因为只要你查询的表有空间容纳 10 个变量(10 个单独的字段),你就会得到数据。

于 2013-11-01T22:34:27.177 回答