Матрица с различным распределением элементов в R - PullRequest
0 голосов
/ 05 декабря 2018

Я хотел бы создать матрицу M:

n <- 10
prob0 <- 0.75
M <- matrix(sample(c(0,1), size=n*n, replace=TRUE, prob=c(prob0, 1 - prob0)), n, n)

, где для каждого элемента (i, j) prob0 берется из uniform([0,1]) без повторения цикла for (если оновозможно).Общая проблема, к которой относится моя проблема, заключается в следующем: есть ли способ создать в R матрицу, скажем, NxN, в которой каждый элемент происходит из другого распределения без повторения цикла for?

1 Ответ

0 голосов
/ 05 декабря 2018

Если я правильно понимаю вашу проблему, вам нужна матрица M, в которой каждый элемент (i,j) будет равен 0, если случайное значение r, взятое из uniform([0,1]), больше p и 1иначе.Это может быть легко достигнуто с помощью:

n <- 10
prob0 <- 0.75
matrix(runif(n * n) > prob0, n, n)

Если вы хотите разные prob0 для каждого элемента, просто замените его также на runif(n * n):

matrix(runif(n * n) > runif(n * n), n, n)

Но на этомточка, вы просто сравниваете пары случайных чисел, поэтому

matrix(runif(n * n) > 0.5, n, n)

дает один и тот же результат.

Если вам нужны совершенно разные распределения для каждого элемента в матрице, вы можете сделать что-то вроде создания двухсписки, один с именами функций, а другой с их параметрами и использующий mapply + do.call:

n_ <- 10
dists <- list(
  NORM_11 = "rnorm",
  UNIF = "runif",
  NORM_23 = "rnorm")
params <- list(
  NORM_11 = list(n = n_, mean = 1, sd = 1),
  UNIF = list(n = n_),
  NORM_23 = list(n = n_, mean = 2, sd = 3))
mapply(dists, params, FUN = do.call)

Обратите внимание, что имена (NORM_11 и т. д.) приведены просто для удобства,и mapply соответствует dists и params по позициям, поэтому убедитесь, что оба списка совпадают.

В этом примере вы получаете 10 случайных чисел из каждого распределения, агрегированных по столбцам (название списка dists помогает, поскольку столбцы результата будут иметь одинаковые имена).Если вы хотите что-то вроде матрицы 10x10, сэмплированной из 100 различных дистрибутивов, я предлагаю вам найти способ сгенерировать dists и parameters и установить n_ <- 1.Это даст вам числовой вектор из 100 элементов, которые вы можете легко преобразовать в матрицу, используя matrix() или установив dims().

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

mapply(mean = 101:200, sd = 1:101, FUN = rnorm, MoreArgs = list(n = 1))

(я все еще не вижу смысла брать только одну выборку из случайного распределения ... но я думаю, что это не по теме)

...