Заполните матрицу proc iml SAS

У меня есть матрица x с двумя столбцами (c1, c2). Я хочу исправить первый столбец (c1), добавить 10 столбцов, каждый из которых имеет значения C2+m, C2+m...C2+m в матрицу X, m - случайное целое число. наконец, матрица будет:

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

КОД:

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;

Может кто-нибудь помочь мне исправить это .. Спасибо


person DIY-DS    schedule 24.09.2014    source источник
comment
Не забудьте sas-iml, если у вас есть вопросы по IML.   -  person Joe    schedule 24.09.2014


Ответы (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;
person Joe    schedule 24.09.2014
comment
Хороший. Одно небольшое исправление: вам нужно использовать u=floor(u+0.5) или u=round(u), если вы хотите, чтобы целые числа достигли минимального и максимального значений. Если OP использует старую версию SAS, которая не поддерживает параметры для равномерного распределения, он может использовать u = Min + round((Max-Min)*u); - person Rick; 25.09.2014
comment
@Rick Спасибо за разъяснение, исправлено. - person Joe; 25.09.2014