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

作者: R语言和Python学堂 | 来源:发表于2018-11-16 07:40 被阅读6次

    在很多统计分析中,随机化是一个非常重要的环节。对于从各种概率分布(离散和连续分布)产生随机数的方法将在《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): 随机数、随机抽样

        本文链接:https://www.haomeiwen.com/subject/fcqgxqtx.html