用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 */