我的问题是 - 我正在创建一个列(discont_faktor)来自另一个(disc_pc_nonann),其创建公式根据行号而不同。
对于第1行,函数是diskont_faktor = 1 / disc_pc_nonann;
对于第2行到第n行,该函数是diskont_faktor = diskont_faktor(t-1)/ disc_pc_nonann;
我尝试了以下代码:
data soubor2;
set srv.data;
disc_pc_nonann = (1+DISC_PC/100)**(1/12);
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
else diskont_faktor = lag1(diskont_faktor)/disc_pc_nonann;
run;
但是SAS不计算行的值> 1。 是否有一些特定原因导致函数滞后在此代码设置中不起作用?
我甚至试过这个版本都没有成功:
data soubor2;
set srv.data;
disc_pc_nonann = (1+DISC_PC/100)**(1/12);
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
else do; y=lag1(diskont_faktor);
diskont_faktor = y/disc_pc_nonann;
end;
run;
感谢您提出我的错误建议。
答案 0 :(得分:4)
LAG()
函数不返回上一次观察的值。相反,它会从调用它生成的堆栈中返回先前的值。因此,通过仅对某些观察执行lag(),您没有正确地堆叠值。
解决此问题的一种简单方法是将LAG()
函数调用的值放入变量中。这样它就可以运行每个观察,因此它总是返回先前的值。然后,您可以根据需要有条件地引用变量,而不会中断LAG()
函数的值流。
lag_diskont_faktor=lag(diskont_faktor);
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
else diskont_faktor = lag_diskont_faktor/disc_pc_nonann;
但是对于你的问题,看起来你真的不需要使用LAG()。您可以使用RETAIN
来阻止SAS在开始下一次DATA步骤迭代时将新变量设置为缺失。
retain diskont_faktor;
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
else diskont_faktor = diskont_faktor/disc_pc_nonann;
您甚至可以在RETAIN
语句中设置变量的初始值并简化代码。
retain diskont_faktor 1;
diskont_faktor = diskont_faktor/disc_pc_nonann;
答案 1 :(得分:1)
您需要在程序开始时初始化变量diskont_faktor,因此请在开头添加retain diskont_faktor;
。
第一次调用lag1会返回一个。 ,因为那时队列是空的,所以对于_n_ = 2
,它只会返回队列中_n_= 1
的值。 _n_ = 3
应该有效,但会将_n_=2
中的空结果存储在队列中。因为n=2
您没有结果,_n_=
4将不再返回任何内容。这种情况一直在继续,因此你得到奇数_n_
的结果,偶数_n_.
没有结果
所以我不知道如何解决这个问题, 但我可以为你提供一个没有滞后的替代解决方案:
data soubor2 (drop=diskont_faktor_old);
retain diskont_faktor_old;
set srv.data;
disc_pc_nonann = (1+DISC_PC/100)**(1/12);
if _n_ = 1 then diskont_faktor = 1/disc_pc_nonann;
else diskont_faktor = diskont_faktor_old/disc_pc_nonann;
diskont_faktor_old=diskont_faktor;
run;