0

から回帰係数の分布を取得するために、ブロックブートストラップ手法を効率的に実装しようとしていますPROC MIXED。主な概要は次のとおりです。

私はパネルデータセットを持っています、例えばfirm、そしてそれyearはインデックスです。ブートストラップの反復ごとに、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)

この質問は、私が以前に尋ねた質問と同じです。ここにあります。

サブジェクトリストからブートストラップをブロックする

どんな助けでも大歓迎です!

4

1 に答える 1

1

SAS でこれを行う最善の方法の詳細については、次のペーパーを参照してください。

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

一般的な要約は、PROC SURVEYSELECT を置換によるサンプリングを可能にする方法で使用してブートストラップ サンプルを作成し、次に BY 処理を PROC MIXED で使用して、PROC を 2000 回実行するのではなく 1 回だけ実行することです。

于 2012-11-21T21:08:07.820 に答える