我试图创建一个数据步骤,在我的表中创建一个列,其中包含十个,十五个,二十个和四十五个滞后变量的总和。我的下面的作品是有效的,但是为二十四十五个总和的滞后写这个代码并不实际。我是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;
答案 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)
答案 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总和,你只需加总[*])。