2014-09-24 193 views
1

我有一个x矩阵,有两列(c1,c2)。我想修复第一列(c1),向X矩阵添加10列,每列有值C2 + m,C2 + m ... C2 + m,m是一个随机整数。最后矩阵将是:填充矩阵proc iml SAS

C1,C2 + m,C2 + m,C2 + m ... C2 + m;

CODE:

proc iml; 

use nonpar; 

read all var{treat response} into x; 

do i=1 to 10; 

call randseed(123); 

call randgen(u, "Uniform"); 

Max = 300; Min = 68; 

m = min + floor((1+Max-Min)*u); 

x = x[,1]||x[,2]+m; 

end; 

quit; 

有人可以帮我解决这个问题.. 感谢

+0

如果您有IML问题,请不要忘记[tag:sas-iml]。 – Joe 2014-09-24 16:31:21

回答

1

夫妇的事情,应该引领你在正确的方向。

首先,预先创建完整的目标矩阵;不要连续不断地连接。因此,一旦您将数据集读入x,请创建另一个x_new,其行数与x相同,但有11列。 j会为你做这个。其次,您可以一次制作所有的随机数字,但您必须首先使用j来定义要填充的矩阵的大小。这是假设你想要一个新的随机整数为每个10列和每一行;如果你只想要每一行或总共只有一个'm',你需要以不同的方式做这件事,但你需要澄清这一点。如果您只需要一行10米,那么您可以先执行该操作(生成一个u,其中有10列1行),然后使用矩阵乘法将其扩展为x的全行数。

下面是使用SASHELP.CLASS显示这两个概念的简化示例。

proc iml; 
    use sashelp.class; 
    read all var {age weight} into x; 
    x_new = j(nrow(x),11); *making the new matrix with lots of columns; 
    x_new[,1] = x[,1];  *copy in column 1; 
    call randseed(123); 
    u = j(nrow(x),10);  *make the to be filled random matrix; 
    call randgen(u,'Uniform',68,300); *the min/max parameters can go here; 
    u = floor(u+0.5); *as Rick noted in comments, needed to get the max value properly; 
    x_new[,2:11] = u[,1:10] + x[,2]; *populate x_new here; 
    print x_new; 
quit; 
+0

不错。一个小小的改正:如果你想让整数达到最小值和最大值,你需要使用u = floor(u + 0.5)或u = round(u)。如果OP使用旧版SAS不支持统一分发的参数,他可以使用u = Min + round((Max-Min)* u); – Rick 2014-09-25 14:35:28

+0

@Rick感谢您的澄清,修正。 – Joe 2014-09-25 14:42:46