2012-02-28 8 views
3

では動作しません(oldindexとoldreadmitは称賛を保持である)。私のプログラムの一部であるラグ機能は、ここでSAS

問題は、それが= 1をreadmit、その後oldindex = 1のために動作しますがないです遅れ(oldreadmit)= 1、次に、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つの観測があり、処理中に2つ目の観測をスキップするif文があるとします。 3番目の観測にラグ関数を適用すると、最後の観測が処理されたのは最初の観測のため、最初のの観測値ではなく2番目の観測値を返します。

これは、lagsとif文を組み合わせるときに注意してください。あなたのコードでは、ifステートメントがtrueの場合にのみ実行される節に遅れがあります。これはあなたに奇妙な結果を与えるでしょう。何をすべきかは、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

ニース説明... –

+0

みんなありがとう。大いに役立ちます。ジェーン – user1238178

1

Itzyが混乱してlag機能の予期しない動作上の言うように。幸運なユーザーはすぐに問題を抱え、不運なユーザーは問題が発生していることを知る前に長い時間を過ごすことがあります。このような理由から、私はラグ機能を完全に避けています。間違って使用するのは簡単すぎるので、簡単に避けることができる間違いから身を守りたい。そうすれば、より多くの時間をコーディングし、デバッグ時間を短縮できます。

私はちょうどretainステートメントを使用することをお勧めします。誰もがどのように動作し、変数間の関係を理解し​​ている、retainステートメントとifステートメントがよく理解されています。

3

バージョン9以降のラグ関数を使用したもう1つのヒントでは、標準IF文で発生する問題に惑わされないIFN関数とIFC関数を使用できます。次のコードの結果を見ると、私の言いたいことがわかります。

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

0

LAG関数は、以前の観測値からの変数の値を返すのではなく、キューから返すため、混乱させる可能性があります。キューは、最後に呼び出されたときに基づいて作成されます。トピックに関する記事 -

http://analyticsworld.in/aw/the-perils-of-the-lag-function/