【问题标题】:sample vector exactly according to the probability given完全根据给定概率的样本向量
【发布时间】:2016-03-15 04:40:58
【问题描述】:

我相信 R 中应该有这个功能。但是,我找不到它。我需要的是根据给定的概率获取向量。我认为sample 可以做到这一点,但这不是我真正想要的。

sample(c(1, 2, 3, 4), size = 4, prob=c(0.25, 0.25, 0.25, 0.25)) 

给予

# [1] 1 3 4 2

这是正确的。

那我试试

sample(c(1, 2, 3, 4), size = 8, replace = T, prob=c(0.25, 0.25, 0.25, 0.25)) 

# [1] 1 4 4 3 2 3 1 3

我真正需要的是类似

#[1] 1 4 4 2 2 3 1 3

#[1] 2 3 1 1 4 4 2 3

或类似的东西,其中给定的向量根据给定的概率精确划分。所以在给定的例子中,输出向量应该包含c(1, 2, 3, 4) 中每个向量的0.25。因此,如果size = 8 则其中的 0.25 为 2,这应该是 c(1, 2, 3, 4) 中每个元素的长度。 R 中是否已经为此提供了一个函数,或者我必须编写一个自定义函数?

【问题讨论】:

  • 我想你不想要c(sample(4), sample(4)) ?或c(replicate(2,sample(4))) ?
  • sample(rep(1:4, 2)) - 你可以进一步概括它,但基本上你想要做的是创建一个具有所需重复次数的向量,然后使用样本对其进行置换。
  • @jogo 我相信您的代码仅适用于相同数量的概率值。 (这里是 0.25)。如果我的概率为c(0.2, 0.4, 0.2, 0.2) 怎么办?
  • 是的,您的示例(直到现在)也仅适用于等概率。但是有eipi10的解决方案和Dason的评论,你可以使用或者(在Dasons评论的情况下)详述。

标签: r sample


【解决方案1】:

由于您希望每个值的重复次数是确定性的,而不是随机的,因此请使用rep(而不是sample)按照每个值在prob 中的概率按比例重复每个值。然后您可以创建结果向量的随机排列。

x = c(1,2,3,4)

prob = c(0.1,0.2,0.3,0.4)

# Total sample size
n = 20

result = rep(x, round(n * prob))

[1] 1 1 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 4 4 4

然后创建,比如说,100 个随机排列:

replicate(100, sample(result))

【讨论】:

  • 我认为他们也希望它被置换,但只需用sample 包裹整个事情就可以解决这个问题
  • @Dason 完全正确!谢谢eipi10。 sample(rep(x, round(n * prob))) 为我工作
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 2017-06-27
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多