我正在构建一个生命表。我的数据如下所示:
age npx
=================
0-1 0.996
1-4 0.9955
5-9 0.9966
我想构造一个新的变量lx
。age="0-1"
的lx
值为100,000
。对于前一条记录,"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
具有.
(缺失)
发布于 2015-04-23 19:01:44
我在这里走ifn
路线,因为它不会搞砸您认为的滞后值,而且它使代码非常简单(请阅读this paper)。您还需要@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;
发布于 2015-04-23 16:23:53
问题是只有在使用LAG时,这些值才会存储在LAG中。来自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;
https://stackoverflow.com/questions/29812075
复制相似问题