楼主: tanaya
2388 19

[有偿编程] 多变量大数据整理,如何编程进行数据挖掘?报酬15个币!其他算帮忙吧! [推广有奖]

  • 3关注
  • 1粉丝

硕士生

96%

还不是VIP/贵宾

-

威望
0
论坛币
700 个
通用积分
4.0600
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
14057 点
帖子
73
精华
0
在线时间
314 小时
注册时间
2012-3-20
最后登录
2023-11-9

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
各位大侠:
      有如下问题请教:
病人编号服药日期治疗剂量当天服药次数

1

2006-9-30

25

1

2

2006-10-1

15

1

2

2006-10-1

18

2

2

2006-10-3

30

1

2

2006-10-4

30

1

3

2006-10-4

30

1

3

2006-10-5

10

1

3

2006-10-13

35

1

4

2006-10-7

30

1

4

2006-10-9

10

1

4

2006-10-12

30

1

4

2006-10-20

30

1

5

2006-10-10

30

1

5

2006-10-11

30

1

5

2006-10-12

10

1

5

2006-10-13

70

1

5

2006-10-14

25

1

5

2006-10-15

30

1

5

2006-10-16

30

1

5

2006-10-17

45

1

5

2006-10-18

30

1

5

2006-10-19

20

1

5

2006-10-20

35

1

5

2006-10-21

35

1

5

2006-10-22

35

1

5

2006-10-23

35

1

5

2006-11-2

35

1


数据介绍:本研究期限为13天,以服药时间为据;问题--关于服药天数变量的挑选:
1、如果在研究期限内病人连续7天(>=7天)不服药(3号标红日期),而不是超过研究期限的5号病人,则生成新变量”status“=1,其他为=0,不存在断断续续服药情况(服药间隔<7天)如4号则变量”是否漏服“=0
2、如果在研究期限内存在连续7天不服药的情况,同时还存在断断续续服药情况如4号,则生成新变量status=1,”是否漏服“=1
所有病人计算实际服药天数,如1号病人=1天  2号=3天  3号=2天 4号=3天  5号=13天(虽然其大于13天)
问题--关于服药剂量
1、如果研究期限内病人剂量无调整--如1号,则”调整次数“=0   ”平均剂量“=25     ”平均调整剂量“=0
2、2号病人在研究期限内1天服2次药,则计算服药天数时”2006-10-1“为1天,当日剂量为2次之和。则”调整次数“(调整次数-----1天之内的调整不计入调整次数如2号)=1   ”平均剂量“=33+30/2     ”平均调整剂量“=3
3、3号病人”调整次数“=2    ”平均剂量“=30+10+35/3    ”平均调整剂量“=第一次从30变为10的20+25/2次调整
4、4号病人”调整次数“=2    ”平均剂量“=30+10+30/3     ”平均调整剂量“=20+20/2次
总结:最后每一个病人都要得到如下变量
”实际服药天数“  ”status“  ”是否漏服“   ”调整次数“  ”平均剂量“   ”平均调整剂量“






二维码

扫码加我 拉你入群

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

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

关键词:数据挖掘 数据整理 大数据 多变量 status 如何

路过
我愿用我的生命去改变我的生命

使用道具

藤椅
wwang111 发表于 2013-9-29 11:23:04 |只看作者 |坛友微信交流群
是这样吗?

