隨機抽取和排列
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)。