1

これはプログラミングに関する質問ですが、最初に統計の背景を少し説明します。この質問は、混合効果ロケーション スケール モデル (つまり、不均一な分散) のデータ シミュレーションの一部に言及しています。IML の RANDNORMAL 関数を使用して、2 つの MVN 分散コンポーネントをシミュレートしようとしています。両方の分散コンポーネントが異種であるため、RANDNORMAL で使用される分散は人によって異なります。したがって、IML で特定の行 (行 1 = 個人 1 など) を選択し、次の行に移動する前に RANDNORMAL 関数を使用する必要があります。

以下のコード例は 2 人用です。DO を使用して、各人の特定の分散コンポーネント (VC1 と VC2) をループします。エラーが表示されます:「モジュール RANDNORMAL は、前の呼び出しから終了する前に再度呼び出されました。」DO ループである種の BREAK または EXIT 関数が必要であると想定していますが、試したことはありません。

PROC IML;
    ColNames = {"ID" "VC1" "VC2"};
    A = {1 2 3, 
         2 8 9};
    PRINT A[COLNAME=ColNames];
    /*Set men of each variance component to 0*/ 
    MeanVector = {0, 0};
    /*Loop through each person's data using THEIR OWN variances*/
    DO i = 1 TO 2;
        VC1 = A[i,2];
        VC2 = A[i,3];
        CovMatrix = {VC1 0, 
                     0   VC2};
        CALL RANDSEED(1);  
        U = RANDNORMAL(2, MeanVector, CovMatrix);
    END;
QUIT;

どんな助けでも大歓迎です。ああ、私は SAS 9.4 を使用しています。

4

2 に答える 2

1

あなたの間違いはラインです

CovMatrix = {VC1 0, 0   VC2}; /* wrong */

これは有効な SAS/IML 構文ではありません。代わりに、@Joe のアプローチを使用するか、

 CovMatrix = (VC1 || 0) // (0 || VC2);

詳細については、記事「式から行列を作成する方法」を参照してください。

ブロック対角行列を使用してこのシミュレーションを実行する方法を説明している記事「混合モデルへの適用によるブロック行列の構築」にも興味があるかもしれません。

于 2014-09-19T14:02:01.767 に答える
1

いくつかのことを動かしたいが、ほとんどの場合、U を 2 回書き直したくありません: U の 1 行目を書き、次に U の 2 行目を書く必要があります。以下は、ループを介して毎回de novoを構築するのではなく、Uおよび_cv行列をj()するため、少し効率的です(これは遅いです)。

proc iml;

  a = {1 2 3,2 8 9};
  print(a);
  _mv = {0,0};
  U = J(2,2);
  _cv = J(2,2,0);
  CALL RANDSEED(1);   

  do i = 1 to 2;
    _cv[1,1] = a[i,2];
    _cv[2,2] = a[i,3];
    U[i,] = randnormal(1,_mv, _cv);
  end;
  print(u);
quit;
于 2014-09-18T21:42:32.897 に答える