R语言—使用函数sample进行抽样

R语⾔—使⽤函数sample进⾏抽样
在医学统计学或者流⾏病学⾥的现场调查、样本选择经常会提到⼀个词:随机抽样。随机抽样是为了保证各⽐较组之间均衡性的⼀个很重要的⽅法。那么今天介绍的第⼀个函数就是⽤于抽样的函数sample:
1.
> x= 1:10
2.
3.
> sample(x=x)
4.
5.
[ 1]  3  5  9  6 10  7  2  1  8  4
第⼀⾏代码表⽰给x向量赋值1~10,第⼆⾏代码表⽰对x向量进⾏随机抽样。结果输出为每次抽样抽得的结果,可以看出该抽样为⽆放回抽样------最多抽n次,n为x向量中元素的个数。
如果想指定在该向量中抽取元素的个数,需要加⼀个参数size:
> x=1:1000
> sample(x=x,size=20)
[1]  66 891 606 924 871 374 879 573 284 305 914 792 398 497 721 897 324 437
[19] 901  33包装箱制作
这是在1~1000的正整数中抽样,其中size指定抽样的次数,抽了20次,结果如上所⽰。
这些都是⽆放回抽样。所谓⽆放回抽样,也就是说某个元素⼀旦被选择,该总体中就不会再有该元素。如果是有放回抽样,则需添加⼀个参数repalce=T:
> x=1:10
> sample(x=x,size=5,replace=T)
[1] 4 7 2 4 8
“replace”就是重复的意思。即可以重复对元素进⾏抽样,也就是所谓的有放回抽样。我们看上⾯的结果,元素4在5次随机抽样的过程中被抽取了两次。
R语⾔代码有⼀个特性就是“对位性”,也许我的词不专业,但是它的意思就是:如果我们输⼊代码的位置与某个函数中参数的位置⼀⼀对应的话,我们可以不写该函数的参数,如:
> x=1:10
> sample(x,20,T)
[1] 1 2 2 1 5 5 5 9 9 5 2 9 8 3 4 8 8 8 1 1
足球机器人在上述代码中我们省略了参数x,size和repalce,但是仍然可以运算并且表⽰对x向量有放回随机抽取20次。我们之所以尽量在每次编写代码时带上参数是因为我觉得这个习惯⽐较好,⽽且看起来清楚明⽩。另外,省略参数的前提是你⾮常熟悉某个函数参数的位置,否则⼀旦没有“对位”,那么结果肯定是错误的。⽽且很多函数有较多的参数,想记住它们的位置是困难的。⽽如果带上参数,那么即使位置不对应,也⼀样可以运算:
> x=1:10
> sample(size=20,replace=T,x=x)
[1]  4  9  2  6  4  5  4  7 10  5  2  2  3  4  2  4  6  8  7  8
这种优点显⽽易见,不仅清楚,⽽且⽆需对应。另外我们也可以看出,有放回抽样的话size可以⽆穷⼤,⽽⽆放回抽样size的⼤⼩就取决于总体的容量了。
对于掷骰⼦,投硬币(这可能是介绍抽样必介绍的内容),都属于有放回抽样。
这⾥要说明,对于sample函数,参数x可以是数值,也可以是字符,实际上参数x代表任意⼀个向量:
> a=c("A","B")
> sample(x=a,size=10,replace=T)
[1] "B" "A" "A" "A" "B" "A" "A" "B" "A" "A"
上述代码可以理解为掷硬币,抛了10次,其中正⾯(A)与反⾯(B)出现的次数。
上述抽样过程,每⼀个元素被抽取的概率相等,称为随机抽样。
有时候我们的抽取元素的概率未必相等(如常见的⼆项分布概率问题),此时我们需要添加⼀个参数prob,也就是“probability”(概率)的缩写。假设⼀名医⽣给患者做某⼿术成功的概率是80%,那么现在他给20例病⼈做⼿术,可能有哪⼏次是成功的呢?代码如下:
> x=c("S","F")
> sample(x,size=20,replace=T,prob=c(0.8,0.2))
[1] "F" "S" "S" "S" "S" "S" "S" "S" "S" "S" "S" "S" "F" "S" "S" "F" "S" "S"
[19] "F" "S"
其中“S”代表成功,“F”代表失败。
> x=c(1,3,5,7)
> sample(x,size=20,replace=T,prob=c(0.1,0.2,0.3,0.9))
[1] 3 5 7 3 7 3 7 5 3 7 7 7 1 5 7 5 7 7 3 7
这些代码告诉我们,对每⼀个元素都可以给定⼀个概率,且每个概率是独⽴的,即在参数prob中,不
⼀定所有元素的概率加起来等于1,它只代表某元素被抽取的概率⽽已。
对于sample函数,其参数x可以是R中任意⼀个对象(如上述对字符的抽样)。其中还有⼀个功能相同的函数
sample.int,“int”即“intger”的缩写,也就是“整数”。它的参数n必须是正整数:防身器
> x=-10.5:7.5
冷冲模
> sample(x=x,size=3);sample.int(n=x,size=3)
[1] -5.5 -7.5  0.5
Error in sample.int(x, size = 3) : invalid first argument
第⼀⾏代码⽣成了-10.5到7.5的等差数列,结果输出的第⼀⾏是sample的结果;第⼆⾏是sample.int的结果,提⽰错误:“第⼀个⾃变量⽆效”,因为它不是正整数。其余的⽤法与sample是⼀样的。
接下来介绍第⼆个函数max/min,以及pmax/pmin。
> x=sample(1:1000,size=20)
> x
[1] 514 164 107 354 719 317 204 372 714 522 900 635 441  7  230 653 420 804
[19] 817  36
> max(x);min(x)
[1] 900
[1] 7
从1:1000中随机抽取了20个数,并得出它们的最⼤值和最⼩值。如果有缺失值,那么需要⼀个参数na.rm=T,即移除缺失值,这在前⾯的mean函数中已经介绍过了:
> x=c(x,NA)
> mean(x);mean(=T);max(x);max(=T);min(x);min(=T)
[1] NA
[1] 446.5
[1] NA
[1] 900
[1] NA
[1] 7
第⼀⾏代码我们给原来的向量x添加了⼀个缺失值“NA”,第⼆⾏代码及结果分别显⽰了在计算x的均值、最⼤值、最⼩值时是否带参数na.rm=T的情况。
> x=sample(1:1000,size=20)
> y=sample(1:1000,size=20)
> x;y
[1] 596 333 401 746 970 121 665 831 853 741 855  99 331 275 286 370 558 373
[19]  55 786
[1] 291 360 964 173 497 553 155  34 488  29 661 736 591 602 548 527 450 416
[19] 596 965
这⾏代码我们对1:1000分别进⾏20次⽆放回随机性抽样得到向量x和y。
> pmax(x,700)
[1] 700 700 700 746 970 700 700 831 853 741 855 700 700 700 700 700 700 700
[19] 700 786
> pmin(y,700)
[1] 291 360 700 173 497 553 155  34 488  29 661 700 591 602 548 527 450 416
[19] 596 700
第⼀个代码表⽰⽤700和x向量中的每⼀个元素进⾏⽐较,将每次⽐较结果较⼤者输出。
第⼆个代码表⽰⽤700和y向量中的每⼀个元素进⾏⽐较,将每次⽐较结果较⼩者输出。
这就是pmax/pmin的⽤法,p在这⾥表⽰“parallel”,可以理解为对向量做平⾏⽐较。
> pmax(x,y)
[1] 596 360 964 746 970 553 665 831 853 741 855 736 591 602 548 527 558 416
[19] 596 965
该结果显⽰了将x向量与y向量中的每个元素平⾏⽐较后得出的较⼤值的结果。如第⼀个元素的⽐较,x为596,y为291,所以结果输出为596;第⼆个元素⽐较,x向量为333,y向量为360,因此输出结果为360。后⾯的结果也是⼀样。
因为x向量与y向量是等长的,所以我们可以对x与y每⼀个元素进⾏平⾏⽐较。因为R中向量运算时具有“循环原则”,所以在上⾯的例⼦中我们也可以⽤x或y向量与⼀个元素“700”⽐较(相当于包含⼀个元素“700”的向量重复了20次)。
如果循环完整,那么较短向量中的元素依次与较长向量中的元素进⾏⽐较
> x=c(1,3,5,7)
> y=c(4,6)
> pmax(x,y)
[1] 4 6 5 7
结果解释:第⼀个是1与4⽐较的最⼤值,第⼆个是3与6⽐较的最⼤值,第三个是5与4⽐较的最⼤值,最后⼀个是7与6⽐较的最⼤值。如果循环不完整,⾃然会出现警告,但输出结果依然是各元素依次平⾏⽐较的结果:
> x=c(1,3,5,7,9)
> y=c(4,6)
> pmax(x,y)
[1] 4 6 5 7 9
Warning message:
In pmax(x, y) : an argument will be fractionally recycled
警告的内容是:⾃变量将部分循环。
对于函数pmax/pmin,也有参数na.rm=T,⽤法是⼀样的。同时有对应的pmax.int/pmn.int,也就是⽐
较向量内的元素必须是整数。
接下来给⼤家介绍今天的最后⼀个函数length,即查看某⼀对象的长度。
> x=c(1,3,5,7,9,11)
> y=c("a","b","c")
> z=matrix(1:12,nrow=3)
> a=cbind(x,y)
> length(x);length(y);length(z);length(a)
[1] 6
莴笋削皮机
[1] 3
[1] 12
[1] 12
多功能烧烤车
结果告诉我们向量x的长度是6,向量y的长度是3,矩阵z的长度是12(3×4)。以列结合的对象a的长度为12(6×2)。
对于数据框,其长度为列的长度:
> x=1:5
> y=6:10
> z=7:11
> d=data.frame(x,y,z)
> length(d)
[1] 3
函数length也可以“反向使⽤”,即对于已知向量,先给定其长度然后输出结果:> x=1:20
> length(x)=12
> x
[1]  1  2  3  4  5  6  7  8  9 10 11 12
X向量的真实长度为20,但我们输出长度为12的x向量。

本文发布于:2024-09-22 14:28:08,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/316120.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:向量   元素   抽样   参数   结果   概率
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议