我正在定义基本矩阵:
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}和其他任何一样可能。
答案 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"