SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2609|回复: 16
打印 上一主题 下一主题

如何在队列内 为病例随机选对照???

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-2-18 21:47:36 | 只看该作者

如何在队列内 为病例随机选对照???

我这有70000人的一个大队列,发现300例病例,在这个队列内剩下的正常人中为病例[color=#FF4040:1xcevr8o]随机[/color:1xcevr8o]选对照,按照每个病例年龄+-2岁,1:4选(即为一个病例选年龄前后2岁范围内的4个对照)

变量有3个,code age cancer,其中cancer=1是病例,有300个,cancer=0则是正常人,都各有自己的age。

据说用到随机数函数,折腾了半天,没搞明白。望高手指教!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-2-19 00:36:06 | 只看该作者

Re: 如何在队列内 为病例随机选对照???

[code:349h2k4g]data ahuige;/*pseudo dataset*/
  cancer=0;
  do code=1 to 70000;
    if code<=300 then cancer=1;
    else cancer=0;
    age=ceil(uniform(34938493)*100);
    output;
  end;
run;

data ahuigeAddId;
  set ahuige;
  randomid=normal(43578437); /*change to 0 to get unrepeatable random id*/
  lowage=age-2;
  upage=age+2;
run;

proc sort data=ahuigeAddId;
  by randomid;
run;

data cancer noncancer;
  set ahuigeADDid;
  if cancer=1 then output cancer;
  else output noncancer;
  ;
run;



%macro getPeers(code,low,up);
   data candidate(keep=patientId code age ) noncancer(drop=patientid n);
     set noncancer;
     patientId=&code;
     if &low<=age<=&up then
       do;
       n+1;
       if n<=4 then output candidate;
       else output noncancer;
       end;
     else output noncancer;
   run;

    proc datasets;
       append base=final
          data=candidate;
    run;
%mend;
option nomprint;

proc datasets lib=work;
  delete final;
run;

data _null_;
  set cancer;
  length cmd $200;
  cmd='%getpeers('||code||','||age-2||','||age+2||')';
  call execute(cmd);
run;[/code:349h2k4g]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-2-19 11:04:01 | 只看该作者

Re: 如何在队列内 为病例随机选对照???

这样行不行啊?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-2-19 11:15:50 | 只看该作者

Re: 如何在队列内 为病例随机选对照???

可能没有SAS9就不行了。。。。。。。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-2-19 11:56:56 | 只看该作者

感谢楼上的ahuige

非常感谢,以后多向你学习, <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-2-19 12:15:33 | 只看该作者

感谢楼上的 徐

继续感谢 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-2-19 17:14:26 | 只看该作者

Re: 如何在队列内 为病例随机选对照???

才开始学习,看了半天书终于搞明白那个宏的相关问题了,第一次接触真正这些,蛮有挑战的
宏的功能好强大啊
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-2-19 19:09:42 | 只看该作者

Re: 如何在队列内 为病例随机选对照???

我在自己的机子上运行您发的这个程序,出来了1880个对照,按patientid排序后,发现有的是8个,有的是4个。我同屋3台机器都出来是这个结果。
同时我发了这个程序远程给别的同学,她运行是1200个,是正确的,我也收到她给我发的数据集。

是不是我的SAS程序装的有问题?
到现在百思不得其解。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-2-19 22:10:26 | 只看该作者

Re: 如何在队列内 为病例随机选对照???

可能是男生寝室人气太旺。所以人数比女生寝室多。。。。。。。。。。。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-2-19 22:55:02 | 只看该作者

Re: 如何在队列内 为病例随机选对照???

应该是版本的问题 我的9.1跑出1200  8.2跑出1888

Log of version 9.1:
NOTE: 正在追加 WORK.CANDIDATE 至 WORK.FINAL。
NOTE: 从数据集 WORK.CANDIDATE 读取了 4 个观测。
NOTE: 添加了 4 个观测。
NOTE: 数据集 WORK.FINAL 有 1200 个观测和 3 个变量。


Log of version 8.2:
NOTE: Appending WORK.CANDIDATE to WORK.FINAL.
NOTE: There were 4 observations read from the data set WORK.CANDIDATE.
NOTE: 4 observations added.
NOTE: The data set WORK.FINAL has 1888 observations and 3 variables.
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 14:02 , Processed in 0.069646 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表