从主题列表中阻止引导程序,在PROC MIXED中提取系数

时间:2012-11-21 19:36:24

标签: sas regression statistics-bootstrap

我正在尝试有效地实现块引导技术,以便从PROC MIXED获得回归系数的分布。主要内容如下:

我有一个面板数据集,比如firmyear是索引。对于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

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

有关在SAS中执行此操作的最佳方法的详细信息,请参阅以下文章:

http://www2.sas.com/proceedings/forum2007/183-2007.pdf

总的来说,使用PROC SURVEYSELECT的方法允许使用替换进行采样以创建引导样本,然后使用PRO处理PROC MIXED仅运行PROC一次而不是运行2000次。