楼主: rita0316
1968 5

如何用sas计算duration [推广有奖]

  • 0关注
  • 0粉丝

高中生

55%

还不是VIP/贵宾

-

威望
0
论坛币
969 个
通用积分
0.0013
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
353 点
帖子
25
精华
0
在线时间
30 小时
注册时间
2011-10-23
最后登录
2019-11-26

楼主
rita0316 发表于 2015-1-8 13:30:54 |AI写论文
2论坛币
想请教大家这样一个问题:
我的data如下,我想创建一个新的variable,计算每一个ID下发生EVENT的duration,比如对ID=1 duration就是8,对ID=2来说duration就是当YEAR=1981 duration=4, YEAR=1982 duration=1,YEAR=1990 duration=8 这样, 每次当有EVENT发生时,ID 的duration起始日按上一个EVENT 的发生日开始算,每个ID的第一个observation无论是否有EVENT,都不算duration。
ID      YEAR          EVENT
1        1990             0
1        1995             0
1        1996             0
1        1998             0
2        1977             1
2        1980             0
2        1981             1
2        1982             1
2        1990             1
2        1991             0
2        1992             0
2        1993             0
3        1996             1
4        1992             0
4        1993             0
4        1994             1
4        1995             0
4        1996             0

最佳答案

mingfeng07 查看完整内容

改成下面这样:
关键词:计算duration Duration ration ATION ratio 计算duration

沙发
mingfeng07 学生认证  发表于 2015-1-8 13:30:55
rita0316 发表于 2015-1-9 16:34
你好,id=1 duration=8 是指这个观测对象在sample period里没有发生event,所以duration算作censored时间 ...
改成下面这样:
  1. data c;
  2. set a;
  3. by ID YEAR;
  4. retain base;
  5. if first.ID then do;base=YEAR; DURATION=.;end;
  6. else if EVENT=1 then do;DURATION=YEAR-base; base=YEAR;end;
  7. else DURATION=.;
  8. if last.ID and EVENT=0 then DURATION=YEAR-base;
  9. run;
复制代码

藤椅
mingfeng07 学生认证  发表于 2015-1-8 19:32:09
不知道你的id=1duration为8这个duration位置是在何处,另外如果一类id中只出现一个event如何处置?
  1. data a;
  2. input ID      YEAR          EVENT;
  3. cards;
  4. 1        1990             0
  5. 1        1995             0
  6. 1        1996             0
  7. 1        1998             0
  8. 2        1977             1
  9. 2        1980             0
  10. 2        1981             1
  11. 2        1982             1
  12. 2        1990             1
  13. 2        1991             0
  14. 2        1992             0
  15. 2        1993             0
  16. 3        1996             1
  17. 4        1992             0
  18. 4        1993             0
  19. 4        1994             1
  20. 4        1995             0
  21. 4        1996             0
  22. ;
  23. run;
  24. data b(drop=id1);
  25. set a;
  26. by id year;
  27. retain value 0;
  28. if event=1 then do;duration=year-value;value=year;id1=lag(id);end;
  29. if first.id or id^=id1 then duration=.;
  30. run;
复制代码

板凳
rita0316 发表于 2015-1-9 16:34:40
mingfeng07 发表于 2015-1-8 19:32
不知道你的id=1duration为8这个duration位置是在何处,另外如果一类id中只出现一个event如何处置?
你好,id=1 duration=8 是指这个观测对象在sample period里没有发生event,所以duration算作censored时间减去起始观测时间,如果一类id中只出现一个event,如id=4,那么算作有两个duration,第一个duration是1992至1994,第二个是1994至1996(censored)。
我原来写的code是这样的:
data a;
set a;
by ID YEAR;
retain base lag_base;
if first.ID then base=YEAR & lag_base=YEAR & DURATION=.;
else if EVENT=1 then DURATION=YEAR-base & lag_base=YEAR;
else DURATION=.;
base=lag_base;
if last.ID & EVENT=0 then DURATION=YEAR-base;
run;
但是这个存在问题,不能达到我想要的结果,我也不知道问题出在哪里。谢谢!

报纸
Tigflanker 发表于 2015-1-10 22:18:44
  1. data want;
  2.   if 0 then set have;
  3.   if _n_ = 1 then do;
  4.     dcl hash h();
  5.         h.definekey('id');
  6.         h.definedata('year_h');
  7.         h.definedone();
  8.   end;

  9.   set have;
  10.     by id;

  11.   year_h = year;
  12.   if ~first.id and ~h.find() then duration = year - year_h;
  13.   if first.id or event then h.replace(key:id,data:year);
  14. run;
复制代码

地板
rita0316 发表于 2015-1-14 13:57:32
mingfeng07 发表于 2015-1-8 13:30
改成下面这样:
这下是工作正常的,多谢回答!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-2-3 21:23