R Language
ランダム化
サーチ…
前書き
統計的分析にはR言語が一般的に使用されます。したがって、ランダム化のための堅牢なオプションセットが含まれています。確率分布からのサンプリングに関する具体的な情報については、 配布関数のドキュメントを参照してください。
備考
他のプログラミング言語から来ているユーザーは、以前経験したことと同等のrand
関数がないために混乱することがあります。基本的な乱数生成を使用して行われるr*
各分布のための関数のファミリーを(上記のリンクを参照します)。ある範囲から一様に描画された乱数は、「無作為の均一」のためにrunif
を使用して生成できます。これは "実行する"のように疑わしいようにも見えるので、新しいRユーザーのために把握することはしばしば困難です。
ランダム描画と順列
sample
コマンドを使用して、置換の有無にかかわらず、壷からの描画やランダム置換の作成など、古典的な確率の問題をシミュレートすることができます。
この例では、 set.seed
を使用して、サンプルコードを確実に再現できるようにしています。ただし、 sample
はset.seed
を明示的に呼び出さなくても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
を使用すると、各要素を選択する確率は同じであるとみなされます。それを基本的な "urn"問題と考えてください。以下のコードは、壷から着色された大理石を20回描き、色を書き留めてから、大理石を壷の中に戻すのと同じです。壷には赤、青、緑の大理石がそれぞれ1つずつ入っています。つまり、各色を描く確率は1/3です。
set.seed(6472)
sample(x = c("Red","Blue","Green"),
size = 20,
replace = TRUE)
代わりに同じタスクを実行したいとしますが、私たちの壷には2つの赤い大理石、1つの青い大理石、1つの緑の大理石が含まれています。 1つのオプションは、 x
に送信する引数を変更して、追加のRed
を追加することです。ただし、より良い選択肢は、 sample
prob
引数を使用することです。
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 Red、1 Blue、1 Greenを考えてみましょう。これらの数値を使って、前のコードと同じ結果を得ることができます:
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
設定されているFALSE
prob
利用することもできFALSE
。その状況では、各要素が描かれた後、残りの要素の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%)です。このドローでは、アイテムが青(19/20)になる確率は95%、緑(1/20)になる確率は5%です。
種を設定する
set.seed
関数は、すべてのランダム化関数のランダムシードを設定するために使用されます。 Rを使用して再現できるランダム化を作成する場合は、最初にset.seed
を使用する必要があります。
set.seed(1643)
samp1 <- sample(x = 1:5,size = 200,replace = TRUE)
set.seed(1643)
samp2 <- sample(x = 1:5,size = 200,replace = TRUE)
> identical(x = samp1,y = samp2)
[1] TRUE
並列処理にはランダムシードの特別な処理が必要であることに注意してください。