# シミュレーションに使える関数を説明します。
# まずは関数sampel()です。 ?sample で使い方をチェックしてください。
?sample
# いつものように英語ですね。ちょっと読む気がしない? しかし、少しは見てみましょう。

# サイコロの目についてシミュレーションしてみます。
# サイコロを4回振った場合が..
sample(1:6, 4, replace = TRUE)
## [1] 4 1 4 2
# 引数replace = TRUEは、同じ数の繰り返しを許す場合はTRUEになります。
# サイコロは当然、同じ数字が出る可能性があるので、TRUEを設定しました。

# 引数replace を指定しないときは、デフォルト値としてreplace = FALSE、つまり同じ値を繰り返さない、を指定したことになります。
sample(1:20, 10)
##  [1]  2  4 11 17 19  7 20 15  3  9
# 1から20までの整数のうち、10個の整数をサンプリングした結果が表示されました。

LETTERS  #大文字のアルファベット
##  [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q"
## [18] "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
letters  #小文字のアルファベット
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q"
## [18] "r" "s" "t" "u" "v" "w" "x" "y" "z"
# LETTERS を使ってサンプリングします。
sample(LETTERS)
##  [1] "R" "A" "X" "E" "L" "P" "W" "V" "G" "D" "F" "Y" "N" "U" "B" "O" "I"
## [18] "S" "H" "J" "Q" "M" "Z" "T" "C" "K"
# 次のシミュレーションです。
# コインを投げたときに裏表の出る確率が半々ではなく、0.3と0.7のいかさまコインを考えてみます。
# このコインを100回投げたときのシミュレーションです。
# その結果を、変数flipsに代入します。
flips <- sample(c(0,1), 100, replace = TRUE, prob = c(0.3, 0.7))
# このシミュレーションでは、上記の同じコードを実行しても、結果は変わってきます。
# それがシミュレーションです。しかし、同じ結果を再現したいときもあります。
# そのときに使う関数が、set.seed()です。
# 具体的には、()内に数値を設定します。具体例は、set.seed(10)、set.seed(2)のように。
# この関数をsample()を実行する前に実行します。

# 裏表の確率は、4つ目の引数 prob を c(0.3, 0.7)と指定しています(prob = c(0.3, 0.7))。
# flipsを表示します。
flips
##   [1] 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1 1 1 0 0 1 1 0 1
##  [36] 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 0 1 0 0 0 1 1 1 1 0 1 0 1 1 0 1 1 1 1 1
##  [71] 1 1 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 0 1 1 0 1 0 1 1 1 0 0 1 1
# 実際、このシミュレーションでは表(1)の数がいくつになりますか。
# さあ、どの関数を使えば確認できますか。考えてください。

# 次に、関数rbinom()を説明します。
# Rにおける確率分布は、r***関数(ランダム ramdom)、d***関数(密度 density)、p***関数(確率 probability)、q***関数(4分位 quantile)などがありますが、ここではr***関数のみを説明します。

# 関数rbinom()を使ってみます。
rbinom(1, size = 100, prob = 0.7)
## [1] 58
# これは表が出る確率が0.7 のインチキコインを100回振った場合の、表の数を求めています。
# 100の大きさを1つの単位として、それを1回だけシミュレーションしています。

# 次に、それと同じコインを100回振った場合の各々について、表は1、裏は0とし、その結果を変数flipsに代入しています。
# これは1回と1つの単位として、それを100回シミュレーションしています。
flips2 <- rbinom(100, size = 1, prob = 0.7)

# flips2の表の数を数えます。
sum(flips2)
## [1] 70
# 次の関数の説明に移ります。
?rnorm
# usage: rnorm(n, mean = 0, sd = 1)

# 関数rnorm()は、引数を指定しない場合、標準正規分布(平均0、標準偏差1)の数値を生成します。
rnorm(10)
##  [1]  0.4846600 -0.1937766  0.7698791 -0.4465303  0.4117201  1.4139706
##  [7] -0.1691271  1.0722778 -0.8466025  0.5594808
#rnorm(10)は10個の標準正規分布(平均0、標準偏差1)に従う乱数を生成しました。

# 平均を100、標準偏差を25とする乱数を10個生成します。
rnorm(10, 100, 25)
##  [1]  81.98693 123.54006  83.66111  84.17968  91.62236  82.97613  93.60896
##  [8]  84.28467  68.24840 118.41983
# 次の説明に移ります。
# 平均値を10とするポアソン分布に従う5つの値からなるグループを、100グループ生成したい。
# まず、平均値を10とするポアソン分布に従う5つの値を生成します。
rpois(5, 10)
## [1] 16  6 15 12  7
# 次に、これを100個生成し、変数my_pois に代入します。
my_pois <- replicate(100, rpois(5, 10))

