我正在尝试在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是否可以轻松处理这个问题。将等待你的建议。
答案 0 :(得分: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;
答案 1 :(得分:2)
我相信你可以在DO循环中做到这一点 - 关键是让SAS记住变量的最后一个值。我的建议是为了一个简单的“计数器”程序,它在伪SAS代码中是这样的:
Do i = 1 to 100;
i = i + 1;
run;
看看SAS的实际语法是什么。我怀疑你的问题是你没有在DO循环中使用 retain 语句。检查SAS文档,看看它是否解决了您的问题?