由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Statistics版 - 请教:SAS处理Longitudinal data 的问题
相关主题
请教这样的数据应该怎么分析求助:有用过sas proc mixed里面repeated statement的吗?
[提问]怎样提取SAS Dateset的observation number?跪问一个data management的问题
如何判断一个dataset是不是空的?弱问一个SAS 里data managerment的问题
用 sas 分组问题请教一个longitudinal data的分析问题
一个sas问题simulation for longitudinal data
longitudinal的data,一般都用什么方法分析?time point selection for longitudinal data谢谢
Master paper 建议该送什么样的SAS code呢?
问个PROC MIXED问题sas code 求教
相关话题的讨论汇总
话题: tu24话题: data话题: subject话题: time话题: units
进入Statistics版参与讨论
1 (共1页)
s**y
发帖数: 358
1
数据中记录下每个病人每次用药的时间和用药量:
subject time units
1 19JUN13:13:09:00 1
1 20JUN13:10:09:00 1
1 22JUN13:02:12:00 2
2 17JUN13:12:33:00 1
2 21JUN13:15:03:00 1
.
.
.
现在想找出那些24小时内用药超过5个单位的病人,应该如何做呢?
不是用最后一次用药的时间减去第一次的用药时间,是在任意24小时间隔内用药超过5
单位的。
谢谢!
s**y
发帖数: 358
2
顶一下!
虽然是低级问题,但还请大牛们抬手指点下,谢谢!
p********r
发帖数: 1465
3
proc sql;
create table aaa as
select subject,
count(case when time < min(time)+24*3600 then units else . end) as times
from yourtable
group by subject
having times > 5
;
quit;
w*******9
发帖数: 1433
4
如果不是很关心效率的话,先算出一列cumulative units (c_unit). 再用下面的code.
proc sql;
select a.subject, a.time as start, b.time as end, b.c_unit-a.c_unit as dose
from data as a data as b
where a.subject = b.subject
and b.time - a.time <= 24 小时
and b.c_unit - a.c_unit >= 5;
quit;
这个选出来可能一个subject好几次,因为他可能对应好几个符合条件的时间段。如果
你只找出至少一个时间段符合条件的subject,在select distinct 就行。
k*******a
发帖数: 772
5
for each subject at each time, find total units given within 24 hours after
this time. Then find any subject having any total units exceeding 5. I have
an example, the time is a little different, I use 1 as threshold
You need to make sure sum over units for each id at each unique time, that
is, no duplicate for id/time key
data test;
input subject time units;
datalines;
1 0 1
1 0.1 2
1 0.9 3
1 1.6 1
2 0 1
2 0.1 1
2 1.1 2
2 1.9 2
;
proc sql;
select distinct a.subject
from test a, test b
where a.subject = b.subject and 0 <= b.time - a.time <= 1
group by a.subject, a.time
having sum(b.units) >= 5
;
quit;
s**y
发帖数: 358
6

谢谢你的回复,看上去好简洁!但这样做会报错:
ERROR: Summary functions nested in this way are not supported.

【在 p********r 的大作中提到】
: proc sql;
: create table aaa as
: select subject,
: count(case when time < min(time)+24*3600 then units else . end) as times
: from yourtable
: group by subject
: having times > 5
: ;
: quit;

s*****d
发帖数: 267
7
data step 是你的朋友,Proc SQL有Performance 问题,而且能用Proc SQL 解决的,
都能用Data Step解决。甚至用几个Proc SQL才能解决的,一个Data Step就能解决。下
面的SAS Code我没测试过, 但基本思路给你了。
请发包子
首先,Sort this dataset
Proc Sort data=patient_ds out=patient_ds_sort;
by subject units descending time;
run;
其次,一个Data Step 搞定问题
data patient_morethan_5(keep=subject);
set patient_ds_sort;
if _n_=1 then do;
cur_p=-1; /* assuming your patient id are all positive*/
total_unit=0;
cur_t=0;
is_find=0;
run;
if cur_p ne subject then do; /* a new patient */
cur_p=subject; /* get new patient id */
/* assuming time is datetime, get the 24 hr window
* based on your current latest time */
cur_t = time - 24*3600;
total_unit = units;
is_find=0;
end;
else do; /* we are still dealing with the current patient */
if time >= cur_t then do; /* within the window */
total_unit = total_unit + units;
end;
if total_unit >=5 and is_find=0 then do;
is_find=1; /* got one, output result, set flag to be 1 to avoid
duplicate results */
output;
end;
end;
run;

【在 s**y 的大作中提到】
: 数据中记录下每个病人每次用药的时间和用药量:
: subject time units
: 1 19JUN13:13:09:00 1
: 1 20JUN13:10:09:00 1
: 1 22JUN13:02:12:00 2
: 2 17JUN13:12:33:00 1
: 2 21JUN13:15:03:00 1
: .
: .
: .

