楼主: funwin
8211 37

有谁知道 如何用宏语言实现bootstrap resampling? [推广有奖]

11
jingju11 发表于 2010-4-7 00:35:08
1# funwin

Basically I followed by ‘版主’s instructions. I may not throughly understand your logic here; in my point of view, it may be just a stratified random sampling with replacement in a rate of 100%.
  1. proc sort out = Original; by co; run;
  2. proc surveyselect data=Original method=urs samprate = 1
  3.          seed=11 out=SampleStrata;
  4.       strata co;
  5.    run;
  6. data boots;
  7. set SampleStrata;
  8. do _n_ = 1 to NumberHits by 1;
  9.   output;
  10. end;
  11. drop NumberHits ExpectedHits SamplingWeight;
  12. run;
复制代码

12
funwin 发表于 2010-4-7 05:32:24
11# jingju11

非常感谢你的code,但最后的结果数据boots和之前数据original没有差别呀!
我想要的是对每家公司的resid进行有放回的再抽样,抽取的个数和该公司的resid的observations一样。这样的有放回的抽取一共进行1000次。

13
funwin 发表于 2010-4-7 05:47:44
假如原数据boots如下:
t        co        date        resid
1        102361        198401        0.080947911
1        102361        198402        0.046933369
2        103164        199301        0.087001861
2        103164        199302        0.066154877
2        103164        199303        0.02525485
3        106384        199801        -0.034053486
3        106384        199802        0.047093365
3        106384        199803        0.052401688
3        106384        199804        0.025507634
4        107892        200501        -0.00497431
4        107892        200502        -0.007152377
我用了这个语句:
%macro boot (b=10);
Data boots1 (where=(t=1)) Boots2 (where=(t=2)) boots3 (where=(t=3)) Boots4 (where=(t=4));
Set boots;
Run;
Data bootstrap;
%do t=1 %to 4;
Do sample=1 to &b;
   Do i=1 to nobs;
     x=round(ranuni(&t)*nobs);
     Set boots&t nobs=nobs point=x;
     Output;
    End;
  End;
