使用LAG对SAS中的多个LAG求和

使用LAG对SAS中的多个LAG求和,sas,lag,datastep,Sas,Lag,Datastep,我正在尝试做一个数据步骤,在我的表中创建一个列,该列包含10个、15个、20个和45个滞后变量的总和。我下面所说的是可行的,但是为25和45个总滞后编写代码是不可行的。我是SAS的新手,找不到编写代码的好方法。任何帮助都将不胜感激 以下是我所拥有的: data averages; set work.cuts; sum_lag_ten = (lag10(col) + lag9(col) + lag8(col) + lag7(col) + lag6(col) + lag5(col) + lag4(c

我正在尝试做一个数据步骤,在我的表中创建一个列,该列包含10个、15个、20个和45个滞后变量的总和。我下面所说的是可行的,但是为25和45个总滞后编写代码是不可行的。我是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;

如果您必须在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,只能求和[*])

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)


你们有SAS/ETS吗?我想没有,但我不熟悉SAS/ETS是什么。我使用环境SAS enterprise guide 5.1。SAS/ETS是SAS的“时间序列”模块。它与您使用的IDE无关。@Reeza,我有SAS/ETS。谢谢Joe的澄清。听起来不错,@Reeza可能会提供ETS解决方案,我对ETS不太在行,只会给你数据步解决方案(我认为它不如ETS好,所以我会等待该解决方案的使用/接受!)谢谢代码,它工作得很好。当我开始研究SAS/ETS时,你告诉我要学习proc expand。我从你的帮助中学到了很多。链接也很棒。非常感谢。