2013-11-01 187 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個獨立的字段),你就會得到數據。