使用SAS / IML进行矩阵操作

时间:2012-03-12 22:52:34

标签: sas

我正在定义基本矩阵:

1         2         3         4
5         6         7         8

如下:

PROC IML;
    RESET NOPRINT;
    matrix = {1 2 3 4, 5 6 7 8};
EXIT:

我希望用替换重新采样每一行,所以我们生成如下的矩阵:

1         3         4         2
6         6         5         5

1         1         3         2
5         6         6         8

如何做到这一点?

请注意,如果您未与统计信息保持一致,那么如果我们有一组数据,则使用替换进行重新采样意味着:

{1,2,3,4,5,6,7,8,9,10}

并希望用替换重新取样,我们从集合中随机挑选10个对象以形成一个新的10个元素集,并且我们被允许多次挑选一个元素(所以集合{1,1,1, 1,1,1,1,1,1,1}和其他任何一样可能。

4 个答案:

答案 0 :(得分:1)

我对IML并不擅长,但最有效的方法是生成一个新的矩阵,每行中有一个1,...,k的整数,其中k是变量的数量(4 in你的情况)。然后,您可以使用此矩阵重新调整现有矩阵的元素。

这种方法显示为in this blog post,除了你必须修改它以适用于你的整个矩阵 - 在他的代码中,输入是一个行向量。

答案 1 :(得分:0)

您可以使用UNIFORM和INT函数生成此函数,假设您在结果矩阵中查找0到9之间的相对随机整数。请注意,UNIFORM函数将使用矩阵中的第一个元素作为种子,因此您需要指定不同的矩阵来获取不同的样本。

PROC IML;
    RESET NOPRINT;
    matrix = {1 2 3 4, 5 6 7 8};

    matrix_uniform = uniform(matrix);
    matrix_int_1 = int(matrix_uniform*10);

    matrix_uniform = uniform(matrix_int_1);
    matrix_int_2 = int(matrix_uniform*10);

    print matrix_int_1;
    print matrix_int_2;
EXIT:

答案 2 :(得分:0)

不确定这是否是你想要的。这是一个从原始矩阵中选择随机元素的简单程序。将x替换为您想要的任何矩阵。

proc iml;
x = {1 2 3 4, 5 6 7 8};
y= j(nrow(x),ncol(x),.);
    do i=1 to nrow(x);
      do j=1 to ncol(x);
        y[i,j]=x[int(1+(nrow(x)-1)*ranuni(0)),int(1+(ncol(x)-1)*ranuni(0))];
      end;
   end;
   print y ;
   quit;

答案 3 :(得分:0)

正如@Itzy所说,你可以按行进行。一种更有效的方法是一次生成所有索引(1:ncol(矩阵)中的随机数),然后直接索引到矩阵中以提取值:

   u = j(nrow(x),ncol(x)); 
   call randgen(u, "Uniform"); /* u~U[0,1] */
   k = ceil( ncol(x)*u );  /* k ~ U{1,2,3,4} */
   y = shape(x[k], nrow(x), ncol(x)); /* suscript and reshape */

除了@Itzy提到的博客文章之外,您可能还想阅读" How to generate random numbers in SAS"