
在很多统计分析中,随机化是一个非常重要的环节。对于从各种概率分布(离散和连续分布)产生随机数的方法将在《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
的长度 -
prob
:x
中各元素被选中的概率,表示按一定比例抽取,不要求总和为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学堂”,我将定期更新相关文章。

网友评论