1

这是一个编程问题,但我会先给你一些统计背景知识。这个问题是指混合效应位置尺度模型(即异质方差)的数据模拟的一部分。我正在尝试使用 IML 中的 RANDNORMAL 函数来模拟两个 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);

有关详细信息,请参阅文章“如何从表达式构建矩阵”。

您可能还对这篇描述如何使用块对角矩阵进行模拟的文章感兴趣:“Constructing block matrices with applications to mixed models”。

于 2014-09-19T14:02:01.767 回答
1

你想移动一些东西,但大多数情况下你不想重写 U 两次:你需要写 U 的第一行,然后是 U 的第二行,如果我理解你想要做什么的话。下面的效率也更高一些,因为我 j() U 和 _cv 矩阵,而不是每次通过循环时都从头开始构建(这很慢)。

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 回答