【问题标题】:Confusion Between 'sample' and 'rbinom' in RR中“样本”和“rbinom”之间的混淆
【发布时间】:2016-01-03 21:09:31
【问题描述】:

为什么这些不相等?

#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)

我最初尝试使用“样本”。我以为我在做的是生成十 (0,1) 对,然后分配每个将返回 0 或 1 的概率。

第二个有效,并为我提供了我需要的输出(尝试运行 sim)。所以我已经能够解决我的问题。我只是对“样本”的幕后情况很好奇,这样我就可以更好地理解 R。

【问题讨论】:

  • 您可以执行该行的各个部分并查看发生了什么。 rep(c(0,1), length(x)) 生成一个长度为 20 且 0 和 1 相等的数值向量。 c(rbind(1-x,x)) 生成长度为 20 的数字权重以用于采样。然后,样本本身将从您提供的长度为 20 的向量中抽取一项。
  • 对于您的情况,可以使用set.seed(1); rbinom(length(x), size = 1, prob=x); set.seed(1); sapply(x, function(xx) sample(0:1, 1, prob=c(1-xx, xx))) 找到等效结果(效率较低)

标签: r statistics


【解决方案1】:

第一个不同的地方是参数列表中向量规范的长度位置。名称size 在这两个函数中具有不同的含义。 (我之前没有考虑过这种混乱的根源,我相信我自己也犯过很多次这个错误。)

随机数生成器(以r 开头并具有分布后缀)将该选项作为第一个参数,而sample 将其作为第二个参数。所以第二个的长度是 10,第一个的长度是 1。在示例中,绘制来自第一个参数中的值,而“大小”是要创建的向量的长度。在rbinom 函数中,n 是要创建的向量的长度,而size 是假设从具有由“概率”确定的分布的理论瓮中抽取的项目数。返回的结果是“一”的数量。试试:

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

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

【讨论】:

  • 我认为 size 参数在 rbinom() 中的作用与在 sample() 中的作用相同。我相信不同之处在于 sample() 函数给出了原始的“试验”,而 rbinom() 函数更进一步并运行实验,计算每个“试验”中的成功次数与用户指定的次数一样多.
【解决方案2】:

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

想象一副洗好的牌,并从中选择一些牌。这正是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 函数的目标是模拟结果“离散”的事件,例如掷硬币。它根据给定的 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 

【讨论】:

  • Worice:那是一个错字。它应该读取 size=10 (自编辑)。这确实给了我 10 个数字,但是当我运行数千次模拟时,我得到的结果与我的预期不一致。它们总是太高(对于概率决定的太多 1),这就是导致我找到“rbhinom”解决方案的原因。
  • 当时我没有充分理解这个问题。误会请见谅!
猜你喜欢
  • 1970-01-01
  • 2016-09-22
  • 2015-06-01
  • 2020-01-08
  • 2012-10-21
  • 2011-09-22
  • 2013-01-03
  • 2012-06-23
  • 1970-01-01
相关资源
最近更新 更多