先看 pseudo code
1. create new file aa;
2. open d as input
3. suppose d 有 r 筆(row)
4. for i=1 to r
5.   xxx[i]=vol[i]+VOL[i-1]; * ?????? ;
6. end.

以下是做法.
DATA AA;
  SET D;
  XXX=VOL+LAG(VOL);
RUN;

有時候算式不是只用LAG就做得到? 這時候要如何做?
如算 "累積報酬": acR[i]=1*(1+R[i-N])*(1+R[i-(N-1)])*(1+R[i-(N-2)])*... *(1+R[1]);
因第一筆的 LAG 為 . (MISSING VALUE), 所以之後就算不出來.

再引進新的 指令 RETAIN; 以RETAIN 定義的可以將值往下一筆傳.

先寫PSEUDO CODE
1. create new file aa;
2. open d as input
3. suppose d 有 r 筆(row)
3.1  ACC=1.0;
4. for i=1 to r
5.   ACC[i]=ACC*(1+ R[i]); * ?????? ;
6.   accr=acc-1;
7. end.
8. drop ACC
--------------->

[1] DATA AA;
[2]  SET D;
[3]  RETAIN ACC;
[4]  ACC=1.0;
[5]  ACC=ACC*(1+R);
[6]  ACCR=ACC-1; Drop ACC;
[7] RUN;
但以上的寫法有個問題.
[4],[5]如何區分 PSEUDO CODE 的迴圈內, 或迴圈外?


還好, RETAIN 可以設初始值, 改成以下就OK了.
[1] DATA AA;
[2]  SET D;
[3]  RETAIN ACC 1.0;
[5]  ACC=ACC*(1+R);
[6]  ACCR=ACC-1; Drop ACC;
[7] RUN;

另一種寫法: 以下的寫法很重要, 很多稍複雜的問題可以用以下的觀念解決.

引進內部變數 _N_
在第一筆時 做initial

[1] DATA AA;
[2]  SET D;
[3]  RETAIN ACC;
[4]  if (_N_=1) then ACC=1.0;
[5]  ACC=ACC*(1+R);
[6]  ACCR=ACC-1; Drop ACC;
[7] RUN;


到這裡應可以解決大部分的問題.
如果有新問題可以留下問題, 我們可以交流一些想法.

相關文章:

  [Data Step][SAS] INTERAL VARIABLE(內部變數) _N_

  [SAS] 文字數字互轉, 時間相關, 各種常用格式

   [Data Step][Sas] 徹底研究 DATA STEP 運作原理及觀念

  

arrow
arrow
    文章標籤
    SAS 程式
    全站熱搜
    創作者介紹
    創作者 cianfen 的頭像
    cianfen

    cianfen的部落格

    cianfen 發表在 痞客邦 留言(0) 人氣()