用SAS/IML进行矩阵操作

用SAS/IML进行矩阵操作,sas,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         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,2,3,4,5,6,7,8,9,10}


为了用替换方法重新采样,我们从集合中随机选取10个对象,形成一个新的10元素集合,并且我们可以多次选取一个元素,因此集合{1,1,1,1,1,1,1,1,1}与任何其他集合一样可能。

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

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:

我对IML不是很在行,但是最有效的方法是生成一个新的矩阵,每行有一个1,…,k中的整数,在你的例子中,k是变量4的数量。然后可以使用此矩阵重新排列现有矩阵的元素


显示了这种方法,但您必须修改它以处理整个矩阵-在他的代码中,输入是行向量。

不确定这是否是您想要的。这是一个从原始矩阵中选择随机元素的简单程序。用所需的任何矩阵替换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;

正如@Itzy所说,您可以按行执行此操作。更有效的方法是一次生成1:ncolmatrix中的所有索引随机数,然后直接索引到矩阵中以提取值:

   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博文外,你可能还想读一读

谢谢你的好主意。然而,我所使用的数据并不像您的解决方案中那样简单地分布。我还应该提到,我们并不完全知道数据是如何分布的。你知道有什么方法可以。。。重采样?如果不想编辑,可以在循环中调用:Doi=1到nrowmatrix;s=SampleReplaceUnimatrix[i,],1,ncolm;终止谢谢@Rick。实际上,我想在我的帖子中说,你的博客总体上是一个很好的来源。我以前在这里没见过你。挑剔的一点,但你的示例并没有显示用替换对每一行进行采样,因为这样会选择整个随机行。从您的示例中,我假设您希望对每行的元素重新采样。这也是答案的假设。
   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 */