【问题标题】:Summing Multiple lags in SAS using LAG使用 LAG 对 SAS 中的多个滞后求和
【发布时间】:2016-12-08 20:44:08
【问题描述】:

我正在尝试创建一个数据步骤,在我的表中创建一个列,其中包含十个、十五个、二十个和四十五个滞后变量的总和。我在下面的工作,但是为二十和四十五个总滞后编写此代码是不切实际的。我是 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 吗?
  • 我不这么认为,但我不熟悉 SAS/ETS 是什么。我使用环境SAS企业指南5.1。
  • SAS/ETS 是 SAS 的“时间序列”模块。它与您使用的 IDE 无关。
  • @Reeza,我确实有 SAS/ETS。感谢乔的澄清。
  • 听起来不错,@Reeza 或许可以提供 ETS 解决方案,我在 ETS 方面不太专业,只会给你数据步骤解决方案(在我看来,它不如 ETS,所以我会等待该解决方案使用/接受!)

标签: sas lag datastep


【解决方案1】:

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

【讨论】:

  • 感谢代码,它运行良好。当我开始研究 SAS/ETS 时,您提示我学习 proc expand。我从你的帮助中学到了很多东西。很好的链接。谢谢!
【解决方案2】:

如果您必须在 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 求和,你只需要对 [*] 求和)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 2022-06-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    相关资源
    最近更新 更多