# my_poisの内容を見てみましょう。
my_pois
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13]
## [1,]   14    9    7    9   13    9    9    3    9     8    10     6     5
## [2,]    6   13    8    7   10   15   12   22    8    12     8    17     9
## [3,]    5    6    9    7    7    8   17    7   12     8     9    10     8
## [4,]   12   14   11   13   13    8   11   15   10    13     8     6     9
## [5,]   18   10    5   13   14   17   10   13    6    20     8    11     5
##      [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24]
## [1,]    10    12    14    16    12    14    14     9     6    13    10
## [2,]    16    13    10     8     6    17    13    11     7     7    11
## [3,]     9     5     8     9    17    10    10    11     9     7    12
## [4,]     8    13     9    12     9     5    12    13    10    14     7
## [5,]    13     5     5    15    16     4     8     4    10    10    12
##      [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35]
## [1,]    12     6    10     8    11    13    10     8     5    17     6
## [2,]     8    10    10    14    10    13    12    13    11     9    13
## [3,]     8    11     9    15     5    13     3     8    10    12    14
## [4,]     7    15     9     8    10    11    10    12    10    14    17
## [5,]     9    10    10    11    11     6     7     8    10     9     7
##      [,36] [,37] [,38] [,39] [,40] [,41] [,42] [,43] [,44] [,45] [,46]
## [1,]     5    10    13     9     9    13     4     4     8     8    16
## [2,]     6    10    14    13    11     6     4     9     8     8     4
## [3,]     8     7    10     8     8     9    12    11    10    14    13
## [4,]     9     9    12     7    16     5     5     9     7    14    10
## [5,]     9    13     9    13    10    11    11    12    10     8    12
##      [,47] [,48] [,49] [,50] [,51] [,52] [,53] [,54] [,55] [,56] [,57]
## [1,]     9    12    12     7    14    10     7    10    11     8     9
## [2,]    11    12    14     7    10    12    13     9    15    19     8
## [3,]    10     6     7     7    13     6     7     6     9     9     6
## [4,]    13     8    12    11     7     8     5     7    16    11     6
## [5,]    13    12     9     7    15     4     9    14     7     9    10
##      [,58] [,59] [,60] [,61] [,62] [,63] [,64] [,65] [,66] [,67] [,68]
## [1,]    10     9    16    12     8     8    12     9     6    11    11
## [2,]     8     7    14    12     5    14     6     8     5     9     8
## [3,]    14     4     6     5    12    12     7    10    19    11     6
## [4,]    12    16    11    18    12    10    10     7    10    12    14
## [5,]    11     9     4     5     7     6    14     7     8     6    12
##      [,69] [,70] [,71] [,72] [,73] [,74] [,75] [,76] [,77] [,78] [,79]
## [1,]     4     8     7    11    10     9    11     7    10     8    11
## [2,]    11    11     7    14    13     8    11    10     8    10    11
## [3,]    11    10    14     9    12     7    12     6    10    10    12
## [4,]    12     7    11    11    11     8     7    16    15    15     8
## [5,]    10     7    13    11     4    16     7     9     9    11    16
##      [,80] [,81] [,82] [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90]
## [1,]    12     7     4    13    10    10    11    13     7    10     6
## [2,]     7    14     9    11    12    15    11    15     7     9     9
## [3,]    12    10    10     7     7    17     9     9    14     6     7
## [4,]    15     9     7     9    15     4    11     5     9    11    11
## [5,]     7    11     5     5    11     7     9    10    12    11    10
##      [,91] [,92] [,93] [,94] [,95] [,96] [,97] [,98] [,99] [,100]
## [1,]     9    13     8    13     6     6    10    12     8     11
## [2,]    11    16    12     8    16    12     4     9    14     15
## [3,]     9    11    12     9     8     8    13     8    15     11
## [4,]    15    13     7     7    10    10    10    14     9      8
## [5,]     9    10     8     7    13     9     7     6    11     15
# 関数replicate()はマトリックスを生成します。
# この場合は、平均値10のポアソン分布に従う5つの乱数から構成される列を100生成しました。

# 関数colMeans()を使って各々の列の平均値を求め、変数cmに代入します。
cm <- colMeans(my_pois)

# cmのヒストグラムを描き、列の平均値の分布を確認してみましょう。
hist(cm)

# ほぼ標準的な分布になっています。これが中央極限定理です。

# R にはこの他にも、指数関数rexp()、カイ二乗関数rchisq(), ガンマ関数 rgamma()などいろいろ揃っています。