全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
2148 9
2014-02-25
悬赏 15 个论坛币 已解决

各位坛友:

因时间有限,现有如下问题请教大家,希望集众所长;具体如下:

病人编号


服药日期


治疗剂量


当天服药次数


1


2006-9-30


25


1


1


2006-10-23


30


1


1


2006-10-24


30


1


2


2007-10-2


80


1


2


2007-10-4


90


1


2


2007-10-6


70


1


3


2008-3-1


50


1


3


2008-3-4


40


1


3


2008-3-8


45


1


4


2006-10-1


60


1


4


2006-10-2


35


1


4


2006-10-4


80


1


4


2007-1-1


70


1


4


2007-1-3


60


1


4


2007-1-4


50


1


数据解释:

脱失:以服药日期为准,如果超过7天(>=7)不来服药即为脱失, 4号病人(标红处)。

想要达到的目的:4号病人脱失之前(即2006-10-4之前)为第一段治疗,产生新变量stage=1,4号病人从2007-1-1开始算为第二段治疗即stage=2.其他依此类推。并输出每一段治疗的开始日期和结束日期。

漏服:以服药日期为准,如果小于7天(<7)不来服药即为漏服。如2号(标红)。

目的:1)计算漏服次数、2)计算漏服实际天数,如2号病人漏服 次数=2次,漏服总天数=2天,理论服药天数=53)如果病人有漏服,生成新变量是否为规律漏服如2号间隔均为2天则miss=1,或者某一段治疗中每次漏服间隔都小于等于2天,如4号第一段治疗,则miss=1;其他如3号病人是否规律漏服miss=0.

