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
为什么它们不等价?
#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