2017-08-08 130 views
0

我正在教SAS課程,並且在模擬中涉及了一些內容。我目前正在模擬棒球陣容。我在宏中不是很強大,並且能夠通過這個網站上的許多試驗和錯誤以及一些幫助來執行此代碼。我希望有人能幫助我走向終點。SAS宏內部的計數器/循環

我在這裏的目標是能夠與計數器正常工作。
我在具有9周的觀察,並具有可變截止稱爲一個數據組讀出(它是根據麪糊來確定命中與否和將被比作randvar的能力所使用的截止值)。 「順序」這個變量只是爲了讓它更容易遵循(注意,每9個擊球手切換循環)。 Count_outs在三分之一輸出結束後將輸出重置爲0(結局)。

我需要能夠在這9個觀測數據集中重複讀取,而且我已經做到了這一點(在此之前的一些幫助下)的方法是創建一個名爲'out'的數據集,並將其附加到我的數據集'orig'以我下面的方式。

一切正常,因爲我想除了一些例外。我想要一個計數器,在27次輸出後重置爲0。

18後的觀察,它的作品,因爲我想它,雖然19觀察,記下19觀察missings。所以,當然,我想要的是第19次(和下一次)的觀測有一個隨機變量(它從第19次觀測開始,每9次觀測就缺少一次),並相應更新計數器。

其他問題,我認爲應該是一個簡單的辦法是,數右腳不下車。注意第一個觀測值有一個randvar = 0.18(小於截止值,這應該導致一個輸出並且count = 1,但是它在那之後正確地工作了,我已經嘗試了修改這幾十次)。任何人都可以幫忙嗎?

非常感謝

%macro replicate(new,out,n)/des=’&out is &new repeated &n times.’; 
    Data & out; 
    Set &new; 
    %do i=1 %to &n; 
    Data &out; 
     randvar=uniform(1); 
     if randvar<cutoff then do; 
     count+1; 
     count_outs+1; 
     end; 
     set &out &new; 
     if count_outs=3 then count_outs=0; 
     if count=28 then do; 
     set &new; 
     count=1; 
     end; 
    run; 
    run; 
    %end; 
%mend; 

注:我嘗試顯示輸出,但不能正確格式化。

+0

如果你的問題更具通用性,它會有所幫助。由於棒球不是我來自的「事物」,我對此知之甚少,所以很難理解你的問題。你能提供樣本數據和期望的輸出嗎?這就是說,這段代碼看起來很奇怪。看起來你在數據步驟中放置了一個數據步驟,這沒有什麼意義。另外我會假設你的第一個'data & out;'聲明在這裏輸入錯誤,你的意思是數據&out;' – user2877959

+0

感謝你的迴應。我確實得到了答案 – GKJohn

回答

1

您使用的宏的方式實際上並非必要或不恰當。宏只是寫SAS代碼 - 所以不要把任何東西寫入不合法的宏中,除非它在前面有%

在這裏,你有這樣的結構:

data out; 
    set in; 
    data out; 
    set in out; 
    run; 
run; 

這顯然是行不通的,對嗎?外部數據/集合將快速結束,然後內部數據將運行。

在任何情況下,你不需要做任何的這種做你的模擬。你可以在宏觀之外做一切事情。

data out; 
    call streaminit(7);   *seed better random number engine; 
    do pointvar = 1 by 1 until (outs=27); *iterate starting at 1 and stop when 27 outs; 
    randvar = rand('Uniform'); *better random number engine; 
    if pointvar > 9 then pointvar=1;  *reset to 1 if over 9; 
    set in point=pointvar;  *pull the row we need; 
    if randvar < cutoff then do; 
     outs+1; 
     outs_inning+1; 
    end; 
    output; 
    if outs_inning=3 then outs_inning=0; 
    end; 
    stop; 
run; 

這就是你想要的(或多或少,你不提供樣本數據,所以我不能測試)。不需要宏;你可以自定義任意數量的宏變量(用於輸入,輸出等)。

+0

同意。如果你在教SAS課程,我只會教SAS,而不是宏語言。在你的學生學會了很多SAS之後,他們可以自己學習宏語,或者在第二課中學習。 – Quentin

+0

你好喬(和昆汀)謝謝你的回覆。這實際上只是一些學生想要看的東西(就像我一樣),因爲我們已經以概率的方式討論了模擬(p值等)。 Joe,我爲了截取的九個數字是.74,.73,.75,.70,.76,.78,.75,.72,.76。我試過你的代碼,它似乎掛着,可以這麼說。讓它運行10分鐘或更長時間。有些東西似乎不對。你能在這裏測試嗎?對不起,我在這裏比較新。有沒有辦法用數字發送文件,以便讓其他人更容易地運行它們?再次感謝John – GKJohn

+0

@GJJhn需要一個「停止」;最後,我忽略了這一點。 – Joe