SAS中文论坛

标题: 如何在队列内 为病例随机选对照??? [打印本页]

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

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

据说用到随机数函数,折腾了半天,没搞明白。望高手指教!
作者: shiyiming    时间: 2009-2-19 00:36
标题: 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]
作者: shiyiming    时间: 2009-2-19 11:04
标题: Re: 如何在队列内 为病例随机选对照???
这样行不行啊?
作者: shiyiming    时间: 2009-2-19 11:15
标题: Re: 如何在队列内 为病例随机选对照???
可能没有SAS9就不行了。。。。。。。
作者: shiyiming    时间: 2009-2-19 11:56
标题: 感谢楼上的ahuige
非常感谢,以后多向你学习, <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
作者: shiyiming    时间: 2009-2-19 12:15
标题: 感谢楼上的 徐
继续感谢 <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->
作者: shiyiming    时间: 2009-2-19 17:14
标题: Re: 如何在队列内 为病例随机选对照???
才开始学习,看了半天书终于搞明白那个宏的相关问题了,第一次接触真正这些,蛮有挑战的
宏的功能好强大啊
作者: shiyiming    时间: 2009-2-19 19:09
标题: Re: 如何在队列内 为病例随机选对照???
我在自己的机子上运行您发的这个程序,出来了1880个对照,按patientid排序后,发现有的是8个,有的是4个。我同屋3台机器都出来是这个结果。
同时我发了这个程序远程给别的同学,她运行是1200个,是正确的,我也收到她给我发的数据集。

是不是我的SAS程序装的有问题?
到现在百思不得其解。
作者: shiyiming    时间: 2009-2-19 22:10
标题: Re: 如何在队列内 为病例随机选对照???
可能是男生寝室人气太旺。所以人数比女生寝室多。。。。。。。。。。。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->
作者: shiyiming    时间: 2009-2-19 22:55
标题: 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.
作者: shiyiming    时间: 2009-2-20 09:23
标题: Re: 如何在队列内 为病例随机选对照???
不知道你们的版本怎么这么有意思,我的SAS8 SAS9结果都一样。
..............................
徐福贵说得对,这个问题难点不在于出来一组结果。难点在于结果的随机性。
作者: shiyiming    时间: 2009-2-20 11:25
标题: Re: 如何在队列内 为病例随机选对照???
[quote=&quot;ahuige&quot;:nxbq5pmz]可能是男生寝室人气太旺。所以人数比女生寝室多。。。。。。。。。。。 <!-- s:( --><img src="{SMILIES_PATH}/icon_sad.gif" alt=":(" title="Sad" /><!-- s:( -->[/quote:nxbq5pmz]

我也是女生哦,美丽的一碗凉水
作者: shiyiming    时间: 2009-2-20 11:39
标题: Re: 如何在队列内 为病例随机选对照???
sxlion来报: <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D -->

sas6.12 的log:
NOTE: Appending WORK.CANDI to WORK.FINAL.
NOTE: 4 observations added.
NOTE: The data set WORK.FINAL has 1200 observations and 3 variables.

SAS9.1的log:
NOTE: 正在追加 WORK.CANDIDATE 至 WORK.FINAL。
NOTE: 从数据集 WORK.CANDIDATE 读取了 4 个观测。
NOTE: 添加了 4 个观测。
NOTE: 数据集 WORK.FINAL 有 1200 个观测和 3 个变量。


SAS9.2的log:
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 1200 observations and 3 variables.

ps:“我也是女生哦,美丽的一碗凉水”,请帖照片证明这句话,谢谢!
作者: shiyiming    时间: 2009-2-20 12:55
标题: Re: 如何在队列内 为病例随机选对照???
那看来是我的版本有问题,是8.2的
sas6.12 的log:
SAS9.1的log:
SAS9.2的log:
.

ps:“我也是女生哦,美丽的一碗凉水”,请帖照片证明这句话,谢谢!
pps:image……
作者: shiyiming    时间: 2009-4-17 19:53
标题: Re: 如何在队列内 为病例随机选对照???
在这个程序下,如果我想增加一个筛选条件,比如是month_collect,是不是就如我下面程序中加的if语句,就好了??
我运行后,选出的对照不是正正好,不晓得是符合条件的少?还是加的这句if有问题?
%macro getPeers(code,low,up,low2,up2);
   data candidate(keep=patientId code age ) noncancer(drop=patientid n);
     set noncancer;
     patientId=&amp;code;
     if &amp;low&lt;=age&lt;=&amp;up then
       do;
      [color=#FF0000:3hv881hu] if &amp;low2&lt;=month_collect&lt;=&amp;up2;[/color:3hv881hu]
       n+1;
       if n&lt;=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||','[color=#FF0000:3hv881hu]||month_collect-1||','||month_collect+1||')';[/color:3hv881hu]
  call execute(cmd);
run
作者: shiyiming    时间: 2009-4-17 23:07
标题: Re: 如何在队列内 为病例随机选对照???
看在你这个小同志碰到新问题的情况下问得还比较清楚,引用也很到位。
我就救人救到底,送佛上西天了。。。。。。。。。。。

好久没看这个程序,都快看不懂了。。。。。。。。。。应该是红色的条件加的位置不对,应该和原来有的IF条件用AND放到一起,而不是加一个新的IF语句。这样逻辑空间的划分和你的意图就不一样了。
作者: shiyiming    时间: 2009-4-18 17:39
标题: Re: 如何在队列内 为病例随机选对照???
哦,if语句是这样用的啊,学习了。谢谢喔~~呵呵,又学到一个新知识,真开心。我自从开了这个贴开始学习sas后,现在进步很多了,同样进步的空间还异常的大。
[quote=&quot;ahuige&quot;:29orsozu]看在你这个小同志碰到新问题的情况下问得还比较清楚,引用也很到位。
我就救人救到底,送佛上西天了。。。。。。。。。。。

好久没看这个程序,都快看不懂了。。。。。。。。。。应该是红色的条件加的位置不对,应该和原来有的IF条件用AND放到一起,而不是加一个新的IF语句。这样逻辑空间的划分和你的意图就不一样了。[/quote:29orsozu]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2