当样本和中的prob参数小于/大于1时会发生什么情况?

当样本和中的prob参数小于/大于1时会发生什么情况?,r,sample,R,Sample,我们知道sample中的prob参数用于分配权重的概率 比如说, table(sample(1:4, 1e6, replace = TRUE, prob = c(0.2, 0.4, 0.3, 0.1)))/1e6 # 1 2 3 4 #0.2 0.4 0.3 0.1 table(sample(1:4, 1e6, replace = TRUE, prob = c(0.2, 0.4, 0.3, 0.1)))/1e6 # 1 2 3 4 #0.

我们知道
sample
中的
prob
参数用于分配权重的概率

比如说,

table(sample(1:4, 1e6, replace = TRUE, prob = c(0.2, 0.4, 0.3, 0.1)))/1e6

#  1   2   3   4 
#0.2 0.4 0.3 0.1 


table(sample(1:4, 1e6, replace = TRUE, prob = c(0.2, 0.4, 0.3, 0.1)))/1e6

#    1     2     3     4 
#0.200 0.400 0.299 0.100 
在这个例子中,概率之和正好是1(0.2+0.4+0.3+0.1),因此它给出了预期的比率,但是如果概率之和不等于1呢?它将提供什么输出?我认为这会导致一个错误,但它提供了一些价值

当概率总和大于1时

table(sample(1:4, 1e6, replace = TRUE, prob = c(0.2, 0.5, 0.5, 0.1)))/1e6

#     1      2      3      4 
#0.1544 0.3839 0.3848 0.0768 

table(sample(1:4, 1e6, replace = TRUE, prob = c(0.2, 0.5, 0.5, 0.1)))/1e6

#     1      2      3      4 
#0.1544 0.3842 0.3848 0.0767 
当概率总和小于1时

table(sample(1:4, 1e6, replace = TRUE, prob = c(0.1, 0.1, 0.5, 0.1)))/1e6

#    1     2     3     4 
#0.124 0.125 0.625 0.125 

table(sample(1:4, 1e6, replace = TRUE, prob = c(0.1, 0.1, 0.5, 0.1)))/1e6

#    1     2     3     4 
#0.125 0.125 0.625 0.125 
如我们所见,多次运行会产生不等于
prob
的输出,但结果也不是随机的。在这种情况下,数字是如何分布的?记录在哪里

我试着在网上搜索,但没有找到任何相关信息。我查看了
?示例中的文档,其中

可选prob参数可用于给出权重向量,以获得采样向量的元素。它们不需要和为一,但它们应该是非负的,而不是全部为零。如果replace为真,则当存在超过200个合理的可能值时,使用Walker的alias方法(Ripley,1987):这给出的结果与R<2.2.0的结果不一致


所以它说,
prob
参数不需要求和为1,但是当它不求和为1时,它不会告诉我们期望得到什么?我不确定我是否遗漏了文件的任何部分。有人知道吗

如前所述,权重标准化为总和为1,如下所示:

> x/sum(x)
[1] 0.15384615 0.38461538 0.38461538 0.07692308
这与您的模拟表格数据相匹配:

#     1      2      3      4 
#0.1544 0.3839 0.3848 0.0768 

好问题。文档对此并不清楚,但可以通过查看源代码来回答这个问题

如果您查看R代码,
sample
总是调用另一个R函数,
sample.int
如果您将单个数字
x
传递给
sample
,它将使用
sample.int
创建一个小于或等于该数字的整数向量,而如果
x
是一个向量,它使用
sample.int
生成小于或等于
length(x)
的整数样本,然后使用该样本生成x子集

现在,如果您检查函数
sample.int
,它如下所示:

function (n, size = n, replace = FALSE, prob = NULL, useHash = (!replace && 
    is.null(prob) && size <= n/2 && n > 1e+07)) 
{
    if (useHash) 
        .Internal(sample2(n, size))
    else .Internal(sample(n, size, replace, prob))
}
函数(n,size=n,replace=FALSE,prob=NULL,useHash=(!replace&&
为空(概率和尺寸1e+07))
{
if(useHash)
.内部(样本2(n,尺寸))
其他。内部(样品(n、尺寸、更换、prob))
}
.Internal
意味着任何采样都是通过调用用C编写的编译代码来完成的:在这种情况下,它是定义的函数
do\u sample

如果您查看此C代码,
do_sample
检查它是否已传递
prob
向量。如果不是,则在同等权重的假设下进行采样。如果存在
prob
,该函数将确保它是数字而不是NA。如果
prob
通过了这些检查,则会生成一个指向基础double数组的指针,并将其传递给random.c中另一个名为
FixUpProbs
的函数

此函数检查
prob
的每个成员,如果
prob
的任何元素不是正的有限双精度,则抛出错误。然后,它将每个数字除以所有数字的总和,使这些数字正常化。因此,对于代码中固有的
prob
求和为1,没有任何偏好。也就是说,即使输入中的
prob
和为1,函数仍将计算和并将每个数字除以它

因此,该参数的名称很差。正如其他人所指出的那样,它应该是“重量”。公平地说,文件只说,
prob
应该是权重向量,而不是绝对概率

因此,我读取代码时,
prob
参数的行为应该是:

  • prob
    可以完全不存在,在这种情况下,采样默认为等权重
  • 如果
    prob
    的任何数字小于零、无限或NA,函数将抛出
  • 如果任何
    prob
    值是非数字的,则应引发错误,因为在传递给C代码的SEXP中,这些值将被解释为
    NA
  • prob
    的长度必须与
    x
    或C代码相同
  • 如果指定了
    replace=T
    ,则可以将零概率作为
    prob
    的一个或多个元素传递,只要至少有一个非零概率
  • 如果指定
    replace=F
    ,则请求的样本数必须小于或等于
    prob
    中的非零元素数。基本上,
    FixUpProbs
    将抛出,如果您要求它以零概率采样
  • 有效的
    prob
    向量将标准化为总和为1,并用作采样权重

  • 作为这种行为的一个有趣的副作用,如果您通过设置probs=
    c(1,赔率)

    在两个备选方案之间进行选择,这允许您使用赔率而不是概率。它们被标准化为一是,从输出来看,这也是我的想法,但在文档中找不到。可能是使用了“概率权重”,而不仅仅是文档中的概率。权重向量似乎与概率无关。谢谢你提供了一个经过充分研究的答案。关于最后的总结,特别是第5点)<代码>样本(1:4,1,prob=c(0,2,3,4))
    似乎和
    表(复制(1e6,样本(1:4,1,prob=c(0,2,3,4)))一样有效。
    带有
    替换=FALSE
    。正如文档
    中提到的,它们不需要求和为一,但它们应该是非负的,而不是全部为零。因此,对于
    replace=FALSE
    ?好的点,一个(或多个但不是全部)值的概率为0是可以的