Генерировать случайный вектор с определенным количеством отрицательных чисел

Я делаю анализ отказов, для которого мне нравится пробовать несколько разных сценариев и несколько случайных испытаний. До сих пор я делал это с пакетом мозаики и отлично работал. В одном конкретном сценарии я хочу сгенерировать вектор (полу) случайных чисел из разных распределений. Пока проблем нет.

Теперь я хочу определить количество отрицательных чисел в этом векторе. Например, я хочу иметь от 0 до 5 отрицательных чисел в векторе из 25 чисел. Я думал, что мог бы использовать что-то вроде rbinom(n=25,prob=5/25,size=1) сначала получить 5 случайных, но, конечно, 5/25, 25 раз может быть больше, чем 5. Это кажется тупиком. Я мог бы сделать это с некоторыми циклами for, но, вероятно, что-то проще существует. Я перепробовал все виды семплов, последовательностей, случайных комбинаций, но пока не могу заставить его работать.

у кого-нибудь есть идеи или предложения?

2 ответа

Если у вас есть вектор x, где все элементы>= 0, скажем, нарисованный из Пуассона:

x = rpois(25, lambda=3)

Вы можете сделать случайные 5 негативов, выполнив

x * sample(rep(c(1, -1), c(length(x) - 5, 5)))

Это работает, потому что

rep(c(1, -1), c(length(x) - 5, 5))

будет

#  [1]  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1 -1 -1 -1 -1 -1

а также sample(rep(c(1, -1), c(length(x) - 5, 5))) просто перемешивает их случайным образом:

sample(rep(c(1, -1), c(length(x) - 5, 5)))
#  [1]  1  1 -1  1  1  1  1  1  1  1  1 -1  1  1  1 -1 -1  1  1  1 -1  1  1  1  1

Я могу предложить очень простое решение, гарантирующее 5 отрицательных значений и работающее для любого непрерывного распределения. Идея состоит в том, чтобы просто отсортировать вектор и вычесть шестое по величине для каждого значения:

x <- rnorm(25)
res <- sort(x, T)[6] - x
#### [1]  0.4956991  1.5799885  2.4207497  1.1639569  0.2161187  0.2443917 -0.4942884 -0.2627706  1.5188197
#### [10]  0.0000000  1.6081025  1.4922573  1.4828059  0.3320079  0.3552913 -0.6435770 -0.3106201  1.5074491
#### [19]  0.6042724  0.3707655 -0.2624150  1.1671077  2.4679686  1.0024573  0.2453597
sum(res<0)
#### [1] 5

Это также работает для дискретных распределений, но только если нет связей..

Другие вопросы по тегам