2012-02-28 245 views
3

工作,這是我的計劃的一部分。(oldindex和oldreadmit在保留表彰)滯後功能不會SAS

問題是,它適用於oldindex = 1,則重新接納= 1,但不工作 lag(oldreadmit)= 1 then readmit = 1。你能告訴我有什麼問題嗎?提前致謝!

else if 0< gap <= 30 then do; 
    index_d=0; 
    if lag(oldreadmit)=1 or oldindex=1 then readmit=1; 
     else oth=1; 
    oldindex=index_d; 
    oldreadmit=readmit; 
    end; 

回答

7

的SAS lag功能是很多混亂的一個原因,但一旦你瞭解它是如何工作的很有道理。假設您有3個觀測值,並且您有一條if語句,可以在處理過程中跳過第二個觀測值。如果將滯後函數應用於第三次觀測,它將返回第一個觀測值,而不是第二個觀測值,因爲上次處理任何觀測值都是第一次觀測值。

這意味着什麼,在組合滯後和if語句時要小心。在你的代碼中,你的語句只有在if聲明爲真時纔會被執行。這會給你奇怪的結果。你應該做的是定義一個變量,如l_oldreadmit,等於在之前在if語句中使用它的延遲

這將工作:

l_oldreadmit = lag(oldreadmit); 

if (... whatever you have here ...); 
else if 0< gap <= 30 then do; 
index_d=0; 
if l_oldreadmit=1 or oldindex=1 then readmit=1; 
    else oth=1; 
oldindex=index_d; 
oldreadmit=readmit; 
end; 
+0

尼斯解釋... – 2012-02-28 16:34:19

+0

謝謝大家。這非常有幫助。簡 – user1238178 2012-02-29 14:45:32

1

由於Itzy說上面的lag功能的意外行爲是混亂的。幸運的用戶會立即遇到問題,不幸的用戶可能會很長時間才意識到存在問題(如果他們曾經這樣做)。爲此,我完全避免了滯後函數。錯誤地使用它太容易了,我想保護自己避免犯錯誤,而且很容易避免。這樣我可以花更多的時間編碼和更少的時間調試。

我建議只使用retain聲明。大家都明白它是如何工作的,變量之間的關係retain聲明和if聲明是很好理解的。

3

關於使用滯後函數的另一個提示,從版本9開始,您可以使用干擾和IFC函數,這些函數不會遇到標準IF語句遇到的問題。看看下面的代碼的結果,你會明白我的意思。

data test; 
    input col1; 
    if col1>0 then col2=lag(col1); 
    col3=ifn(col1>0,lag(col1),.); 
    cards; 
    1 
    2 
    0 
    5 
    0 
    4 
    ; 
    run; 

如需更詳細的解釋,請點擊這裏。 http://www.howles.com/saspapers/CC33.pdf

+0

哇,太好了!謝謝。 – itzy 2012-07-30 19:35:33