生成具有特定数量负数的随机向量
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 类型的方法才能同时满足许多分布属性。以上是关于生成具有特定数量负数的随机向量的主要内容,如果未能解决你的问题,请参考以下文章