使用 LAG 在 SAS 中总结多个滞后

Summing Multiple lags in SAS using LAG

我正在尝试创建一个数据步骤,在我的 table 中创建一个列,其中包含十个、十五个、二十个和四十五个滞后变量的总和。我在下面的内容有效,但为二十和四十五总和滞后编写此代码是不切实际的。我是 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;

如果你必须在数据步骤中这样做(如果你经常这样做,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;

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

我不使用临时数组,因为您需要使用变量快捷方式来求和;不幸的是,对于临时数组,您无法理解(因此无法仅对 1-10 求和,您必须仅对 [*] 求和)。

Proc EXPAND 允许轻松计算移动统计信息。 从技术上讲,它需要一个时间组件,但如果你没有时间组件,你可以自己编一个,只要确保它是连续的即可。行号会起作用。

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

Transformout 指定转换,在本例中为具有 10 个周期的 window 的移动总和。 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/STAT14.1)

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