随机抽取和排列

sample 命令可用于模拟经典概率问题,例如在有和没有替换的情况下从 urn 绘图,或创建随机排列。

请注意,在整个示例中,set.seed 用于确保示例代码是可重现的。然而,sample 将在没有明确调用 set.seed 的情况下工作。

随机排列

在最简单的形式中,sample 创建了一个整数向量的随机排列。这可以通过以下方式实现:

set.seed(1251)
sample(x = 10)

[1]  7  1  4  8  6  3 10  5  2  9

当没有给出其他参数时,sample 返回从 1 到 x 的向量的随机排列。在尝试随机化数据框中行的顺序时,这可能很有用。在为试验创建随机化表或选择行的随机子集进行分析时,这是一项常见任务。

library(datasets)
set.seed(1171)
iris_rand <- iris[sample(x = 1:nrow(iris)),]

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

> head(iris_rand)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
145          6.7         3.3          5.7         2.5  virginica
5            5.0         3.6          1.4         0.2     setosa
85           5.4         3.0          4.5         1.5 versicolor
137          6.3         3.4          5.6         2.4  virginica
128          6.1         3.0          4.9         1.8  virginica
105          6.5         3.0          5.8         2.2  virginica

无需替换即可绘制

使用 sample,我们还可以使用和不使用替换来模拟绘图。要进行无替换的采样(默认设置),必须为样本提供要绘制的集合和绘制数量。要绘制的集合作为向量给出。

set.seed(7043)
sample(x = LETTERS,size = 7)

[1] "S" "P" "J" "F" "Z" "G" "R"

请注意,如果 size 的参数与 x 的参数长度相同,则表示你正在创建随机排列。另请注意,在不进行更换的情况下进行采样时,不能指定大于 x 长度的尺寸。

set.seed(7305)
sample(x = letters,size = 26)

[1] "x" "z" "y" "i" "k" "f" "d" "s" "g" "v" "j" "o" "e" "c" "m" "n" "h" "u" "a" "b" "l" "r" "w" "t" "q" "p"

sample(x = letters,size = 30)
Error in sample.int(length(x), size, replace, prob) : 
  cannot take a sample larger than the population when 'replace = FALSE'

这使我们得到了更换。

绘画与替换

要从具有替换的集合中进行随机绘制,可以使用 replace 参数到 sample。默认情况下,replaceFALSE。将其设置为 TRUE 意味着从中抽取的集合中的每个元素在最终结果中可能出现多次。

set.seed(5062)
sample(x = c("A","B","C","D"),size = 8,replace = TRUE)

[1] "D" "C" "D" "B" "A" "A" "A" "A"

改变绘制概率

默认情况下,当你使用 sample 时,它假定拾取每个元素的概率相同。将其视为一个基本的问题。下面的代码相当于从骨灰盒中抽出 20 次彩色大理石,写下颜色,然后将大理石放回骨灰盒中。骨灰盒包含一个红色,一个蓝色和一个绿色大理石,这意味着每种颜色的绘制概率为 1/3。

set.seed(6472)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE)

假设我们想要执行相同的任务,但我们的骨灰盒包含 2 个红色大理石,1 个蓝色大理石和 1 个绿色大理石。一种选择是更改我们发送给 x 的参数以添加额外的 Red。但是,更好的选择是将 prob 参数用于 sample

prob 参数接受具有绘制每个元素的概率的向量。在上面的例子中,绘制红色大理石的概率为 1/2,而绘制蓝色或绿色大理石的概率为 1/4。

set.seed(28432)
sample(x = c("Red","Blue","Green"),
       size = 20,
       replace = TRUE,
       prob = c(0.50,0.25,0.25))

反直觉地,给予 prob 的论证不需要求和 1.R 将总是将给定的参数转换为总计为 1 的概率。例如,考虑上面的 2 个红色,1 个蓝色和 1 个绿色的例子。你可以使用这些数字获得与我们之前代码相同的结果:

set.seed(28432)
frac_prob_example <- sample(x = c("Red","Blue","Green"),
                            size = 200,
                            replace = TRUE,
                            prob = c(0.50,0.25,0.25))

set.seed(28432)
numeric_prob_example <- sample(x = c("Red","Blue","Green"),
                               size = 200,
                               replace = TRUE,
                               prob = c(2,1,1))

> identical(frac_prob_example,numeric_prob_example)
[1] TRUE

主要限制是你不能将所有概率设置为零,并且它们都不能小于零。

replace 设置为 FALSE 时,你也可以使用 prob。在这种情况下,在绘制每个元素之后,剩余元素的 prob 值的比例给出下一次绘制的概率。在这种情况下,你必须具有足够的非零概率才能到达你正在绘制的样本的 size。例如:

set.seed(21741)
sample(x = c("Red","Blue","Green"),
       size = 2,
       replace = FALSE,
       prob = c(0.8,0.19,0.01))

在此示例中,在第一次绘制中绘制红色(作为第一个元素)。红色被吸引的可能性为 80%,蓝色被吸引的可能性为 19%,绿色被吸引的可能性为 1%。

在接下来的抽奖中,红色不再在瓮中。其余项目的总概率为 20%(蓝色为 19%,绿色为 1%)。对于该抽奖,该项目有 95%的可能性为蓝色(19/20),5%的可能性为绿色(1/20)。