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);
Подробнее см. Статью "Как построить матрицы из выражений".
Вас также может заинтересовать эта статья, в которой описывается, как выполнить это моделирование с помощью блок-диагональной матрицы: "Построение блочных матриц с применением к смешанным моделям".