4

我正在尝试计算 SAS 中的一列,该列依赖于自身。例如,我有以下初始值列表

    ID Var_X Var_Y Var_Z
     1     2     3     .   
     2     .     2     .
     3     .     .     .
     4     .     .     .
     5     .     .     .
     6     .     .     .
     7     .     .     .

我需要填补空白。公式如下:

    Var_Z = 0.1 + 4*Var_x + 5*Var_Y
    Var_X = lag1(Var_Z)
    Var_Y = lag2(Var_Z)

正如我们看到的 Var_X、Var_Y 和 Var_Z 的值是相互依赖的。所以计算需要遵循特定的顺序。

First we compute when ID = 1, Var_Z = 0.1 + 4*2 + 5*3 = 23.1
Next, when ID = 2,  Var_X = lag1(Var_Z) = 23.1

Var_Y 在 ID = 2 时不需要计算,因为我们这里已经有了初始值。所以,我们有

    ID Var_X Var_Y Var_Z
     1     2     3  23.1   
     2   23.1    2  102.5 (= 0.1 + 4*23.1 +5*2)
     3     .     .     .
     4     .     .     .
     5     .     .     .
     6     .     .     .
     7     .     .     .

我们不断重复这个过程,直到计算出所有的值。

有没有办法,SAS可以处理这个?我尝试了 DO 循环,但我想我没有做好正确的编码工作。它在 ID = 2 后停止。

我是 SAS 的新手,所以不熟悉 SAS 是否有办法轻松处理这个问题。将等待您的建议。

4

2 回答 2

5

如果您只是在单个数据步骤中执行此操作,则不需要使用 LAG 或 RETAIN。DO 循环本身会很好地处理事情。只有当我们做一些涉及预先存在的数据集的事情时,才需要 RETAIN,但实际上没有理由使用它。

我在这里使用了一个快捷方式——虽然你用 VAR_Z 来描述 VAR_Y,但你的意思是在一次迭代之后,VAR_Z 移动到 VAR_X 并且 VAR_X 移动到 VAR_Y,所以我这样做(以正确的顺序不要混淆) .

data test_data;
if _n_ = 1 then do;
var_x=2;
var_y=3;
end;
do _iter = 1 to 7;
  var_z = 0.1+4*var_x+5*var_y;
  output;
  var_y=var_x;
  var_x=var_z;
end;
run;
proc print data=test_data;
run;
于 2012-09-08T02:24:32.030 回答
2

我相信您可以在 DO 循环中执行此操作 - 关键是让 SAS 记住变量的最后一个值。我的建议是寻找一个简单的“计数器”程序,在伪 SAS 代码中,它类似于:

Do i = 1 to 100;
   i = i + 1;
run;

并查看 SAS 中的实际语法。我怀疑您的问题是您没有在 DO 循环中使用保留语句。检查 SAS 文档,看看它是否解决了您的问题?

于 2012-09-07T22:00:08.910 回答