SAS/IML: как использовать отдельные компоненты дисперсии в RANDNORMAL

Это вопрос программирования, но сначала я расскажу вам немного о статистике. Этот вопрос относится к части симуляции данных для модели масштаба местоположения со смешанными эффектами (т. Е. Гетерогенных отклонений). Я пытаюсь смоделировать два компонента MVN дисперсии, используя функцию RANDNORMAL в IML. Поскольку оба компонента дисперсии неоднородны, дисперсии, используемые RANDNORMAL, будут различаться у разных людей. Таким образом, мне нужен IML, чтобы выбрать конкретную строку (например, строка 1 = персона 1) и использовать функцию RANDNORMAL, прежде чем перейти к следующей строке, и так далее.

Мой пример кода ниже для 2 человек. Я использую DO, чтобы пройтись по отдельным компонентам дисперсии каждого человека (VC1 и VC2). Я получаю сообщение об ошибке: "Модуль RANDNORMAL вызывается снова перед выходом из предыдущего вызова". Я предполагаю, что мне нужна какая-то функция BREAK или EXIT в цикле DO, но я не пытался работать.

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.

2 ответа

Решение

Вы хотите переместить некоторые вещи, но в основном вы не хотите переписывать U дважды: вам нужно написать 1-й ряд U, а затем 2-й ряд U, если я понимаю, что вы пытаетесь сделать. Ниже также немного более эффективно, так как I j() матрицы U и _cv, а не конструирование, а затем de novo каждый раз в цикле (что медленно).

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;

Ваша ошибка - линия

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

который не является допустимым синтаксисом SAS/IML. Вместо этого используйте подход @ Джо или используйте

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

Подробнее см. Статью "Как построить матрицы из выражений".

Вас также может заинтересовать эта статья, в которой описывается, как выполнить это моделирование с помощью блок-диагональной матрицы: "Построение блочных матриц с применением к смешанным моделям".

Другие вопросы по тегам