R语言初级教程(17): 随机数、随机抽样

《R语言初级教程(17): 随机数、随机抽样》

在很多统计分析中,随机化是一个非常重要的环节。对于从各种概率分布(离散和连续分布)产生随机数的方法将在《R统计学》专题详细介绍。这篇博客只是简要地介绍R中的随机化,主要介绍两个非常重要的函数:set.seed()sample()函数。

1. set.seed()函数

在调试(debugging)程序时,如果能够保证前后两次的随机数一致,常常对程序的调试有很大帮助。另外,在做展示的时候,结果的可重复性也是很重要。 在R中,我们可以用set.seed()函数来实现这个功能。

set.seed()函数用于设定随机数种子,一个特定的种子可以产生一个特定的伪随机序列。这个函数的主要作用是确保结果具有重复性,如果不设定种子,生成的随机数将无法重现。来看个例子:

> rnorm(6)    ##随机生成6个随机数 
[1]  0.4609162 -1.2650612 -0.6868529 -0.4456620  1.2240818  0.3598138
> rnorm(6)    ##再次随机生成6个随机数 
[1]  0.4007715  0.1106827 -0.5558411  1.7869131  0.4978505 -1.9666172

## 上面两个随机数序列不一样

> set.seed(123)  ##设定种子
> x <- rnorm(6)    ##在设定种子的前提下生成6个随机数
> x
[1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774  1.71506499

> set.seed(123)
> y <- rnorm(6)
> y
[1] -0.56047565 -0.23017749  1.55870831  0.07050839  0.12928774  1.71506499

> x==y   ##随机序列x和y完全一致
[1] TRUE TRUE TRUE TRUE TRUE TRUE

set.seed()中的参数可以简单地理解为只是一个编号而已,编号设定基本可以随意,只要是整数就行。 再看个例子:

> set.seed(12)  ##种子为12
> rnorm(4)
[1] -1.4805676  1.5771695 -0.9567445 -0.9200052
 
> set.seed(-1234)  ##种子为-1234
> rnorm(4)
[1] 0.20715373 0.02735234 0.33828588 1.22691730

> set.seed(12)  ##种子为12
> rnorm(4)
[1] -1.4805676  1.5771695 -0.9567445 -0.9200052

种子相同时产生的随机数序列一致,种子不同时产生的随机数序列不同

2. sample()函数

在统计分析中经常会提到一个词:随机抽样,它是从整体样品中随机挑出部分样本数据。随机抽样又分为重复抽样(有放回抽样)和不重复抽样(无放回抽样)两种情况。重复抽样是指:本次从整体中抽取出的样本,在下一次抽取时同样有机会被抽取;不重复抽样是指:一旦被抽取为样本,下次就不能再被抽取了。

在R中,可以使用sample()函数来完成随机抽样任务,函数的原型为sample(x, size, replace = FALSE, prob = NULL),各参数的意义为:

  • x:整体数据,以向量形式给出

  • size:抽取样本的数目,默认为x的长度

  • replace:是否重复抽样,如果为FALSE(默认)表示不重复抽样,此时size不能大于x的长度;如果为TRUE,则是重复抽样,此时size允许大于x的长度

  • probx中各元素被选中的概率,表示按一定比例抽取,不要求总和为1,只要求大于0即可;默认为NULL,即等概率抽取

来看些例子:

> set.seed(1234)
> data <- 1:10
> data
 [1]  1  2  3  4  5  6  7  8  9 10

## 不重复抽样
> sample(data)   ##size默认为data的长度,随机排序
 [1]  2  6  5  8  9  4  1  7 10  3      
> sample(data, 5)
[1]  7  5  3 10  2
> sample(data, 12)  ##不重复抽样时,抽取的样本数目不能大于整体样品数
Error in sample.int(length(x), size, replace, prob) : 
  cannot take a sample larger than the population when 'replace = FALSE'

## 重复抽样
> sample(data, 12, replace=TRUE)
 [1] 9 3 3 2 3 4 4 2 1 3 9 6
> sample(c(0, 1), 100, replace=TRUE)  ##100次伯努利试验,成功概率为0.5
  [1] 1 1 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 0 1 1 0 0 1 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0
 [53] 1 1 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 0 1 1 1 1 1 0 0 0

## 按一定比例抽取样品
> ratio <- c(8, 2)   ##抽取比例为8:2
> sample(c(0, 1), 100, replace=TRUE, prob=ratio)   ##100次伯努利试验,成功概率为0.2
  [1] 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
 [53] 0 0 0 0 0 1 0 1 0 0 0 0 1 0 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1

## 也可以是字符数据
> sample(c('A', 'B'), 10, replace=TRUE)
 [1] "A" "B" "A" "B" "B" "A" "B" "B" "A" "B"

其实sample()函数的x参数可以是一个标量,比如sample(n),此时其等价于sample(1:n),看个例子:

> set.seed(100)
> sample(10)   ##等价于sample(1:10)
 [1]  4  3  5  1  9  6 10  2  8  7
> set.seed(100)
> sample(1:10)
 [1]  4  3  5  1  9  6 10  2  8  7

set.seed()sample()函数的使用就讲到这。

如若有遗漏,后期将会添加至本博客。

感谢您的阅读!想了解更多有关R语言技巧,请关注我的微信公众号“R语言和Python学堂”,我将定期更新相关文章。

《R语言初级教程(17): 随机数、随机抽样》

    原文作者:R语言和Python学堂
    原文地址: https://www.jianshu.com/p/b1ab591a18cd
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