随机抽取和排列
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
。默认情况下,replace
是 FALSE
。将其设置为 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)。