0

我在 SAS 中有一个面板/纵向数据集。

一个字段表示一个类或类型,另一个字段表示没有中断的时间点,另一个是观察到的历史,另一个是所述历史的对数差异预测。我想添加一个新字段:历史字段,由预测字段推进。

因此,如果时间字段在“未来”,我想递归地推进我的目标变量,它有自己的滞后,乘以对数差异预测变量的 exp。在我看来,这是一个微不足道的操作。

我试图用下面的玩具数据集来复制这个问题。

data in;
input class time hist forecast;
datalines;
1   1  100 .
1   2   .  .1
1   3   .  .15
1   4   .  .17
2   1  100 .
2   2   .  .18
2   3   .  .12
2   4   .  .05
run;

proc sort data=work.in;
by class time;
run;

data out;
    set in;
    by class time;
retain goal hist;
if time > 1 then goal= lag1(goal) * exp(forecast); 
run;
4

1 回答 1

1

J.P:

你可能想要这个:

data out;
    set in;
    by class time;

    retain goal;

    if first.class 
      then goal=hist;
      else goal = goal * exp(forecast);
run;

保留非数据集变量主要可以被认为是 lag1 类型的堆栈。初始目标需要在每组开始时重新设置。

您的第一次尝试是有条件地 LAG1'ng 保留变量,而 BY 组处理 - 让我头晕目眩。LAG-n 很棘手,因为隐式 LAG 堆栈仅在处理流经过它时才会更新。如果条件绕过 LAG 函数调用,则 LAG 堆栈无法更新。如果您确实在其他 SAS 编码中看到 LAG,它可能会出现在任何 if 之前的无条件位置。

注意:保留数据集变量(例如hist)是非典型的,因为它们的值在到达 SET 语句时会被覆盖。非典型情况是在 SET 语句之前测试保留的数据集变量具有功能目的。

于 2017-11-15T01:21:54.807 回答