R言語でシード値が同じでも乱数が異なるときの対処法を紹介します。
R言語で乱数を固定したいときに以下のように乱数が同じにならないことがよくあると思います。
こんな方におすすめ
- ダブルチェックの際に乱数が異なり同じ結果が出ない。
- RのバージョンやOSも全て同じなのに他の人と違う乱数が発生する。
この記事では、乱数が異なるときのよくある原因とその対処法について見ていきます。
乱数を使った具体例付きで分かりやすく解説していきます。
この記事で扱うRスクリプトは以下からダウンロードできます。
R言語 シード値が同じでも乱数が異なるときの対処法
Rのバージョンが異なるのが原因
シード値が同じでも乱数が異なる原因としてRのバージョンがあります。
Rのバージョンが3.6を境にsample.kindが次のように変更されています。
- R ≧ 3.6 smaple.kind: "Rejection"
- R < 3.6 sample.kind: "Rounding"
バージョンが3.6以上のときと3.6未満のときに、シード値を0に固定し関数sampleで乱数を発生させた結果は次の通りです。
R version ≧ 3.6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | > version _ platform x86_64-w64-mingw32 arch x86_64 os mingw32 system x86_64, mingw32 status major 4 minor 0.3 year 2020 month 10 day 10 svn rev 79318 language R version.string R version 4.0.3 (2020-10-10) nickname Bunny-Wunnies Freak Out > > RNGkind() [1] "Mersenne-Twister" "Inversion" "Rejection" > > set.seed(0) > > sample(seq_len(100), 100) [1] 14 68 39 1 34 87 43 100 82 59 51 85 21 54 74 7 73 79 37 92 96 44 33 35 70 [26] 86 42 38 20 28 72 83 40 69 25 98 90 75 6 24 32 93 2 45 18 22 91 84 97 64 [51] 99 62 23 67 49 50 65 11 17 36 13 66 47 48 76 29 57 55 77 71 12 16 52 80 88 [76] 46 63 9 89 19 56 60 94 10 26 15 78 30 3 58 61 31 27 8 41 53 81 5 95 4 |
R version < 3.6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | > version _ platform x86_64-w64-mingw32 arch x86_64 os mingw32 system x86_64, mingw32 status major 3 minor 5.0 year 2018 month 04 day 23 svn rev 74626 language R version.string R version 3.5.0 (2018-04-23) nickname Joy in Playing > > RNGkind() [1] "Mersenne-Twister" "Inversion" 警告メッセージ: RNGkind() で: '.Random.seed[1]' が有効な整数値ではないため、無視されました > > set.seed(0) > > sample(seq_len(100), 100) [1] 90 27 37 56 88 20 85 96 61 58 6 19 16 60 34 66 42 87 82 31 63 74 17 51 10 [26] 21 29 1 28 62 24 86 41 69 13 54 43 77 7 45 25 49 38 92 81 30 64 2 83 91 [51] 35 70 84 75 12 4 5 14 22 72 78 36 46 40 80 23 9 93 52 3 99 76 59 79 67 [76] 39 48 95 26 98 50 68 94 71 100 32 97 55 53 65 15 11 73 44 33 57 47 18 8 89 |
3.6以上のバージョンで3.6未満のときと同じ乱数を得たいときは、次のように関数RNGkindでsample.kind="Rejection"とします。
1 2 3 4 5 6 7 8 9 | RNGkind(sample.kind = "Rejection") set.seed(0) sample1 <- sample(seq_len(100), 100) RNGkind(sample.kind = "Rounding") set.seed(0) sample2 <- sample(seq_len(100), 100) RNGkind(sample.kind = "Rejection") #3.6以上のデフォルトの設定 |
設定を変えたことで3.6未満のときと同じ乱数が発生しているのが分かります。
1 2 3 4 5 6 7 8 9 10 11 | > sample1 [1] 14 68 39 1 34 87 43 100 82 59 51 85 21 54 74 7 73 79 37 92 96 44 33 35 70 [26] 86 42 38 20 28 72 83 40 69 25 98 90 75 6 24 32 93 2 45 18 22 91 84 97 64 [51] 99 62 23 67 49 50 65 11 17 36 13 66 47 48 76 29 57 55 77 71 12 16 52 80 88 [76] 46 63 9 89 19 56 60 94 10 26 15 78 30 3 58 61 31 27 8 41 53 81 5 95 4 > > sample2 [1] 90 27 37 56 88 20 85 96 61 58 6 19 16 60 34 66 42 87 82 31 63 74 17 51 10 [26] 21 29 1 28 62 24 86 41 69 13 54 43 77 7 45 25 49 38 92 81 30 64 2 83 91 [51] 35 70 84 75 12 4 5 14 22 72 78 36 46 40 80 23 9 93 52 3 99 76 59 79 67 [76] 39 48 95 26 98 50 68 94 71 100 32 97 55 53 65 15 11 73 44 33 57 47 18 8 89 |
桁数の設定が原因
次に桁数が原因のときの対処法を解説します。シード値に小数を用いた時に起こる現象について見ていきます。
ここから先は小数を用いたときの実行例を紹介しますが、関数set.seedのRDocumentationに書いてあるように、set.seedのシード値の引数seedには整数を渡すように書いてあるので、小数ではなく整数を用いたほうがよいです。
これは桁数の多い、特に小数点以下の桁数が多いシード値を扱っているときによく起こります。
Rではoptionsで桁数digitsがありますがデフォルトだとこの値が7であるため、7桁以上のシード値を扱う場合、結果が異なってしまいます。
例えば、他の人のRの桁数の設定がdigitsが8以上で自分のdigitsが7のときに、シード値1234.5678の乱数を発生させると、たとえシード値が同じでも自分と他の人で結果が異なってしまいます。
例を次に示します。
シード値1234.56789を、optionsでdigitsを9に設定したときとそうでないときの結果は次の通りです。
1 2 3 4 5 6 7 8 9 10 | set.seed(0) set.seed(1234.56789) sample1 <- sample(seq_len(100), 100) options(digits = 9) set.seed(0) sample2 <- sample(seq_len(100), 100) set.seed(1234.56789) options(digits = 7) #デフォルトの桁数 |
digitsの設定で結果が異なるのが確認できます。
1 2 3 4 5 6 7 8 9 10 11 | > sample1 [1] 28 80 22 9 5 38 16 4 86 90 70 79 78 14 56 62 93 84 21 40 92 67 96 66 47 [26] 81 48 3 41 32 42 43 2 54 49 99 51 6 77 29 71 85 57 8 26 17 58 91 60 76 [51] 98 35 72 94 73 50 10 45 25 46 19 65 23 63 20 7 52 37 31 88 27 12 89 64 1 [76] 83 95 75 97 36 55 33 24 13 39 68 87 18 44 15 34 53 74 11 69 61 59 82 100 30 > > sample2 [1] 14 68 39 1 34 87 43 100 82 59 51 85 21 54 74 7 73 79 37 92 96 44 33 35 70 [26] 86 42 38 20 28 72 83 40 69 25 98 90 75 6 24 32 93 2 45 18 22 91 84 97 64 [51] 99 62 23 67 49 50 65 11 17 36 13 66 47 48 76 29 57 55 77 71 12 16 52 80 88 [76] 46 63 9 89 19 56 60 94 10 26 15 78 30 3 58 61 31 27 8 41 53 81 5 95 4 |
まとめ
乱数が異なる原因として主にRのバージョンの違いとRのオプションの桁数の設定の違いがあります。
他の人とと解析をしていてシード値が同じでも乱数が異なるときは、Rのバージョンとoptionsのdigitsの値が一致しているか確かめてみましょう!