Sas 滞后函数不';不完整

Sas 滞后函数不';不完整,sas,lag,Sas,Lag,我正在构建一个生命表。我的数据如下所示: age npx ================= 0-1 0.996 1-4 0.9955 5-9 0.9966 我想构造一个新变量lx。age=“0-1”的lx值为100000。 对于上一条记录,“1-4”的值将为lx*npx 这是我的密码: if age = "0-1" then lx = 100000; lag_lx = lag1 (lx); lag_npx = lag1 (npx); lx =

我正在构建一个生命表。我的数据如下所示:

age    npx       
=================
0-1    0.996
1-4    0.9955
5-9    0.9966
我想构造一个新变量
lx
age=“0-1”
lx
值为
100000
。 对于上一条记录,
“1-4”
的值将为
lx*npx

这是我的密码:

 if age = "0-1" then lx = 100000;
 lag_lx  = lag1 (lx);
 lag_npx = lag1 (npx);

 lx = lag_lx * lag_npx;
发生的情况是,程序在第二条记录之后停止计算
lx

从上的记录3开始,
lx
具有
(缺失)

问题在于,仅当使用滞后时,才将值存储在滞后中。来自support.sas.com:“仅当函数执行时,才会在队列底部存储值并从队列顶部返回值。有条件执行的LAGn函数的出现将仅存储和返回满足条件的观察值。”

这段代码并不漂亮,可以改进,但它确实做到了

data have;
    input age $ npx;
    datalines;
0-1    0.996
1-4    0.9955
5-9    0.9966
;

data want;
    set have;   
    IF _N_ = 1 Then lx = 100000;
            lag_lx  = lag(lx);
            lag_npx = lag(npx);
    IF _N_ ne 1 Then lx = lag_lx * lag_npx;
            lag_lx  = lag(lx);
            lag_npx = lag(npx);
    IF _N_ ne 1 Then lx = lag_lx * lag_npx;
RUN;

我会沿着
ifn
的路线走,因为它不会弄乱你认为的滞后值,而且它使代码非常简单(请阅读)。您还需要@Alex a所述的
retain
语句

data have;
    input age $ npx;
    datalines;
0-1    0.996
1-4    0.9955
5-9    0.9966
;

data want;
set have;
retain lx;
lx = ifn(age='0-1',100000,lx*lag(npx));
run;

在数据的每次迭代中,
lx
被初始化为missing,如果
age=“0-1”
,则只分配
lx
。但这种情况只在第一条记录中成立,因此其他记录中缺少
lx
。要解决这个问题,添加
retainlx
位于数据步骤的顶部。诀窍是在
ifn
语句中使用
lag
,或者将
lag
语句放在
if
语句之前。按照@Alex a的建议,使用
retain
语句可以解决另一个问题(这意味着如果答案中有
语句,您就不需要那么多的
)。Vasili-我的意思是:是的,这很有效,尽管在我意识到右侧的lx是(保留的)旧值之前,它看起来并不正确,而左边的lx是新计算的值。非常感谢。