2015-04-23 223 views
2

我正在构建一张人生表。我的数据如下所示:滞后功能未完成

age npx  
================= 
0-1 0.996 
1-4 0.9955 
5-9 0.9966 

我想构建一个新变量lxage="0-1"的值lx100,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已有.(缺失)

+0

表示在lx'被初始化为丢失数据跳跃'的每一次迭代,而且只有指定'lx'如果'年龄=“0-1” '。但是这种情况在第一条记录中才是真实的,所以'lx'在其他记录中不存在。要解决这个问题,请在数据步骤的顶部添加'retain lx;'。 –

回答

0

问题是仅当使用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; 
+0

诀窍是在'ifn'语句中使用'lag'或在'if'语句之前放置'lag'语句。使用@Alex A建议的'retain'语句将解决另一个问题(并且意味着您的答案中不需要多少'if语句)。 – Longfish

+0

Vasili - 这里是我输入的: – Maringo7

4

我会在这里下井ifn路线,因为它不会搞砸了你的想法是滞后的价值和它使代码非常简单(有this paper读)。您还需要一个retain声明由@Alex A.

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; 
+0

是的,这个工作,虽然它看起来不正确,直到我意识到右边的lx是(保留的)旧值,而左边的lx是新的计算值。谢谢。 – Maringo7