はじめに
統計解析の際には、乱数 (random number) が必要になることが多い。例えば、無作為抽出をしたり、モンテカルロ法を実行したりするときには、乱数が必要になる。しかし、計算機を使って分析する際に真の乱数を作り出すことは容易でないことから、何らかのアルゴリズムによって擬似乱数 (pseudo-random number) を作り出すことが必要になる。
2017年2月現在、主要な統計解析ソフトでは、Matsumoto and Nishimura (1998) が提唱したメルセンヌ・ツイスター (Mersenne twister) というアルゴリズムで擬似乱数を生成できるようになっている。このアルゴリズムは、すこぶる優秀なので、特に理由がなければこれを使うのが良いだろう。
SAS
Wicklin (2013) によれば、SAS には、擬似乱数生成のための関数として、(1) RANUNI, RANNOR などの RANXXX という名前の関数群と、(2) RAND 関数がある。前者が古くからあるもので、後者はメルセンヌ・ツイスターに基づく新しいものである。昔の SAS で作ったものを再現したいといった互換上の理由などがなければ、後者を使うべきであろう。
なお、SAS Institute (2016, p.908) によれば、RANUNI は、Fishman and Moore (1981) に基づく乗法合同法で擬似乱数を生成している。
SPSS
IBM (2016, p.1041) によれば、SPSS には、2通りの擬似乱数生成アルゴリズムが用意されている。すなわち、(1) Fishman and Moore (1981) に基づく乗法合同法と、(2) に基づくメルセンヌ・ツイスターである。
SPSS 12 までは前者しか使えなかった。後者が導入されたのは、SPSS 13 以降である。なお、前者は SPSS 13 以降も、互換性のために残されている。メルセンヌ・ツイスターの方が優秀なので、SPSS 12 以前に作ったものを使いたいといった理由がなければ、メルセンヌ・ツイスターを使うのが良いだろう。
Stata
StataCorp (2015, pp. 73–76) によれば、Stata には、2通りの擬似乱数生成アルゴリズムが用意されている。すなわち、(1) フロリダ州立大学の George Marsaglia が1994年に用意した KISS32 というアルゴリズムと、(2) メルセンヌ・ツイスターである。
メルセンヌ・ツイスターは、STATA 14 で初めて導入された (Gopal, 2016)。KISS32 はそれ以前から搭載されているもので、STATA 14 でも互換性のために残されている。メルセンヌ・ツイスターの方が優秀なので、STATA 13 以前に作ったものを使いたいといった理由がなければ、メルセンヌ・ツイスターを使うのが良いだろう。
R
R Core Team (2016) によれば、R はメルセンヌ・ツイスターをデフォルトの擬似乱数生成アルゴリズムとしている。ただし、他の擬似乱数生成アルゴリズムも搭載されているので、その中から選んで使うこともできる。
補:Excel
Excel の擬似乱数生成は昔はあまりよろしくなかったらしい。McCullough (2008) によれば、Microsoft は Excel 2003 と Excel 2007 において Wichmann and Hill (1982) のアルゴリズムによる擬似乱数生成を実装しようとして、うまく実装できなかったそうだ。
Mélard (2014) によれば、その後の Excel 2010 では、RAND() 関数による擬似乱数生成が改善したそうである。ただし、Excel VBA の中で使われている擬似乱数生成アルゴリズムは改善されていないそうである。
ちなみに、NtRand というメルセンヌ・ツイスターによる乱数生成を可能とする Excel アドインがあるそうである。
参考文献
- Fishman, G. S., & Moore, L. R. (1981). In search of correlation in multiplicative congruential generators with modulus 231 -1. In W. F. Eddy (Ed.), Computer Science and Statistics: Proceedings of the 13th Symposium on the Interface (pp. 155–157). New York: Springer-Verlag. doi: 10.1007/978-1-4613-9464-8_22
- Gopal, K. (2016, March 10). How to generate random numbers in Stata [Web log post]. Retrieved from http://blog.stata.com/2016/03/10/how-to-generate-random-numbers-in-stata/
- IBM. (2016). IBM SPSS Statistics 24 Algorithms. Retrieved from ftp://public.dhe.ibm.com/software/analytics/spss/documentation/statistics/24.0/en/client/Manuals/IBM_SPSS_Statistics_Algorithms.pdf
- Matsumoto, M., & Nishimura, T. (1998). Mersenne Twister, A 623–dimensionally equidistributed uniform pseudorandom number generator. ACM Transactions on Modeling and Computer Simulation, 8(1), 3–30. doi: 10.1145/272991.272995
- Mélard, G. (2014). On the accuracy of statistical procedures in Microsoft Excel 2010. Computational Statistics, 29(5), 1095–1128. doi: 10.1007/s00180-014-0482-5
- McCullough, B. D. (2008). Microsoft Excel’s ‘Not The Wichmann–Hill’ random number generators. Computational Statistics and Data Analysis, 52, 4587–4593. doi: 10.1016/j.csda.2008.03.006
- R Core Team. (2016). R: Random Number Generation [Documentation for R 3.3.2].
- SAS Institute. (2016). SAS® 9.4 Functions and CALL Routines: Reference, Fifth Edition. Cary, NC: SAS Institute. Retrieved from http://support.sas.com/documentation/cdl/en/lefunctionsref/69762/PDF/default/lefunctionsref.pdf
- StataCorp. (2015). STATA Funcitions Reference Manual: Release 14. College Station, TX: Stata Press.
- Wichmann, B. & Hill, D. (1982). Algorithm AS 183: An Efficient and Portable Pseudo-Random Number Generator. Journal of the Royal Statistical Society: Series C (Applied Statistics), 31(2), 188–190. doi: 10.2307/2347988
- Wicklin, R. (2013, July 10). Six reasons you should stop using the RANUNI function to generate random numbers [Web log post]. Retrieved from http://blogs.sas.com/content/iml/2013/07/10/stop-using-ranuni.html