data test;
input subjid date: yymmdd10. dose time;
format date yymmdd10.;
cards;
1 2006-9-30 25 1
2 2006-10-1 15 1
2 2006-10-1 18 2
2 2006-10-3 30 1
2 2006-10-4 30 1
3 2006-10-4 30 1
3 2006-10-5 10 1
3 2006-10-13 35 1
4 2006-10-7 30 1
4 2006-10-9 10 1
4 2006-10-12 30 1
4 2006-10-20 30 1
5 2006-10-10 30 1
5 2006-10-11 30 1
5 2006-10-12 10 1
5 2006-10-13 70 1
5 2006-10-14 25 1
5 2006-10-15 30 1
5 2006-10-16 30 1
5 2006-10-17 45 1
5 2006-10-18 30 1
5 2006-10-19 20 1
5 2006-10-20 35 1
5 2006-10-21 35 1
5 2006-10-22 35 1
5 2006-10-23 35 1
5 2006-11-2 35 1
;
* pick up the valid treatment phase;
proc sql;
create table test1 as
select *  from test
group by subjid
having date < min(date)+13
order by subjid,date,time;
quit;
* combine the subjects who dose two times a day;
data test2;
set test1;
by subjid date time;
retain dose_;
if first.date then dose_=dose;
else dose+dose_;
if last.date;
run;
* compare the date and dose from this time to next time;
data test3;
set test2;
by subjid date time;
date1=lag(date);
dose1=lag(dose);
if first.subjid then do; date1=.; dose1=.; end;
if first.subjid and last.subjid then do; date1=date; dose1=dose; flag=1;end;
if date1 ne . and date-date1>7 then do; status=1; miss=1;end;
else do; status=0; miss=0;end;
format date1 yymmdd10.;
drop dose_;
run;

proc sql;
* status, missing dose;
create table status as
select distinct subjid, status, miss
from test3
where status=1 and miss=1
order by subjid;

* actual dose date;
create table actdate as
select subjid, count(distinct date) as actdate
from test3
where  date-date1<=7
group by 1
order by 1;

* mean dose;
create table mean as
select distinct subjid, ifn(flag=1,dose,mean(dose)) as mean
from test3
where flag=1 or  dose ne dose1
group by 1
order by 1;

* adjust time;
create table adjtime as
select distinct subjid,ifn(flag=1,0,count(distinct date1)) as adjtime
from test3
where flag=1 or (dose1 ne . and dose ne dose1)
group by 1
order by 1;

* adjust mean;
create table adjmean as
select a.subjid, ifn(n=0,0,(a.n/b.adjtime)) as adjmean from
(select distinct subjid, ifn(flag=1,0,sum(abs(dose-dose1))) as n
from test3
where flag=1 or (dose1 ne . and dose ne dose1)
group by 1) a
join adjtime b
on a.subjid=b.subjid
order by a.subjid;
quit;

* final dateset;
data final;
merge actdate status adjtime mean adjmean;
  by subjid;
  if status=. then status=0;
  if miss=. then miss=0;
run;
只有一个罗纳尔多

使用道具

板凳
龙潭丰乐 学生认证  发表于 2013-9-30 14:36:17 |只看作者 |坛友微信交流群
问题一:
  1. data quan1;
  2.   set quan;
  3.     date1= lag(date) ;
  4.    if id=lag(id) then
  5.            period=date-date1;
  6.    else period=.;
  7.   if period>=7 then status=1;
  8.           else         status=0;
  9.    if period>=2 and period<7 then leak=1;
  10.            else leak=0;
  11.         drop date1;
  12. run;
  13. proc print data=quan1;
  14.   where status=1 or leak=1;
  15.    var id date status leak;
  16. run;
  17. data quan2;
  18. retain cnt 1;
  19.   set quan1;
  20.    if period>=7 then delete;
  21.     if id=lag(id) and date^=lag(date) then  cnt+1;
  22. run;
  23. proc sort data=quan2;
  24. by id;
  25. run;
  26. data quan3;
  27. set quan2;
  28. by id;
  29.   if first.id=1  or last.id=1 then output ;
  30. run;
  31. data quan4;
  32. set quan3;
  33.    cnt1=lag(cnt);
  34.    if id=1 then days=1;
  35.   if id=lag(id) then days=cnt-cnt1+1;
  36.   if days=. then delete;
  37.    drop cnt1 cnt date freqency leak period status quality;
  38. run;
  39. proc print data=quan4;
  40. run;
复制代码

使用道具

