前のページ|次のページ

LAG関数

キューから値を返します。

カテゴリ: 特殊

構文

LAG <n> (argument)

必須引数

引数

数値または文字の定数、変数、式のいずれかを指定します。

オプション引数

n

ラグ値の数を指定します。

詳細

基本

まだ長さが割り当てられていない文字変数にLAG関数から値が返される場合、変数にはデフォルトで長さ200が割り当てられます。
LAG関数、LAG1、LAG2、...、LAGnは、キューから値を返します。LAG1はLAGと記述することもできます。LAGn関数は、値をキューに格納してそのキューに以前格納されていた値を返します。プラグラム内の各LAGn関数によって、値の独自のキューが生成されます。
各LAGnの発生時のキューは、n個の欠損値で初期化されます。nはキューの長さです(たとえば、LAG2キューは2個の欠損値で初期化されます)。各LAGnの発生時に、そのキューの先頭の値が削除されて返され、残りの値が前にシフトされ、引数の新しい値がキューの最後に配置されます。そのため、引数のラグ値が登場し始めると、各LAGnの発生時の最初のn回の実行で欠損値が返されます。
注: この関数が実行された場合にのみ、値がキューの最後に格納されてキューの先頭から値が返されます。条件付きで実行されるLAGn関数は、条件を満たすオブザベーションからのみの値を格納して返します。
LAGnの引数が配列名の場合、配列内の各変数に対して個別のキューが保持されます。

LAG関数のメモリ制限

LAG関数がコンパイルされるときに、SASはキューにメモリを割り当て、LAG関数にリストされた変数の値を保持します。たとえば、関数LAG100(x)の変数が8バイトの長さの数値の場合、必要なメモリは8の100倍の800バイトです。そのため、LAG関数のメモリ制限はSASが割り当てるメモリに基づき、動作環境によって異なります。

例1: 2つのラグ値を生成する

次のプログラムでは、各オブザベーションで2つのラグ値を生成します。
data one;
   input x @@;
   y=lag1(x);
   z=lag2(x);
   datalines;
1 2 3 4 5 6
;
proc print data=one;
   title 'LAG Output';
run;
2つのラグ値の生成からの出力
2つのラグ値の生成からの出力
LAG1は1つの欠損値とXの値を返します(1回のラグ)。LAG2は2つの欠損値とXの値を返します(2回のラグ)。

例2: BYグループで複数のラグ値を生成する

各BYグループ内で最大3つのラグ値を生成する方法の例を次に示します。
/***************************************************************************/
/* This program generates up to three lagged values.  By increasing the    */
/* size of the array and the number of assignment statements that use      */
/* the LAGn functions, you can generate as many lagged values as needed.   */
/***************************************************************************/
/* Create starting data. */  
data old;
  input start end;
datalines;
1 1
1 2
1 3
1 4
1 5
1 6
1 7
2 1
2 2
3 1
3 2
3 3
3 4
3 5
;
data new(drop=i count);
  set old;
  by start;
  /* Create and assign values to three new variables.  Use ENDLAG1-      */
  /* ENDLAG3 to store lagged values of END, from the most recent to the  */
  /* third preceding value.                                              */   
  array x(*) endlag1-endlag3;
  endlag1=lag1(end);
  endlag2=lag2(end);
  endlag3=lag3(end);
  /* Reset COUNT at the start of each new BY-Group */
  if first.start then count=1;
  /* On each iteration, set to missing array elements   */
  /* that have not yet received a lagged value for the  */
  /* current BY-Group.  Increase count by 1.            */   
  do i=count to dim(x);
    x(i)=.;
  end;
  count + 1;
run;
proc print;
run;
 
3つのラグ値の生成からの出力
3つのラグ値の生成からの出力

例3: データセット全体の変数の移動平均を計算する

次の例では、データセット全体の変数の移動平均を計算します。
data x; 
do x=1 to 10; 
  output; 
  end; 
run;
/* Compute the moving average of the entire data set. */
data avg;
retain s 0;
set x;
s=s+x;
a=s/_n_;
run;
proc print;
run;
変数の移動平均の計算からの出力
データセット全体の変数の移動平均計算結果の出力。

例4: 最後のn個のオブザベーションの変数の移動平均を計算する

次の例では、最後のn個のオブザベーションの変数の移動平均を計算します。
data x; 
do x=1 to 10; 
  output; 
  end; 
run;
%let n=5;
data avg (drop=s);
retain s;
set x;
s=sum (s, x, -lag&n(x)) ;
a=s / min(_n_, &n);
run;
proc print;
run;
最後のn個のオブザベーションの変数の移動平均計算結果の出力。

例5: BYグループ内の最後のn個のオブザベーションの変数の移動平均を計算する

次の例では、BYグループ内の最後のn個のオブザベーションの変数の移動平均を計算します。
data x; 
do x=1 to 10; 
  output; 
  end; 
run;
data ds1;
do patient='A','B','C';
 do month=1 to 7;
  num=int(ranuni(0)*10);
  output;
 end;
end;
run;
proc sort;
by patient;
%let n = 4;
data ds2;
set ds1;
by patient;
retain num_sum 0;
if first.patient then do;
  count=0;
  num_sum=0;
end;
count+1;
last&n=lag&n(num);
if count gt &n then num_sum=sum(num_sum, num, -last&n);
else num_sum=sum(num_sum, num);
if count ge &n then mov_aver=num_sum/&n;
else mov_aver=.;
run;
proc print;
run;
BYグループ内の最後のn個のオブザベーションの変数の移動平均計算結果の出力。

例6: フィボナッチ数列を生成する

次の例では、フィボナッチ数列を生成します。0と1で開始し、前の2つのフィボナッチ数を追加して次のフィボナッチ数を生成します。
data _null_;
   put 'Fibonacci Sequence';
   n=1;
   f=1;
   put n= f=;
   do n=2 to 10;
      f=sum(f, lag(f));
      put n= f=;
   end;
run;
次の出力がログに書き込まれます。
Fibonacci Sequence n=1 f=1 n=2 f=1 n=3 f=2 n=4 f=3 n=5 f=5 n=6 f=8 n=7 f=13 n=8 f=21 n=9 f=34 n=10 f=55

例7: LAG関数の引数に式を使用する

次のプログラムでは、argumentの値に式を使用し、X、YおよびZの値を含むデータセットを作成します。LAGは式の前の値をキューから取り出し、現在の値をキューに追加します。
data one;
   input X @@;
   Y=lag1(x+10);
   Z=lag2(x);
   datalines;
1 2 3 4 5 6
;
proc print;
   title 'Lag Output: Using an Expression';
run;
式を使用したLAG関数からの出力式の使用
式を使用したLAG関数からの出力式の使用

関連項目:

関数:
前のページ|次のページ|ページの先頭へ