隨機抽取和排列

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)。