%end;
Stop;
Run;
%mend;
%boot;
最后得出bootstrap数据如下:
sample        i        t        co        date        resid
1        1        .        .        .        .
1        2        1        102361        198402        0.046933
2        1        1        102361        198401        0.080948
2        2        1        102361        198401        0.080948
3        1        1        102361        198402        0.046933
3        2        1        102361        198402        0.046933
4        1        1        102361        198401        0.080948
4        2        1        102361        198401        0.080948
5        1        1        102361        198401        0.080948
5        2        1        102361        198401        0.080948
6        1        1        102361        198402        0.046933
6        2        1        102361        198401        0.080948
7        1        1        102361        198402        0.046933
7        2        1        102361        198402        0.046933
8        1        1        102361        198402        0.046933
8        2        1        102361        198401        0.080948
9        1        1        102361        198401        0.080948
9        2        1        102361        198401        0.080948
10        1        1        102361        198402        0.046933
10        2        1        102361        198402        0.046933
1        1        2        103164        199301        0.087002
1        2        2        103164        199301        0.087002
2        1        2        103164        199302        0.066155
2        2        2        103164        199301        0.087002
2        3        2        103164        199301        0.087002
3        1        2        103164        199303        0.025255
3        2        2        103164        199302        0.066155
3        3        2        103164        199302        0.066155
4        1        2        103164        199302        0.066155
4        2        2        103164        199301        0.087002
4        3        2        103164        199302        0.066155
5        1        2        103164        199302        0.066155
5        2        2        103164        199303        0.025255
5        3        2        103164        199303        0.025255
6        1        2        103164        199302        0.066155
6        2        2        103164        199301        0.087002
6        3        2        103164        199301        0.087002
7        1        2        103164        199301        0.087002
7        2        2        103164        199302        0.066155
7        3        2        103164        199301        0.087002
8        1        2        103164        199301        0.087002
8        2        2        103164        199303        0.025255
8        3        2        103164        199301        0.087002
9        1        2        103164        199303        0.025255
9        2        2        103164        199303        0.025255
9        3        2        103164        199302        0.066155
10        1        2        103164        199302        0.066155
10        2        2        103164        199302        0.066155
10        3        2        103164        199302        0.066155
1        1        3        106384        199801        -0.03405
1        2        3        106384        199801        -0.03405
1        3        3        106384        199803        0.052402
2        1        3        106384        199802        0.047093
2        2        3        106384        199802        0.047093
2        3        3        106384        199802        0.047093
2        4        3        106384        199801        -0.03405
3        1        3        106384        199802        0.047093
3        2        3        106384        199803        0.052402
3        3        3        106384        199802        0.047093
3        4        3        106384        199802        0.047093
4        1        3        106384        199802        0.047093
4        2        3        106384        199801        -0.03405
4        3        3        106384        199801        -0.03405
4        4        3        106384        199803        0.052402
5        1        3        106384        199804        0.025508
5        2        3        106384        199802        0.047093
5        3        3        106384        199804        0.025508
5        4        3        106384        199803        0.052402
6        1        3        106384        199803        0.052402
6        2        3        106384        199801        -0.03405
6        3        3        106384        199801        -0.03405
6        4        3        106384        199802        0.047093
7        1        3        106384        199802        0.047093
7        2        3        106384        199802        0.047093
7        3        3        106384        199801        -0.03405
7        4        3        106384        199803        0.052402
8        1        3        106384        199801        -0.03405
8        2        3        106384        199801        -0.03405
8        3        3        106384        199802        0.047093
8        4        3        106384        199801        -0.03405
9        1        3        106384        199801        -0.03405
9        2        3        106384        199802        0.047093
9        3        3        106384        199802        0.047093
9        4        3        106384        199802        0.047093
10        1        3        106384        199804        0.025508
10        2        3        106384        199802        0.047093
10        3        3        106384        199803        0.052402
10        4        3        106384        199804        0.025508
1        1        4        107892        200502        -0.00715
1        2        4        107892        200502        -0.00715
1        3        4        107892        200501        -0.00497
1        4        4        107892        200501        -0.00497
2        1        4        107892        200501        -0.00497
2        2        4        107892        200501        -0.00497
3        1        4        107892        200501        -0.00497
3        2        4        107892        200501        -0.00497
4        1        4        107892        200501        -0.00497
4        2        4        107892        200501        -0.00497
5        1        4        107892        200501        -0.00497
5        2        4        107892        200501        -0.00497
6        1        4        107892        200502        -0.00715
6        2        4        107892        200502        -0.00715
7        1        4        107892        200502        -0.00715
7        2        4        107892        200501        -0.00497
8        1        4        107892        200501        -0.00497
8        2        4        107892        200501        -0.00497
9        1        4        107892        200501        -0.00497
9        2        4        107892        200502        -0.00715
10        1        4        107892        200501        -0.00497
10        2        4        107892        200501        -0.00497
但怎么会每家公司的第一次抽取数sample1与其他9次的抽取数不同呢??
是哪儿出错了吗?

14
jingju11 发表于 2010-4-7 07:48:23
funwin 发表于 2010-4-7 05:32
11# jingju11

非常感谢你的code,但最后的结果数据boots和之前数据original没有差别呀!
我想要的是对每家公司的resid进行有放回的再抽样,抽取的个数和该公司的resid的observations一样。这样的有放回的抽取一共进行1000次。
怎么可能?这是一次抽样的结果,不应该和原始数据一模一样的

15
jingju11 发表于 2010-4-7 08:16:36
14# jingju11


  1. %macro bootsMcr;
  2. proc sort data = Original; by co; run;
  3. data  boots; length Sample co date resid 8; delete;
  4. run;
  5. %do i = 1 %to 10;
  6.   proc surveyselect data=Original method=urs samprate = 1 seed=0 out=SampleStrata noprint;
  7.       strata co;
  8.     run;
  9. data OneSample;
  10.   set SampleStrata;
  11.   sample = &i;
  12.   do _n_ = 1 to NumberHits by 1;
  13.     output;
  14.   end;
  15.   drop NumberHits ExpectedHits SamplingWeight;
  16. run;
  17. proc append base = boots data = OneSample force;
  18. run;
  19. %end;
  20. %mend bootsMcr;
  21. %bootsMcr
  22. ;
复制代码

16
funwin 发表于 2010-4-7 08:24:14
让原数据original 如下:
co        date        resid
102361        198401        0.080947911
102361        198402        0.046933369
103164        199301        0.087001861
103164        199302        0.066154877
103164        199303        0.02525485
106384        199801        -0.034053486
106384        199802        0.047093365
106384        199803        0.052401688
106384        199804        0.025507634
107892        200501        -0.00497431
107892        200502        -0.007152377
proc sort out = Original;
by co;
run;
proc surveyselect data=Original method=urs samprate = 1 seed=11 out=SampleStrata;
   strata co;