j******o
发帖数: 127
8
如果你的data不是特别大并且想使用data step:
data have;
input subject time : datetime. units;
format time datetime.;
datalines;
1 19JUN13:13:09:00 1
1 20JUN13:10:09:00 1
1 22JUN13:02:12:00 2
1 22JUN13:08:12:00 4
1 24JUN13:08:12:00 3
2 17JUN13:12:33:00 1
2 21JUN13:15:03:00 1
;
run;
data obtain;
set have nobs=nobs;
by subject;
retain Max_TU24;
if first.subject then Max_TU24=0;
TU24=0;
do i=1 to nobs;
set have (rename=(subject=subject2 time=time2)) point=i;
if subject2=subject and abs(time2-time)/(60*60)<=24 then TU24=TU24+
units;
end;
if Max_TU24 if last.subject and Max_TU24>=5;
keep subject;
run;
s*****d
发帖数: 267
9
数据如果大,就更应该使用Data Step了,Proc SQL的问题在大数据时会更明显。
而且,数据大还有High Performance Data Step可以用

【在 j******o 的大作中提到】
: 如果你的data不是特别大并且想使用data step:
: data have;
: input subject time : datetime. units;
: format time datetime.;
: datalines;
: 1 19JUN13:13:09:00 1
: 1 20JUN13:10:09:00 1
: 1 22JUN13:02:12:00 2
: 1 22JUN13:08:12:00 4
: 1 24JUN13:08:12:00 3

s**y
发帖数: 358
10
我的数据比较大,好像用sql的时候会出现结果不准确的情况,我用了5楼的方法,出现
误选和漏选的情况,但是基本超过80%是正确的。我用8楼的data step做,结果非常准
确!时间虽然有点长,但可以忍受。
现在又多了一个问题,我开始只是想把那些24小时内用药超过5的病人从名单中剔除出
去,但现在需要把那些24小时内用药超过5的纪录除去,而不是剔出所有关于这个病人
的纪录。这样又该怎么做呢?
j******o
发帖数: 127
11
You should modify like below (can be optimized to reduce loops to save time):
data obtain;
set have nobs=nobs;
TU24=0;
do i=1 to nobs;
set have (rename=(subject=subject2 time=time2 units=units2)) point=i;
if subject2=subject and abs(time2-time)/(60*60)<=24 then TU24=TU24+
units2;
end;
if TU24>5 then delete;
drop i subject2 time2 units2;
run;

【在 s**y 的大作中提到】
: 我的数据比较大,好像用sql的时候会出现结果不准确的情况,我用了5楼的方法,出现
: 误选和漏选的情况,但是基本超过80%是正确的。我用8楼的data step做,结果非常准
: 确!时间虽然有点长,但可以忍受。
: 现在又多了一个问题,我开始只是想把那些24小时内用药超过5的病人从名单中剔除出
: 去,但现在需要把那些24小时内用药超过5的纪录除去,而不是剔出所有关于这个病人
: 的纪录。这样又该怎么做呢?

s*****d
发帖数: 267
12
你可以用Drop呀
提高任何编程水平的办法都是多想,多练。请教别人虽然快,但还不是自己的东西。不
好意思,不是批评只是建议。
一句话,Data Step加Hash Map加Array,基本可以高效率的搞定所有的问题。如果Data
Step处理慢了,同样的问题Proc SQL会更慢。
如果数据很大,可以考虑用Data Step2,或者HP DataStep。如果没有License, 只能用
Data Step的话,可以考虑把数据Divide and Conquer 然后并行处理。

【在 s**y 的大作中提到】
: 我的数据比较大,好像用sql的时候会出现结果不准确的情况,我用了5楼的方法,出现
: 误选和漏选的情况,但是基本超过80%是正确的。我用8楼的data step做,结果非常准
: 确!时间虽然有点长,但可以忍受。
: 现在又多了一个问题,我开始只是想把那些24小时内用药超过5的病人从名单中剔除出
: 去,但现在需要把那些24小时内用药超过5的纪录除去,而不是剔出所有关于这个病人
: 的纪录。这样又该怎么做呢?

s**y
发帖数: 358
13
真心非常感谢各位指教!确实是急需解决方法所以才未经仔细思考就上来问,现在问题
基本解决了,我一定会认真总结的。之前各给写的代码我都逐一测试过,基本上data
step的结果最为准确。
再次感谢!
k*******a
发帖数: 772
14
不是很理解8楼为什么要用 abs,这样岂不是考虑了一共48小时的区间?
1 (共1页)
进入Statistics版参与讨论
相关主题
sas code 求教一个sas问题
请教SAS的问题,时间变量读取,包子答谢longitudinal的data,一般都用什么方法分析?
help me to look at this codeMaster paper 建议
一个SAS 问题,紧急!问个PROC MIXED问题
请教这样的数据应该怎么分析求助:有用过sas proc mixed里面repeated statement的吗?
[提问]怎样提取SAS Dateset的observation number?跪问一个data management的问题
如何判断一个dataset是不是空的?弱问一个SAS 里data managerment的问题
用 sas 分组问题请教一个longitudinal data的分析问题
相关话题的讨论汇总
话题: tu24话题: data话题: subject话题: time话题: units