治疗期分类:治疗2天内(<=2)为适应期during=1310天内(包括第3、第10天)为调整期during=2,大于10天以上(>10during=3

关于剂量调整:3号病人服药剂量从50变为40则调整次数=第一次或1,调整剂量=-10;

              当从40变为45时则调整次数为=第二次或2;调整剂量=5

最后想整理成如下模式见表2

病人编号


服药日期


治疗剂量


Stage


段开始日期


段脱失日期


漏服次数


漏服实际天数


理论服药天数


Miss


治疗分期


调整次数


调整剂量


1


2006-9-30


25


1


2006-9-30


2006-9-30


0


0


1


0


1


0


0


1


2006-10-23


30


2


2006-10-23


2006-10-24


0


0


2


0


1


0


0


1


2006-10-24


30


2


2006-10-23


2006-10-24


0


0


2


0


1


0


0


2


2007-10-2


80


1


2007-10-2


2007-10-6


2


2


5


1


1


0


0


2


2007-10-4


90


1


2007-10-2


2007-10-6


2


2


5


1


2


1


10


2


2007-10-6


70


1


2007-10-2


2007-10-6


2


2


5


1


2


2


-20


3


2008-3-1


50


1


2008-3-1


2008-3-8


2


5


8


0


1


0


0


3


2008-3-4


40


1


2008-3-1


2008-3-8


2


5


8


0


2


1


-10


3


2008-3-8


45


1


2008-3-1


2008-3-8


2


5


8


0


2


2


5


4


2006-10-1


60


1


2006-10-1


2006-10-4


1


1


4


1


1


0


0


4


2006-10-2


35


1


2006-10-1


2006-10-4


1


1


4


1


1


1


-25


4


2006-10-4


80


1


2006-10-1


2006-10-4


1


1


4


1


2


2


45


4


2007-1-1


70


2


2007-1-1


2007-1-4


1


1


4


1


1


0


0


4


2007-1-3


60


2


2007-1-1


2007-1-4


1


1


4


1


2


1


-10


4


2007-1-4


50


2


2007-1-1


2007-1-4


1


1


4


1


2


2


-10


最佳答案

wwang111 查看完整内容

看看这样可不可以: data test; input id date : yymmdd10. dose freq; format date yymmdd10.; cards; 1 2006-9-30 25 1 1 2006-10-23 30 1 1 2006-10-24 30 1 2 2007-10-2 80 1 2 2007-10-4 90 1 2 2007-10-6 70 1 3 2008-3-1 50 1 3 2008-3-4 40 1 3 2008-3-8 45 1 4 2006-10-1 60 1 4 2006-10-2 35 1 4 2006-10-4 80 1 4 2007-1-1 70 1 4 2007-1-3 60 1 4 2007-1-4 50 1 ; data part1; set test ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-2-25 21:24:02
看看这样可不可以:

data test;
input id date : yymmdd10. dose freq;
format date yymmdd10.;
cards;
1 2006-9-30 25 1
1 2006-10-23 30 1
1 2006-10-24 30 1
2 2007-10-2 80 1
2 2007-10-4 90 1
2 2007-10-6 70 1
3 2008-3-1 50 1
3 2008-3-4 40 1
3 2008-3-8 45 1
4 2006-10-1 60 1
4 2006-10-2 35 1
4 2006-10-4 80 1
4 2007-1-1 70 1
4 2007-1-3 60 1
4 2007-1-4 50 1
;


data part1;
set test;
date1=lag(date);
dose1=lag(dose);
if id ne lag(id) then do;date1=.;dose1=.;end;

* stage;
retain stage 1;
if date1 ne . and date-date1>=7 then stage=stage+1;
if date1=. then stage=1;

* prepare for miss time;
if date1 ne . and 1<date-date1<7 then do;
  time=1;
  if date-date1>1 then act_time=date-date1-1;
  else act_time=0;
end;
else do;
  time=0;
  act_time=0;
end;

* prepare for during;
retain dur_date;
if _n_=1 then dur_date=date;
if date1=. or stage ne lag(stage) then dur_date=date;
dur=date-dur_date+1;
if dur<=2 then during=1;
else if 2<dur<=10 then during=2;
else if dur>10 then during=3;

* prepare for drug adjust times and dosage;
retain adj_time 0;
if stage ne lag(stage) then dose1=.;
if dose1 ne . and stage = lag(stage) then adj_dose=dose-dose1;
else adj_dose=0;
if dose1=. then adj_time=0;
else if adj_dose ne 0 then adj_time=adj_time+1;

drop dur_date dur dose1 date1;
run;

proc sql;
create table part2 as
select id, stage,
/* Begin date and end date / theoretic drug days */
  min(date) as st_date format=yymmdd10.,max(date) as end_date format=yymmdd10.,
  max(date)-min(date)+1 as theo_days,
/* Miss time and actual miss time */
sum(time) as miss_time, sum(act_time) as act_miss_days
from part1
group by 1,2;
quit;

* Miss variable;
proc sql;
create table miss as
select distinct id,stage,1 as miss from part1
where id in
(select distinct id from part1 where act_time ne 0
  group by id,stage having count(distinct act_time)=1);
quit;

proc sql;
create table part3 as
select a.*,ifn(miss=.,0,miss) as miss
from part2 a left join miss b
on a.id=b.id and a.stage=b.stage;
quit;

* Final datasets;
proc sql;
create table wanted as
select a.id,date,dose,freq,a.stage,b.st_date,b.end_date,b.miss_time,b.act_miss_days,
        b.theo_days,b.miss,during,adj_time,adj_dose
from part1 a left join part3 b
on a.id=b.id and a.stage=b.stage
order by 1,2;
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-2-26 22:07:45
非常感谢你,解决了我一个大问题,更多的是感激!看了你回复的其他帖子都很用心!3点32个赞!@wwang111
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-2-27 16:21:07
在运行你给的程序过程中,发现只有一个变量有一点小出入,所以再弱弱的追问一句关于是否规律漏服的问题,本意是,每一个病人治疗可能有几段即上面提到的stage,在每一个stage中如果一个病人确定有漏服现象(即以服药日期为准,如果小于7天(<7)不来服药即为漏服),想进一步生成一个变量叫是否规律漏服,以第一段治疗为例,如果每次漏服天数相同(见2号病人,都是隔一天来服药,当然只要隔的天数相同,不一定是1天),或者如4号病人第1段和第2段每次漏服的天数都<=2;则这两种情况下是否规律漏服=1;如果病人在某段内没有出现过漏服,即天天服药,则是否规律漏服=1;其他情况是否规律漏服=0;自己尝试了一下,还是花的时间有点长,也没有写出来;忙着写论文,所以再请教一下;呵呵
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-2-27 16:38:38
tanaya 发表于 2014-2-27 16:21
在运行你给的程序过程中,发现只有一个变量有一点小出入,所以再弱弱的追问一句关于是否规律漏服的问题,本 ...
你的意思是如果没有漏服的情况下,miss=1? 就是ID=1的这个人的miss变量应该是1?
如果是这样,把miss variable那里改成这样:

* Miss variable;
proc sql;
create table miss as
select distinct id,stage,1 as miss from part1
group by 1,2
having sum(act_time)=0
union
select distinct id,stage,1 as miss from part1
where id in
(select distinct id from part1 where act_time ne 0
  group by id,stage having count(distinct act_time)=1);
quit;
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-2-27 17:17:10
wwang111 发表于 2014-2-27 16:38
你的意思是如果没有漏服的情况下,miss=1? 就是ID=1的这个人的miss变量应该是1?
如果是这样,把miss va ...
    我的原始数据共有几千人,上百万记录,运行时发现的具体问题如下,其中有病人某一段治疗中每次漏服的天数不相等或不是都<=2天,如第一次漏服1天,第二次漏服3天,第三次漏服4天,结果miss=1;但是其实他不是规律漏服啊!我规律漏服的定义是:同一段治疗中病人每次漏服天数相同或都<=2;
    我现在解决的方案是把同一段治疗的人输出,如果他们漏服次数等于漏服总天数,但是好像不全,呵呵!我试试你给的新程序!  
   祝好!
   
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群