我不明白我的SAS代碼中發生了什麼。該代碼的行爲與預期相同,但僅在第一次編譯期間,即名爲'SummaryTable'的表顯示代碼觸發%mylogreg和%ModelsSummary的3次迭代中每一次的正確'LogLik'值。但是,如果我重新運行代碼,則它的行爲不同,3次迭代的'LogLik'值是相同的,它等於最後一次迭代的值。因此,在第一次編譯代碼時,變量「MyLogLik」以某種方式保存了第三次迭代的值。SAS宏編碼
第一資訊生成步驟:
data ingots;
input heat soak r n @@;
datalines;
7 1.0 0 10 7 1.7 0 17 7 2.2 0 7 7 2.8 0 12 7 4.0 0 9
14 1.0 0 31 14 1.7 0 43 14 2.2 2 33 14 2.8 0 31 14 4.0 0 19
27 1.0 1 56 27 1.7 4 44 27 2.2 0 21 27 2.8 1 22 27 4.0 1 16
51 1.0 3 13 51 1.7 0 1 51 2.2 0 1 51 2.8 0 1
;
run;
然後宏:
%macro mylogreg(Num,param);
title "variables are ¶m";
proc logistic data=ingots des outest = parameters&Num noprint;
model r/n = ¶m;
run;
%mend;
%macro ModelsSummary(Count,Var,Param);
proc sql;
select _LNLIKE_ into:MyLogLik from parameters&Count;
insert into SummaryTable (ModelNumber,ModelVariables,NumParameters, LogLik) values (&Count,"&Var",&Param, &MyLogLik);
drop table parameters&Count;
quit;
%mend;
然後我的代碼:
proc sql;
create table SummaryTable(
ModelNumber num,
ModelVariables varchar (500),
NumParameters num,
LogLik num
)
;
quit;
data _NULL_;
array a[2] $ (' heat' ' soak');
length temp $500;
/*Number of Variables*/
n = dim(a);
/*k tell us the number of variables in aech group of all possible conbination*/
do k=1 to n;
/*total tells the number of different convinations given that we form groups of k variables*/
total = comb(n,k);
do j=1 to total;
/*allcomb is the SAS function which forms all different combinations*/
call allcomb(j,k,of a[*]);
/*This counter show the total number of convinations for all ks*/
Counter + 1;
do i = 1 to k;
if i = 1 then temp = '';
/*this temp string contains the explanatory variables to be passed to the logistic reg*/
temp=catt(temp,a[i]);
end;
/* NumParam shows the number of parameters in the logistic model, including the intercept*/
NumParam = k + 1;
/* First we call the logistic regression macro, and the we fill out the table summarizing the important results*/
call execute('%mylogreg('||Counter||','||temp||')');
call execute('%ModelsSummary('||Counter||','||temp||','||NumParam||')');
end;
end;
run;
那麼問題是,如果我重新運行該代碼,那麼'SummaryTable'中'LogLik'的值將全部相同,並且該值對應於第三個模型。正如我之前所說的,第一次運行代碼時,循環按預期工作,每個模型在「SummaryTable」中都有相應的「LogLik」值。我已經檢查過%ModelSummary獲得變量'Counter'的正確值(這也可以在SQL輸出中確認),並且看起來是正確的。所以,我認爲我需要的是在主代碼完成之後清理'MyLogLik'的值或類似的東西。
有人可以指出我缺少什麼嗎?我沒有看到我的代碼有什麼問題!
感謝您的好解釋!我注意到這個宏是在數據步之後執行的,但我不確定它確實發生了什麼(我一般對於SAS編碼是新的,但對我而言並不直觀),我將在星期一檢查我的代碼,因爲我的SAS連接此刻不起作用。我會讓你知道的。謝謝:) – user1571823
它仍然是代碼不工作。我已經在宏模型總結中聲明瞭MyLogLik本地,並且在%NRSTR中包含宏觸發器作爲調用execute('%nrstr(%%)%ModelsSummary('|| Counter ||','|| temp ||',' || || NumParam ')'); 並在日誌中獲取此信息:注意:由CALL EXECUTE例程生成的行。 2 +%proc sql; _ 警告:宏PROC的表觀調用未解決。 錯誤180-322:語句無效或使用的順序不正確。 – user1571823
在ModelsSummary之前立即顯示沒有%符號 – Quentin