报纸
龙潭丰乐 学生认证  发表于 2013-9-30 15:47:54 |只看作者 |坛友微信交流群
问题二
  1. proc sql;
  2.    create table work1 as
  3.     select         id ,date ,sum(quality) as quality
  4.          from work
  5.          group by id ,date;
  6. quit;
  7. data work2;
  8. set work1;
  9.   quality1=lag(quality);
  10.   if id=lag(id) then adjustment=abs(quality-quality1);
  11.   if  adjustment>0 then fre=1;
  12.   drop         quality1;
  13. run;
  14. proc sql;
  15. create table a as
  16.   select id ,mean(distinct(quality))as avequality
  17.   from work2
  18.   group by id ;
  19. create table b as
  20. select id ,avg(adjustment) as avgadjustment
  21.    from work2
  22.     where adjustment>0
  23.          group by id;
  24. create table c as
  25.   select *
  26.     from a
  27.   full join
  28.   b
  29.    on a.id=b.id;
  30. quit;
复制代码

使用道具

地板
tanaya 发表于 2013-9-30 19:33:11 |只看作者 |坛友微信交流群
wwang111 发表于 2013-9-29 11:23
是这样吗?

data test;
    非常谢谢你的回答,程序简洁,很细心写了注释!应该是这样的,有一点点小问题,就是“stutas” 和“miss”两个变量不够准确,附上程序处理的结果,及更改后的结果;
subjid         actdate        status        miss              adjtime        mean               adjmean
1         1                  0                  0                    0                   25                           0
2         3                  0                  0 1              1                   31.5                   3
3         2                  1                  1 0                    2                   25                           22.5
4         3                  0 1                  0 1                    2                   23.33333333           20
5         13                  0                  0                    8                   32.77777778            3.125
更正的“status" "miss"写在旁边,我觉得的可能的原因为2号病人的最后一次服药时间,跟3号第一天服药时间相同,所以lag函数的取值有点不够准确,我再试试!可能是我的问题说的不够清楚!  我怎么把币给你了?

使用道具

7
lifemg 发表于 2013-10-3 23:42:57 |只看作者 |坛友微信交流群
mark下 一有时间就来整

使用道具

8
wwang111 发表于 2013-10-8 10:55:23 |只看作者 |坛友微信交流群
tanaya 发表于 2013-9-30 19:33
非常谢谢你的回答,程序简洁,很细心写了注释!应该是这样的,有一点点小问题,就是“stutas” 和“m ...
我上周在休假,所以抱歉没及时回答。
关于漏服问题是我当时没理解对意思,现在已经解决了。
关于status有一个问题,在你的答案中,3号和4号的status=1, 3号是没问题的。
对于4号来说,这个人的研究期限是10月7号到19号,为期13天,如果这个人的status=1,可以理解为从13号到19号没有服药,正好七天,如果是这样理解的话,那2号的研究期限是10月1号到12号,但这个人最后一次吃药是4号,从5号到12号没有记录,是否status的值也应该是1?
只有一个罗纳尔多

使用道具

9
tanaya 发表于 2013-10-9 10:51:20 |只看作者 |坛友微信交流群
wwang111 发表于 2013-10-8 10:55
我上周在休假,所以抱歉没及时回答。
关于漏服问题是我当时没理解对意思,现在已经解决了。
关于status ...
谢谢你对这件事如此上心,我发现根源在于我没有把问题阐述的非常清楚清楚,
status(是否脱失):连续7天不服药包含7天,如4号10月12号到10月20号,中间11号-19号7天未服药,则status为1。
miss(是否漏服):断断续续服药,不服药天数小于7天,如4号10月7号服药后,中间8号未服药,9号又开始服药,则4号的状态为服药期间miss=1,最后脱失status=1!
你可能理解为研究期间内累计7天不服药?
后来借鉴了@龙潭丰乐的程序data c;
  set b;
    date1= lag(m_date) ;
   if pid=lag(pid) then
           period=m_date-date1;
   else period=.;
  if period>7 then status=1;
          else         status=0;
   if period>=2 and period<=7 then miss=1;
           else miss=0;
        drop date1;
run;
跑出了想要的结果,不知你的程序是否更简洁,可以学习下! 谢谢!

使用道具

10
tanaya 发表于 2013-10-9 10:54:54 |只看作者 |坛友微信交流群
龙潭丰乐 发表于 2013-9-30 14:36
问题一:
    谢谢你的回答,只是其中有些变量不知道是代表哪一行数字,也不知道变量的变换过程,如freqency\quality,可能我理解力有限,还请见谅,不过非常感谢你,我会好好向你学习!

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-28 15:32