случайная выборка - матрица - PullRequest
4 голосов
/ 02 февраля 2012

Как я могу взять выборку из n случайных точек из матрицы, заполненной 1 и 0?

a=rep(0:1,5)
b=rep(0,10)
c=rep(1,10)
dataset=matrix(cbind(a,b,c),nrow=10,ncol=3)

dataset
      [,1] [,2] [,3]
 [1,]    0    0    1
 [2,]    1    0    1
 [3,]    0    0    1
 [4,]    1    0    1
 [5,]    0    0    1
 [6,]    1    0    1
 [7,]    0    0    1
 [8,]    1    0    1
 [9,]    0    0    1
[10,]    1    0    1

Я хочу быть уверен, что позиции (строки, столбцы), из которых я взял Nвыборки случайные.

Я знаю sample {base}, но, похоже, я не могу этого сделать, другие известные мне методы - это пространственные методы, которые заставят меня добавить x, y и изменить его на пространственный.объект и снова вернуться к нормальной матрице.

Дополнительная информация

Под случайным образом я подразумеваю также распространение внутри "пространства матрицы", например, еслиЯ делаю выборку из 4 точек, в результате чего я не хочу иметь 4 соседних точки, я хочу, чтобы они распространились в «пространстве матрицы».

Зная положение (ряд, столбец) в матрице, гдеЯ вынул случайные точки, также было бы важно.

Ответы [ 2 ]

12 голосов
/ 02 февраля 2012

Существует очень простой способ выбрать матрицу, которая работает, если вы понимаете, что R представляет матрицу внутри как вектор.

Это означает, что вы можете использовать sample непосредственно в вашей матрице.Например, предположим, что вы хотите выбрать 10 точек с заменой:

n <- 10
replace=TRUE

Теперь просто используйте sample в вашей матрице:

set.seed(1)
sample(dataset, n, replace=replace)
 [1] 1 0 0 1 0 1 1 0 0 1

Чтобы продемонстрировать, как это работает, давайте разберемэто в два этапа.Шаг 1 заключается в создании индекса позиций выборки, а шаг 2 - в поиске этих позиций в вашей матрице:

set.seed(1)
mysample <- sample(length(dataset), n, replace=replace)
mysample
 [1]  8 12 18 28  7 27 29 20 19  2

dataset[mysample]
 [1] 1 0 0 1 0 1 1 0 0 1

И, кстати, результаты двух методов идентичны.

4 голосов
/ 02 февраля 2012

Образец кажется лучшим выбором для вас. Чтобы получить 1000 случайных позиций, вы можете сделать что-то вроде:

rows = sample(1:nrow(dataset), 1000, replace = TRUE)
columns = sample(1:ncol(dataset), 1000, replace = TRUE)

Я думаю, это дает то, что вы хотите, но, конечно, я могу ошибаться.

Извлечение предметов из матрицы можно сделать так:

random_sample = mapply(function(row, col) 
                           return(dataset[row,col]), 
                    row = rows, col = columns)

Стратегии выборки

В комментариях вы говорите, что ваш образец должен распространяться. Случайная выборка не гарантирует, что кластеров не будет, из-за ее случайной природы. Есть еще несколько схем выборки, которые могут быть интересны для изучения:

  • Регулярная выборка, пропустить случайность и регулярно проводить выборку. Равномерно пробует все пространство матрицы, но случайности нет.
  • Стратифицированная случайная выборка, вы делите матричное пространство на регулярные подмножества, а затем производите случайную выборку в этих подмножествах. Представляет смесь между случайным и регулярным.

Чтобы проверить, дает ли ваша случайная выборка хорошие результаты, я бы повторил случайную выборку несколько раз и сравнил результаты (поскольку я предполагаю, что выборка будет использоваться для другого анализа?).

...