使用LAG汇总SAS中的多个滞后

时间:2016-12-08 20:44:09

标签: sas lag datastep

我试图创建一个数据步骤,在我的表中创建一个列,其中包含十个,十五个,二十个和四十五个滞后变量的总和。我的下面的作品是有效的,但是为二十四十五个总和的滞后写这个代码并不实际。我是SAS的新手,无法找到编写代码的好方法。任何帮助将不胜感激。

以下是我所拥有的:

data averages;
set work.cuts;
sum_lag_ten = (lag10(col) + lag9(col) + lag8(col) + lag7(col) + lag6(col) + lag5(col) + lag4(col) + lag3(col) + lag2(col) + lag1(col));
run;

2 个答案:

答案 0 :(得分:4)

Proc EXPAND允许轻松计算移动统计数据。 从技术上讲,它需要一个时间组件,但是如果你没有时间组件,你可以做一个,只需确保它是连续的。行号可以工作。

鉴于此,我不确定它的代码较少,但它更容易阅读和输入。如果您正在计算多个变量,那么它的可扩展性要高得多。

Transformout指定转换,在这种情况下是具有10个周期的窗口的移动总和。 Trimleft / right可用于确保仅包含整整10天的记录。 您可能需要根据您想要的内容进行调整。 PROC EXPAND下的第三个例子有例子。

 Data have;
  Set have;
  RowNum = _n_;
  Run;

Proc EXPAND data=have out=want;
ID rownum;
Convert col=col_lag10 / transformout=(MOVSUM 10 trimleft 9);
Run;

文档(SAS / STAT 14.1)

http://support.sas.com/documentation/cdl/en/etsug/68148/HTML/default/viewer.htm#etsug_expand_examples04.htm

答案 1 :(得分:3)

如果你必须在datastep中这样做(如果你经常这样做,SAS / ETS肯定有更好的工具),我会这样做。

data want;
  set sashelp.steel;
  array lags[20];
  retain lags1-lags20;

  *move everything up one;
  do _i = dim(lags) to 2 by -1;
    lags[_i] = lags[_i-1];
  end;

  *assign the current record value;
  lags[1] = steel;

  *now calculate sums;
  *if you want only earlier records and NOT this record, then use lags2-lags11, or do the sum before the move everything up one step;
  lag_sum_10 = sum(of lags1-lags10);  
  lag_sum_15 = sum(of lags1-lags15);  *etc.;
run;

注意 - 这不是最好的解决方案(我认为散列表更好),但对于更中级的程序员来说这更好,因为它使用数据步变量。

我不使用临时数组,因为你需要使用变量快捷键来做总和;对于临时阵列,你不能得到它,不幸的是(所以没有办法只用1-10总和,你只需加总[*])。