我正在尝试有效地实现块引导技术,以便从PROC MIXED
获得回归系数的分布。主要内容如下:
我有一个面板数据集,比如firm
和year
是索引。对于bootstrap的每次迭代,我希望用替换n个主题进行采样。从这个示例中,我需要构建一个新的数据集,它是每个采样主题的所有观察结果的“堆栈”(行顶部的连接行)。有了这个新数据集,我就可以运行回归并提取出感兴趣的系数。重复一堆迭代,比如2000。
每个公司都可能被多次选中,因此我需要在每个迭代的数据集中多次包含其数据。 使用循环和子集方法,似乎计算繁琐。 我的实际数据设置非常大(2Gb .sas7bdat文件)。
示例伪/解释代码(请原谅所有noob错误!):
DATA subjectlist;
SET mydata;
BY firm;
IF first.firm;
RUN;
%macro blockboot(input=, subjects=, iterations=);
%let numberfirms = LENGTH(&subjects);
%do i = 1 %to &iterations ;
DATA mytempdat;
DO i=1 TO &numberfirms;
rec = ceil(&numberfirms * ranuni(0));
*** This is where I want to include all observations for the randomly selected subjects;
*** However, this code doesn't include the same subject multiple times, which...;
*** ...is what I want;
SET &INPUT subjects IN &subjects;
OUTPUT;
END;
STOP;
PROC MIXED DATA=mytempdat;
CLASS firm year;
MODEL yval= cov1 cov2;
RANDOM intercept /sub=subject type=un;
OUTPUT out=outx cov1=cov1 ***want to output the coefficient estimate on cov1 here;
RUN;
%IF &i = 1 %THEN %DO;
DATA outall;
SET outx;
%END;
%ELSE %DO;
PROC APPEND base=outall data=outx;
%END;
%END; /* i=1 to &REPS loop */
PROC UNIVARIATE data=outall;
VAR cov1;
OUTPUT out=final pctlpts=2.5, 97.5 pctlpre=ci;
%mend;
%blockboot(input=mydata,subjects=subjectlist, reps=2000)
这个问题与我之前提出的问题相同,在这里找到:
block bootstrap from subject list
感谢任何帮助!
答案 0 :(得分:1)
有关在SAS中执行此操作的最佳方法的详细信息,请参阅以下文章:
http://www2.sas.com/proceedings/forum2007/183-2007.pdf
总的来说,使用PROC SURVEYSELECT的方法允许使用替换进行采样以创建引导样本,然后使用PRO处理PROC MIXED仅运行PROC一次而不是运行2000次。