Если я правильно понимаю вашу проблему, вам нужна матрица 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))
(я все еще не вижу смысла брать только одну выборку из случайного распределения ... но я думаю, что это не по теме)