0

我正在做一个失败分析,我喜欢尝试一些不同的场景和一些随机试验。到目前为止,我已经使用马赛克包完成了这项工作,并且效果很好。在一个特定的场景中,我想生成一个来自不同分布的(半)随机数向量。到目前为止没有问题。

现在我想在这个向量中定义负数的数量。例如,我想在 25 个数字的向量中有 0-5 个负数。我想我可以使用类似rbinom(n=25,prob=5/25,size=1)先随机获得 5 个的东西,但当然 5/25,25 次可以超过 5 个。这似乎是一个死胡同。我可以用一些 for 循环来完成它,但可能存在一些更简单的东西。我尝试了各种样本、序列、随机组合,但到目前为止我无法让它工作。

有没有人有任何想法或建议?

4

2 回答 2

3

如果你有一个所有元素都 >= 0 的向量 x,假设从 Poisson 绘制:

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
于 2013-10-08T17:51:53.407 回答
0

我可以提出一个非常直接的解决方案,保证 5 个负值并适用于任何连续分布。这个想法只是对向量进行排序并将每个值减去第 6 个最大值:

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

它也适用于离散分布,但前提是没有关系。

于 2016-09-22T20:17:57.597 回答