2017-03-19 59 views
1

我有以下的數據集,結構如下:條件IF語句與滯後值

DATE   PERCENTAGE FLAG VALUE1 
01JAN2017  0.21   1  1.50 
04JAN2017  0.05   0  2.43 
09JAN2017  0.06   1  2.21 
24JAN2017  0.15   1  1.13 

我有新的變量添加到數據集,使得這些變量將滿足以下條件:

  1. 在殼體FLAG等於1,它的第一行,則:
NEW_VAR_1 is equal to 500 * PERCENTAGE; 
NEW_VAR_2 is equal to NEWVAR_1 * (VALUE1 - 1); 
NEW_VAR_3 is equal to 500 + NEWVAR_2; 
  • 在這種情況下FLAG等於1,它不是第一行,則:
  • NEW_VAR_1 is equal to LAG(NEWVAR_3) * PERCENTAGE; 
    NEW_VAR_2 is equal to NEWVAR_1 * (VALUE1 - 1); 
    NEW_VAR_3 is equal to LAG(NEWVAR_3) + NEWVAR_2; 
    
  • 在這種情況下是FLAG等於0,則所有的NEWVAR_值必須被失蹤設置。
  • 我需要運行在SAS這個劇本,我寫了下面的腳本下做到這一點:

    DATA BACKTESTING; 
        SET BACKTESTING; 
        IF _N_ EQ 1 AND FLAG EQ 1 THEN DO; 
         K = 500; 
         NEWVAR_1 = PERCENTAGE * K; 
         NEWVAR_2 = NEWVAR_1 * (VALUE_1 - 1); 
         NEWVAR_3 = K + NEWVAR_2; 
        END; 
        ELSE IF _N_ GT 1 AND FLAG EQ 1 THEN DO; 
         NEWVAR_1 = PERCENTAGE * LAG(NEWVAR_3); 
         NEWVAR_2 = NEWVAR_1 * (VALUE_1 - 1); 
         NEWVAR_3 = K + NEWVAR_2; 
         END; 
        END; 
    RUN; 
    

    該腳本正常工作,在這個意義上,我沒有看到錯誤或警告消息在日誌窗口,但是,正如您通過閱讀腳本可以注意到的那樣,它會在滯後變量中找到缺失值時返回缺失值。

    有沒有辦法克服這個問題,爲了能讓SAS只有在FLAG等於1時纔會採用NEWVAR_3的滯後?

    在此希望我已經在這個問題不夠清楚,感謝所有預先的幫助!

    回答

    2

    lag的問題是,它實際上並不讀取以前的值。相反,它每次調用時都會將當前值添加到隱藏數組中,然後在隨後的調用中檢索該值。

    所以 - 如果你不叫lag在每次迭代(或稱之爲兩次),你會得到意想不到的效果。爲了避免這種

    一種方法是使用一個簡單的retain,例如如下:

    DATA BACKTESTING; 
        SET BACKTESTING; 
        IF _N_ EQ 1 AND FLAG EQ 1 THEN DO; 
        K = 500; 
        NEWVAR_1 = PERCENTAGE * K; 
        NEWVAR_2 = NEWVAR_1 * (VALUE_1 - 1); 
        NEWVAR_3 = K + NEWVAR_2; 
        END; 
        ELSE IF _N_ GT 1 AND FLAG EQ 1 THEN DO; 
        NEWVAR_1 = PERCENTAGE * LAG_NEWVAR_3; 
        NEWVAR_2 = NEWVAR_1 * (VALUE_1 - 1); 
        NEWVAR_3 = K + NEWVAR_2; 
        END; 
        END; 
        /* create temp retain variable */ 
        retain LAG_NEWVAR_3 0; 
        drop LAG_NEWVAR_3; 
        LAG_NEWVAR_3=NEWVAR_3; 
    RUN; 
    

    的文檔的滯後函數:http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212547.htm

    1

    LAG()返回從先前的時候,它運行的價值。如果您有條件地致電LAG(),那麼它將有一個發現的記錄值列表。

    您的邏輯可以被簡化了不少。

    DATA BACKTESTING; 
        SET BACKTESTING; 
        k = lag(newvar_3); 
        IF _N_ EQ 1 then k=500 ; 
        if FLAG EQ 1 THEN DO; 
        NEWVAR_1 = PERCENTAGE * K; 
        NEWVAR_2 = NEWVAR_1 * (VALUE_1 - 1); 
        NEWVAR_3 = K + NEWVAR_2; 
        END; 
    RUN; 
    

    但如果NEWVAR_3確實是一個「新」變量,然後它會丟失每次lag(newvar_3)運行和您的滯後值將永遠丟失。在這種情況下,您需要保留之前觀察值。

    DATA BACKTESTING; 
        SET BACKTESTING; 
        retain k 500 ; 
        if FLAG EQ 1 THEN DO; 
        NEWVAR_1 = PERCENTAGE * K; 
        NEWVAR_2 = NEWVAR_1 * (VALUE_1 - 1); 
        NEWVAR_3 = K + NEWVAR_2; 
        k = newvar_3 ; 
        END; 
    RUN; 
    
    +0

    感謝@Tom提供的解釋和腳本示例。 – Quantopik