R Cheat Sheet (13): Simulation

使用像R一样的统计编程语言的好处之一,是其具备大量生成随机数的工具。

1. 随机采样

使用sample() 函数可以生成随机数,下面的例子模拟了投掷一个六面骰子四次的结果,连续执行可以得到不同的结果:

> sample(1:6, 4, replace = TRUE)
[1] 3 6 3 1
> sample(1:6, 4, replace = TRUE)
[1] 3 2 3 4

其中第一个参数1:6 为采样的范围,第二个参数4 为采样次数,第三个参数replace = TRUE 表示同样的数字在出现一次之后,还可以继续出现,留空则不允许同一数字出现多次:

> sample(1:20, 10)
 [1]  8  7 20 13  4 14  5 17 11 10

当不指明采样次数时,默认使用采样次数与数据长度相等,

> LETTERS
 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"
> sample(LETTERS)
 [1] "F" "Z" "R" "D" "H" "M" "W" "L" "J" "C" "N" "U" "Q" "K" "I" "P" "G" "Y" "O" "E" "T" "A" "B" "X" "S" "V"

LETTERS 为R中预定义的变量,其中包含了26个英文字母。

现在假设我们要仿真投掷100次硬币的结果,硬币是不公平的,有0.3的概率投掷出反面,0.7的概率投掷出正面。此时要为sample() 函数加上prob 参数指明概率:

> flips <- sample(c(0, 1), 100, replace=TRUE, prob=c(0.3, 0.7))
> flips
  [1] 1 1 1 1 0 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 1 0 0 0 1 0 1 1 0 1 1 1 1 0 0 1 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 1 0 0 0 0 1 0 0
 [61] 1 1 1 0 0 1 0 1 0 1 1 0 1 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 1 0 1 1 1 1 1 1 1 0 1 0
> sum(flips)
[1] 62

实际仿真的结果中有62次掷出正面。

2. 随机分布

2.1. 二项式分布

上面所示的投掷硬币实验的输出是二进制的(0或1),可以使用rbinom() 函数来仿真二项随机变量(binomial random variable)。R中的每一种概率分布都有一个对应的r*** 函数(r代表random),一个d函数(d代表density),一个p函数(p代表probability),和一个q***函数(q代表for quantile)。这里使用rbinom() 的函数名中,r代表随机,binom代表二项分布,其签名为:

rbinom(n, size, prob)

下面再次仿真投掷100次硬币的结果,硬币是不公平的,有0.3的概率投掷出反面,0.7的概率投掷出正面:

> rbinom(1, size=100, prob=0.7)
[1] 74

这里直接得到仿真结果,投掷出74次正面。

下面请求100次观测,每次观测包含1次实验,得到每次实验的结果:

> flips2 <- rbinom(n=100, size=1, prob=0.7)
> flips2
  [1] 1 1 1 1 1 0 1 1 0 1 0 0 1 0 1 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1 0 0 1 0 1 1 1 1 0 1 1 0 1 1 1 1 1 1 1
 [61] 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0 1 1 1 1
> sum(flips2)
[1] 80

2.2. 正态分布

函数rnorm() 中的norm代表正态分布,其签名为:

rnorm(n, mean = 0, sd = 1)

下面生成10个均值为0,标准差为1的随机数:

> rnorm(10)
 [1] -0.3103136 -0.6610793 -1.1848685 -1.4658500  0.7673424  0.1602987 -0.8568694  1.3657184 -0.6502526 -0.9302382

下面生成10个均值为100,标准差为25的随机数:

> rnorm(10, 100, 25)
 [1]  92.38162 115.10283  90.42909 112.25354 126.44536  88.07762 107.79431  63.36577  92.94852 129.13348

2.3. 泊松分布

函数rpois() 中的pois代表泊松分布,其签名为:

rpois(n, lambda)

用例如:

> rpois(5, 10)
[1] 11 11 10 13  9

除上面介绍到的分布之外,R中还提供了很多其他的分布,使用方法可以直接查阅文档。

2.4. 生成随机矩阵

使用replicate() 函数可以通过重复操作来生成矩阵,下面生成一个随机数矩阵:

> my_pois <- replicate(15, rpois(5, 10))
> my_pois
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15]
[1,]   11   13   14    7    8   15    8   13    8     9    13     6     9     9     9
[2,]   16    9    5    5    5   13   10   11   11    11    11     9     8     6     8
[3,]    8    8    7    6    3   14   10   10   14    13    10     6    10     8    12
[4,]   15   11    7   11   11   10    8   10   16     7    14    15    11     7     5
[5,]   13   10   10    6   12    9   11   13    8     8    13    14    13    11     9