R言語で無作為抽出を行う関数とその使い方について解説します。
この記事では、関数sampleを用いた復元抽出、非復元抽出法を紹介します。
任意のデータについて無作為抽出を行う例について見ていきます。
この記事で扱うRスクリプトは以下からダウンロードできます。
無作為抽出
Rで無作為抽出を実行するには次の関数sampleを使います。
上で紹介した関数の引数は次の通りです。
x | ベクトル。このベクトルの要素について無作為抽出を行う。 |
n | 正の整数。1からnまでの要素について無作為抽出が行われる。 |
size | 抽出回数を表す非負の整数。 |
replace | logical型。復元抽出を行うかどうか。 |
prob | xの要素の抽出する確率を表すベクトル。 |
useHash | logical型。ハッシュによるアルゴリズムを用いるかどうか。replace = FALSE、prob = NULL、size <= n/2のときに適用できる。 |
引数replaceによって復元抽出と非復元抽出を選択することが可能です。
実行例
早速、関数sampleの使い方について見ていきます。
1から100までの整数から50個、非復元抽出するには次のように関数sampleを実行します。
1 2 3 4 | > numbers <- seq_len(100) > samples_notReplaced <- sample(numbers, 10) #非復元抽出 > samples_notReplaced [1] 71 6 81 45 43 80 47 33 60 39 |
size = 100で実行しても、次のように重複している要素がなく1から100までの要素について非復元抽出ができていることが確認できます。
1 2 3 | > sample(numbers, 100) [1] 59 6 21 12 14 41 34 92 61 73 35 63 1 5 2 99 27 39 25 96 87 33 84 69 20 38 86 62 51 55 9 74 18 94 68 8 48 82 83 53 70 28 43 4 7 29 85 77 95 65 [51] 57 13 3 54 10 17 91 11 45 47 30 90 24 19 40 32 26 44 66 16 76 15 22 80 71 75 98 60 46 72 89 37 31 79 88 97 67 81 23 93 36 49 58 56 52 64 78 50 100 42 |
また、引数replaceをTRUEにすることで復元抽出を行うことができます。
1 2 3 | > samples_replaced <- sample(numbers, 10, replace = TRUE) #復元抽出 > samples_replaced [1] 37 62 97 2 12 36 12 96 74 33 |
引数を変更し先ほどと同様の抽出を行うと、重複ありでnumbersの100個の要素を抽出することができます。
関数uniqueを使い抽出された重複しない要素を数えると、100ではないため復元抽出を実行できていることが分かります。
1 2 3 4 | [1] 29 8 45 93 98 100 45 90 91 17 53 92 1 88 55 98 75 8 92 22 11 46 72 64 43 93 95 77 4 74 63 66 53 48 67 65 90 33 84 33 75 100 28 36 9 3 13 7 13 11 [51] 88 58 6 18 17 91 31 73 57 13 30 53 83 18 4 90 90 17 91 37 72 91 27 79 44 95 61 82 72 12 99 12 52 38 22 62 57 45 69 61 98 26 87 72 46 96 97 47 100 39 > length(unique(sample(numbers, 100, replace = TRUE))) [1] 59 |
補足ですが、引数probでベクトルの各要素の生起確率を与えることができます。
無作為抽出のほかにも、各要素の発生する確率をあらかじめ指定することができます。
1 2 3 4 5 | > numbers <- seq_len(5) > prob <- c(0.3, 0.1, 0.1, 0.2, 0.3) > samples_replaced <- sample(numbers, 10, replace = TRUE, prob = prob) #生起確率の指定 > samples_replaced [1] 4 5 4 5 1 5 1 5 5 5 |
また、非負の整数の抽出は関数sample.intでも行うことができます。
次のように引数nに指定した値までの整数について、無作為抽出を行うことができます。
1 2 3 4 5 6 7 | > samples_notReplaced <- sample(10, 10) > samples_notReplaced [1] 9 7 1 6 5 4 3 10 8 2 > > samples_replaced <- sample(10, 10, replace = TRUE) > samples_replaced [1] 1 8 9 1 8 9 4 4 10 1 |
ここまで、numeric型の要素について無作為抽出を行ってきましたが、次のようにcharacter型の要素についても無作為抽出を行うこともできます。
1 2 3 4 5 6 7 8 | > alphabets <- letters[seq_len(26)] > samples_notReplaced <- sample(alphabets, 10) > samples_replaced <- sample(alphabets, 10, replace = TRUE) > samples_notReplaced [1] "p" "i" "n" "t" "s" "f" "o" "w" "y" "x" > > samples_replaced [1] "h" "q" "r" "y" "u" "j" "v" "f" "m" "v" |
型に関係なく無作為抽出を行うことができます。
1 2 3 4 5 6 7 8 | > logicals <- c(TRUE, FALSE) > samples_notReplaced <-sample(logicals, 2) > samples_replaced <-sample(logicals, 10, replace = TRUE) > samples_notReplaced [1] TRUE FALSE > > samples_replaced [1] FALSE TRUE FALSE FALSE TRUE FALSE TRUE TRUE FALSE TRUE |
まとめ
R言語で無作為抽出を行う関数と実行例を紹介しました。
関数sampleで無作為抽出を実行することができ、引数 によって復元抽出と非復元抽出を選択することができます。