【问题标题】:Recursively advancing a variable by a growth rate variable in SAS通过SAS中的增长率变量递归推进变量
【发布时间】:2017-11-15 00:27:22
【问题描述】:

我在 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;

【问题讨论】:

    标签: sas time-series panel forecasting longitudinal


    【解决方案1】:

    JP:

    你可能想要这个:

    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 语句之前测试保留的数据集变量具有功能目的。

    【讨论】:

    • 请注意,无需为源自输入数据集的变量添加 RETAIN 语句。此类变量已保留。这就是 MERGE 语句能够进行一对多合并的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多