DIF関数とLAG関数_lag2(x)とlag(lag(x))は同じだけどdif2(x)とdif(dif(x))は違うみたいな話

DIF関数、最近まで知りませんでした。1つ前のオブザベーションの値と今の値との差を返す関数で、dif(x)はx-lag(x)と同義だそうです。
LAG関数は1つ前のオブザベーションの値を返します。lag2(x)とすれば2オブザベーション前のxの値,lag3(x)なら3つ前といったようにlagの後の数字を変えることで調整が効きます(ただし負の値で先のオブザベーションの値をとったりはできませんので、はい残念)
lag2(x)はlag(lag(x))と同じです。1つ前の1つ前は2つ前というわけです。
(脱線ですがlagはif文の中に直接記述すると正しく機能しない性質があるので条件式に使いたい場合は一度割り当てステートメントで新規変数に入れてからそれを使いましょう。知らないと非常に追いにくいエラーの代表的な例です)

ではdif(dif(x))はどんな値を返すのか?また、dif(lag(x))やlag(dif(x))はどんな意味なのか?
それを見てみましょう。

適当にデータセットを作ります。

data Q1;
do i=1 to 10;
 X=ceil(ranuni(777)*20);output;
end;
drop i;
run;


これに対して以下のプログラムを実行します。
頭の体操が好きな方は、結果を予想してからどうぞ。

data A1;
 set Q1;
  DIFX=dif(X);
  DIFDIFX=dif(dif(X));
  DIF2X=dif2(X);
  LAGX=lag(X);
  LAGLAGX=lag(lag(X));
  LAG2X=lag2(X);
  DIFLAG=dif(lag(X));
  LAGDIF=lag(dif(X));
run;






となるわけです。



0 件のコメント:

コメントを投稿