gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:57:24 31 4
gpt4 key购买 nike

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

例如,

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 呢?它会给出什么输出?我认为这会导致错误,但它提供了一些值(value)。

当概率总和大于 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但结果也不是随机的。在这种情况下,数字是如何分布的?它在哪里记录?

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

The optional prob argument can be used to give a vector of weights for obtaining the elements of the vector being sampled. They need not sum to one, but they should be non-negative and not all zero. If replace is true, Walker's alias method (Ripley, 1987) is used when there are more than 200 reasonably probable values: this gives results incompatible with those from R < 2.2.0.



所以它说 prob参数不需要总和为 1,但不说明当它总和不为 1 时的预期结果?我不确定我是否遗漏了文档的任何部分。有人有任何想法吗?

最佳答案

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

如果您查看 R 代码,sample总是调用另一个 R 函数,sample.int如果您传入单个号码 xsample ,它将使用 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))
}
.Internal意味着任何采样都是通过调用用 C 编写的编译代码完成的:在这种情况下,它是函数 do_sample , 定义 here in src/main/random.c .

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

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

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

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

  • 作为这种行为的一个有趣的副作用,如果您通过设置 probs = c(1, odds) 在 2 个备选方案之间进行选择,则这允许您使用赔率而不是概率。

    关于r - 当样本中的 prob 参数总和小于/大于 1 时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59918865/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com