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是新计算的值。非常感谢。