使用 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)
我正在尝试创建一个数据步骤,在我的 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)