run;
co        date        resid        NumberHits        ExpectedHits        SamplingWeight
102361        198401        0.080948        1        1        1
102361        198402        0.046933        1        1        1
103164        199301        0.087002        1        1        1
103164        199302        0.066155        1        1        1
103164        199303        0.025255        1        1        1
106384        199803        0.052402        2        1        1
106384        199804        0.025508        2        1        1
107892        200501        -0.00497        1        1        1
107892        200502        -0.00715        1        1        1
data boots;
set SampleStrata;
do _n_ = 1 to NumberHits by 1;
  output;
end;
drop NumberHits ExpectedHits SamplingWeight;
run;

co        date        resid
102361        198401        0.080948
102361        198402        0.046933
103164        199301        0.087002
103164        199302        0.066155
103164        199303        0.025255
106384        199803        0.052402
106384        199803        0.052402
106384        199804        0.025508
106384        199804        0.025508
107892        200501        -0.00497
107892        200502        -0.00715
不好意思,一次抽取的结果是有不同。

因为对这个语句不了解,我想问的是,samprate = 1 seed=11是什么意思?为什么是seed=11?还有执行了该语句后,我想再抽取一次,再用这个语句,发现得出同样的结果?不是再次抽样吗??
如果我想重复执行100或1000次?是否需要macro语句?
非常感谢你能够再解答一下我的疑惑!

17
jingju11 发表于 2010-4-7 08:40:30
funwin 发表于 2010-4-7 08:24
让原数据original 如下:
co        date        resid
102361        198401        0.080947911
102361        198402        0.046933369
103164        199301        0.087001861
103164        199302        0.066154877
103164        199303        0.02525485
106384        199801        -0.034053486
106384        199802        0.047093365
106384        199803        0.052401688
106384        199804        0.025507634
107892        200501        -0.00497431
107892        200502        -0.007152377
proc sort out = Original;
by co;
run;
proc surveyselect data=Original method=urs samprate = 1 seed=11 out=SampleStrata;
   strata co;
run;
co        date        resid        NumberHits        ExpectedHits        SamplingWeight
102361        198401        0.080948        1        1        1
102361        198402        0.046933        1        1        1
103164        199301        0.087002        1        1        1
103164        199302        0.066155        1        1        1
103164        199303        0.025255        1        1        1
106384        199803        0.052402        2        1        1
106384        199804        0.025508        2        1        1
107892        200501        -0.00497        1        1        1
107892        200502        -0.00715        1        1        1
data boots;
set SampleStrata;
do _n_ = 1 to NumberHits by 1;
  output;
end;
drop NumberHits ExpectedHits SamplingWeight;
run;

co        date        resid
102361        198401        0.080948
102361        198402        0.046933
103164        199301        0.087002
103164        199302        0.066155
103164        199303        0.025255
106384        199803        0.052402
106384        199803        0.052402
106384        199804        0.025508
106384        199804        0.025508
107892        200501        -0.00497
107892        200502        -0.00715
不好意思,一次抽取的结果是有不同。

因为对这个语句不了解,我想问的是,samprate = 1 seed=11是什么意思?为什么是seed=11?还有执行了该语句后,我想再抽取一次,再用这个语句,发现得出同样的结果?不是再次抽样吗??
如果我想重复执行100或1000次?是否需要macro语句?
非常感谢你能够再解答一下我的疑惑!
没有什么。
samprate = 1 (100%).每个公司抽取的比例是100%, 和原始的记录一样多。seed = 11 ,也可以用1 ,12345, 因为是随机抽取所以sas要根据seed生成随机数。如果你再抽取一次,因为seed不变(0 除外),所以抽取的样本理应相同。因此第二次抽取时,seed应该改变。你可以人为改变,也可以用0,总在变。0的缺点是不可再生。

18
jingju11 发表于 2010-4-7 08:45:49
x=round(ranuni(0)*nobs);
这个语句有问题,因为x有可能等于0,但是point不可能为0

19
jingju11 发表于 2010-4-7 08:59:16
另外,你可以把你bootstrap 分析 生成的data的过程简略地说一下吗?或者是sas程序。我对bootstrap的原理一直不很理解,许多paper对bootstrap的应用也很牵强,似是而非的。

20
funwin 发表于 2010-4-7 09:26:26
jingju11 发表于 2010-4-7 08:45
x=round(ranuni(0)*nobs);
这个语句有问题,因为x有可能等于0,但是point不可能为0

x=round(ranuni(0)*nobs);

这个如果改成x=round(0.5+ranuni(0)*nobs)可以吗?

我试了一下,还是不行。

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

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-25 03:00