0

うまくいけば、簡単な答えです。私はシミュレーション研究を行っています。ここでは、1,000 回程度の複製ごとに、一様分布 U(25,200) から乱数の個体 N をサンプリングする必要があります。1 つのレプリケーションのコードを以下に示します。

%LET U = RAND("UNIFORM");
%LET N = ROUND(25 + (200 - 25)*&U.);

SAS と IML の両方で後続の DATA ステップと DO ループで N 変数を繰り返し呼び出す必要があるため、これらのマクロ変数は両方とも DATA ステップの外で作成しました。

問題は、レプリケーション内で N を呼び出すたびに、U が再サンプリングされ、必然的に N が変更されることです。したがって、N はレプリケーション内で一定に保たれません。この問題は、以下のコードに示されています。ここでは、最初に N を変数 (個人間で一定) として作成し、DO ループを使用して各個人の X の予測子の値をサンプリングします。N の値が個体の総数と同じではないことに注意してください。これも問題です。

DATA ID; 
    N = &N.;
    DO PersonID = 1 TO &N.;
        X = RAND("NORMAL",0,1); OUTPUT;
    END;
RUN;

私がしなければならないことは、1 回の複製全体を通して何らかの方法で U を一定に保ち、次に複製 2 のために再サンプリングできるようにすることであると推測しています。U を一定に保つことにより、N は必然的に一定に保たれます。

マクロ変数を使用してこれを行う方法はありますか?

4

3 に答える 3

0

マクロの世界でそれを行う方法はわかりませんが、これはコードをデータ ステップに変換して同じことを達成する方法です。

重要なのは、CALL STREAMINIT を使用して、乱数ストリームの初期化値を設定することです。

Data _null_;
call streaminit(35);
u=rand('uniform');
call symput('U', u);
call symput('N',  ROUND(25 + (200 - 25)*U));
run;


%put &n;
%put &u;
于 2015-02-19T18:29:50.810 に答える
0

&N値を格納しません。 &Nコード "ROUND(...(RAND..." など) を格納します。マクロ変数を誤用しています。ここでは、数値を格納でき&Nますが、そうしてい%sysfuncません。ここで本当に正しい答えです。

まず、複製を繰り返しサンプリングしている場合は、ここにいくつかのアプリケーションが記載されている論文「Don't be Loopy」を参照してください。また、Rick Wicklin の論文Sampling with Replacementと、彼が参照している彼の本 (「Simulating Data in SAS」) も非常に優れていると考えてください。1 サンプル 1 実行モデルでプロセスを実行している場合、それは遅くて扱いにくい方法です。一度にすべての複製を行い、一度にすべて処理します。IML と SAS は喜んでそれを行います。均一なランダム サンプル サイズを扱うのは少し難しくなりますが、克服できないわけではありません。

あなたがやっているようにそれをしなければならない場合、それを行う理由がある場合は、データステップにマクロ変数を作成するように依頼します. call symputサンプルの最後に、 N の値を出力するために使用できます。IE:

%let iter=7; *we happen to be on the seventh iteration of your master macro;
DATA ID;
    CALL STREAMINIT(&iter.); 
    U = RAND("UNIFORM");
    N = ROUND(25 + (200 - 25)*U);
    DO PersonID = 1 TO N;
        X = RAND("NORMAL",0,1); 
        OUTPUT;
    END;
    CALL SYMPUTX('N',N);
    CALL SYMPUTX('U',U);
RUN;

ただし、1 データ ステップ モデルはおそらく最も効率的なモデルです。

于 2015-02-19T18:30:35.447 に答える