Множественное подмножество Matrix и хранение в массиве - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть матрица размера H (r x c), и я хочу сделать выборку этой матрицы 100 раз, извлекая 100 матриц размера (m x c) и сохранять каждую из них в массив dim (m x c x 100).

Для случайного извлечения подвыборок я решил:

  1. извлекать сто векторов длины m, содержащих случайные числа из последовательности (1: r)
  2. сохранить их в матрицу размера (м х 100)
  3. использовать каждый вектор этой матрицы в качестве идентификаторов для отбора 100 матриц из исходной матрицы H
  4. Наконец, сохраните каждую матрицу, полученную в этом подобразце, в массив, третье измерение которого будет равно 100.
H = matrix( , nrow=r, ncol=c) 
id = seq(1:r)
N_samples = 100
# Empty array and matrix of the random numbers
B = array( , c(m, c, N_samples))
h_sample = matrix( , nrow = m, ncol = N_samples)

# Extract random numbers from the sequence "id" without replacement
for(i in 1:N_samples){
  h_sample[,i] = sample(id, m, replace = F)
}

## Now I sample the rows from H according to the identifiers randomly extracted and stored in matrix h_sample, and place each submatrix into the B array

for(j in 1:N_samples){
  B[ , , j] = H[h_sample[ ,j], ]
}

Возвращает мне эту ошибку:

Error in B[, , i] = H[h_sample[, i], ] : incorrect number of subscripts

Я знаю, что проблема заключается в последней строке кода, есть ли у вас какие-либо советы по устранению этой ошибки? Не могли бы вы предложить альтернативные способы решения этого упражнения?

1 Ответ

0 голосов
/ 23 апреля 2019

Один из способов справиться с этим - использовать базовую функцию replicate, которая в этом случае будет реплицировать поднабор матрицы в указанное количество раз и напрямую создаст массив матриц.

r <- 100 # number of rows
c <- 50  # number of columns
m <- 10  # number of rows you want to extract 

# example matrix 
H = matrix(rnorm(r*c), nrow=r, ncol=c) 

arr <- replicate(100, {
   id <- sample(1:r,m, replace = FALSE) # if you want to sample rows without replacement
   H[id,]
})
dim(arr)
# [1]  10  50 100
...