R 中 'sample' 和 'rbinom' 之间的混淆

Confusion Between 'sample' and 'rbinom' in R

为什么它们不等价?

#First generate 10 numbers between 0 and .5
set.seed(1)
x <- runif(10, 0, .5)

这是让我感到困惑的两个陈述:

#First    
sample(rep(c(0,1), length(x)), size = 10, prob = c(rbind(1-x,x)), replace = F)
#Second
rbinom(length(x), size = 1, prob=x)

我本来想用 'sample'。我以为我在做的是生成十 (0,1) 对,然后分配每个 return 0 或 1 的概率。

第二个有效并提供了我需要的输出(尝试 运行 模拟)。所以我已经能够解决我的问题。我只是想知道 'sample' 的幕后发生了什么,这样我才能更好地理解 R。

第一个不同点是向量规范的长度在参数列表中的位置。名称 size 在这两个函数中具有不同的含义。 (我以前没有想过那个混乱的根源,我敢肯定我自己也犯过很多次这个错误。)

随机数生成器(以 r 开头并具有分布后缀)将该选择作为第一个参数,而 sample 将其作为第二个参数。所以第二个的长度是 10,第一个的长度是 1。在示例中,绘制来自第一个参数中的值,而 'size' 是要创建的向量的长度。在 rbinom 函数中,n 是要创建的向量的长度,而 size 是假设从一个分布由 'prob'.返回的结果是"ones"的个数。尝试:

rbinom(length(x), size = 10, prob=x)

关于 prob 的论点:我认为您不需要 c()

这两个函数的区别很简单。

想一副洗好的牌,然后从中选择一些牌。这正是 sample 模拟的情况。 这段代码,

> set.seed(123)
> sample(1:40, 5)
[1] 12 31 16 33 34

1:40 数字向量中随机抽取五个数字。

在您的示例中,您设置了 size = 1。这意味着您只能从可能值池中选择一个元素。如果你设置 size = 10 你会得到你想要的十个值。

set.seed(1)
x <- runif(10, 0, .5)
> sample(rep(c(0,1), length(x)), size = 10, prob = c(rbind(1-x,x)), replace = F)
[1] 0 0 0 0 0 0 0 1 0 1

相反,rbinom 函数的目标是模拟结果为 "discrete" 的事件,例如抛硬币。它根据给定的概率 0.5 将试验(例如抛硬币)的成功概率视为参数。这里我们模拟 100 次翻转。如果您认为可以堆叠硬币以支持一个特定的结果,我们可以通过将概率设置为 0.8 来模拟这种行为,如下例所示。

> set.seed(123)
> table(rbinom(100, 1, prob = 0.5))
 0  1 
53 47 

> table(rbinom(100, 1, prob = 0.8))
 0  1 
19 81