| co | date | resid | resid_boot1 | …….. | resid_boot1000 |
| 10001 | 200501 | 0.00865 | | | |
| 10001 | 200502 | -0.00635 | | | |
| ….. | ….. | …… | | | |
| 10001 | 200812 | 0.00025 | | | |
| 10006 | 200207 | 0.00358 | | | |
| 10006 | 200208 | -0.00254 | | | |
| ….. | ….. | ….. | | | |
| 10006 | 200612 | 0.00098 | | | |
| …… | …… | ……. | | | |
funwin 发表于 2010-4-7 05:32
11# jingju11
非常感谢你的code,但最后的结果数据boots和之前数据original没有差别呀!
我想要的是对每家公司的resid进行有放回的再抽样,抽取的个数和该公司的resid的observations一样。这样的有放回的抽取一共进行1000次。
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语句?
非常感谢你能够再解答一下我的疑惑!
jingju11 发表于 2010-4-7 08:59
另外,你可以把你bootstrap 分析 生成的data的过程简略地说一下吗?或者是sas程序。我对bootstrap的原理一直不很理解,许多paper对bootstrap的应用也很牵强,似是而非的。
其实我想做的boostrap属于残值再取样的,具体步骤是这样的:
1, 对每家公司,按公式:Yi=ai+bi*Bi,t+ci*Ci,t 做时间序列回归。得出每家公司的ai,bi,ci,以及一组残值ei,t;
2, 然后对每家公司的残值进行有放回的再抽(抽取的数目与原来的数目一样),得出bootstrapping 残值(ebi,t);
3, 假设a=0, 将ebi,t带回公式Ybi= bi*Bi,t+ci*Ci,t+ebi,t,得出一个新的Ybi (bootstrapping Y);
4; 再用这个新生成的Ybi (bootstrapping Y)去做 Ybi =ai+bi*Bi,t+ci*Ci,t 时间序列回归,得出一个新的ai (我称之为ab),boostrapping alpha.
5. 步骤2-4,重复1000次。也就是说每家公司最后有1000个boostrapping alpha.
这个就是我想要做的,不知您觉得什么语句对我来说更合适些呢?其实对SAS,我了解很少,主要是个工具来运用的。
如果哪位有非常好的语句,欢迎指教!
funwin 发表于 2010-4-7 21:46
15# jingju11
用上面语句,是能实现resid的再抽样,但是它的排序是按照时间来排的,而且有的值重复抽取,会把这个重复抽取的值放在一起。
但是我想要得到的是:在resid中任抽一个放在第一个,放回,再抽一个放在第二个,放回。。。。。所以最后抽取出的结果,时间上一定是打乱的;而且重复抽到的值,不一定会在一起(有可能第5次抽到这个值,第10次再抽到这个值,但它们应该分布放在第5和第10的位置上)。
不知如何能够改进能够实现这个目的?
其实我原来的bootstrap语句(在13楼)能够做到这一点,但就是有错误,哪位帮忙看看,错在哪儿了?怎么改?
万分感激!
Jingju11,您的语言非常好,实现了我想要的bootstrap residual resampling。非常感谢!现在还有个问题,不知用sas宏语句(或者其他语句)如何能完成下面这些目的? 之前的求了100次的残值为
_1, _2,…, _100
co | date | X1 | X2 | t | pre | _1 | _2 | ….. | _100 |
10001 | 200501 |
|
| 0.89 |
| 0.023 | 0.0025 | 0.023 | … |
….. | ….. |
|
| 0.89 |
| 0.0025 | -0.0154 | 0.023 | … |
10001 | 200812 |
|
| 0.89 |
| -0.0154 | -0.0154 | 0.0025 | … |
10003 |
|
|
|
|
|
|
|
|
|
…… |
|
|
|
|
|
|
|
|
|
对每家公司:得到新的y:
y1=pre+_1, y2=pre+_2……y100=pre+_100; (同时为了节省空间把残值_1,_2…._100去掉). 用新的y,
对每家公司每个y值分别做时间序列回归,proc reg; model y1=x1 x2;
…….
model y100=x1 x2; 每家公司得出100个intercept, intercept的t-statistics; 再得出这100个t-statistics中有多少个是大于等于t (原来的t-value)的,得出一个p_boot=大于等于t 的个数/抽样数100 . 希望再帮忙解决一下我的问题。万分感激!
扫码加好友,拉您进群



收藏
