Матричные манипуляции с SAS / IML - PullRequest
0 голосов
/ 13 марта 2012

Я определяю базовую матрицу:

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} такой же вероятный, как и любой другой.

Ответы [ 4 ]

1 голос
/ 13 марта 2012

Я не очень хорош в IML, но самый эффективный подход - генерировать новую матрицу, в каждой строке которой есть целое число в 1,...,k, где k - количество переменных (4 в вашем случае). Затем вы можете использовать эту матрицу для перестановки элементов вашей существующей матрицы.

Этот подход показан в этом сообщении в блоге , за исключением того, что вам придется изменить его для работы со всей матрицей - в его коде вход представляет собой вектор строки.

0 голосов
/ 13 марта 2012

Как говорит @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 */

В дополнение к сообщению в блоге@ Я упомянул, вы можете прочитать " Как генерировать случайные числа в SAS "

0 голосов
/ 13 марта 2012

Не уверен, что это то, что вы хотите. Это простая программа для выбора случайных элементов из исходной матрицы. Замените 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;
0 голосов
/ 13 марта 2012

Возможно, вы сможете использовать функции 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:
...