生成具有特定数量负数的随机向量

Posted

技术标签:

【中文标题】生成具有特定数量负数的随机向量【英文标题】:generate a random vector with specific number of negative numbers 【发布时间】:2013-10-15 19:00:43 【问题描述】:

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

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

有人有什么想法或建议吗?

【问题讨论】:

你的数字的绝对值来自什么分布?它们会是整数吗?连续? @user1549537 您好,如果任何答案解决了您的问题,您可以点击“接受”以便其他人看到吗?谢谢 【参考方案1】:

我可以提出一个非常简单的解决方案,保证 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

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

【讨论】:

【参考方案2】:

如果您有一个所有元素都 >= 0 的向量 x,假设是从泊松绘制的:

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

【讨论】:

如果分布属性扩展到整个 25 个向量,其中一些条目具有负数,则要困难得多,而不是绘制一个 25 个向量然后随机使 5 个条目为负数。它类似于对具有固定行和列总和的二进制矩阵进行采样。首先钳制一件事情会使事情变得容易得多,但很少能满足所需要的分布式特性。这不是对您的方法的批评,只是一个评论,一般来说,必须采用 MCMC 类型的方法才能同时满足许多分布属性。

以上是关于生成具有特定数量负数的随机向量的主要内容,如果未能解决你的问题,请参考以下文章

三角分布的随机样本:R

如何生成指向具有各向同性方向分布的随机方向的单位向量?

生成具有恒定堆栈空间的随机向量

使用javascript生成具有特定时间范围的随机模拟数据

在 R 中生成具有相同数量节点和关系的多个随机图?

生成具有给定元素数量和错误级别的已定义 Min、Max、Mean 和 Stdev 的随机数数组