SAS---滞后函数的采用
SAS---the adoption of lag function
我使用以下代码创建了一个新变量,通过分隔不同的 _ric 组来表示 close_midpoint 的先前值。
data test;
set HAVE;
lric=lag(_ric);
if lric=_ric then lclose_midpoint=lag(close_midpoint);
else lclose_midpoint=.;
run;
但是,如下图所示,红色方块中close_midpoint的滞后值等于上一个_ric组中close_midpoint的最后一个值。例如观察7中的lclose_midpoint应该是4.675,而实际结果是4.2。那么我的代码有什么问题呢?谢谢
LAG() 不采用先前观察的值。它创建自己的堆栈并从先前调用中传递给它的值中获取值。由于您只是有条件地调用 LAG(),因此它无法找到您想要的值。
data test;
set HAVE;
by _ric ;
lclose_midpoint=lag(close_midpoint);
if not first._ric then lclose_midpoint=.;
run;
@Tom 展示了如何无条件地使用 lag
,因此副作用是前一行的值。
IFN
可以用来达到两个语句一样的效果。
data want;
set sashelp.cars;
by make;
MSRP_lag_within_group = ifn ( first.make , . , lag(MSRP) );
keep make model MSRP lMSRP;
run;
我使用以下代码创建了一个新变量,通过分隔不同的 _ric 组来表示 close_midpoint 的先前值。
data test;
set HAVE;
lric=lag(_ric);
if lric=_ric then lclose_midpoint=lag(close_midpoint);
else lclose_midpoint=.;
run;
但是,如下图所示,红色方块中close_midpoint的滞后值等于上一个_ric组中close_midpoint的最后一个值。例如观察7中的lclose_midpoint应该是4.675,而实际结果是4.2。那么我的代码有什么问题呢?谢谢
LAG() 不采用先前观察的值。它创建自己的堆栈并从先前调用中传递给它的值中获取值。由于您只是有条件地调用 LAG(),因此它无法找到您想要的值。
data test;
set HAVE;
by _ric ;
lclose_midpoint=lag(close_midpoint);
if not first._ric then lclose_midpoint=.;
run;
@Tom 展示了如何无条件地使用 lag
,因此副作用是前一行的值。
IFN
可以用来达到两个语句一样的效果。
data want;
set sashelp.cars;
by make;
MSRP_lag_within_group = ifn ( first.make , . , lag(MSRP) );
keep make model MSRP lMSRP;
run;