R语言 分层抽样---分层随机抽样(SRS) strata的使用
例子 一:
手动创新一个数据框,如下。
test
a b c d
1 2 qw a1 y
2 2 qw a1 y
3 3 we b1 y
4 4 er b1 y
5 4 er c1 y
6 5 wd c1 y
7 5 rt d1 y
8 6 rt d2 n
9 7 we d1 n
10 7 we d1 n
11 8 we d1 n
12 8 we d1 n
13 8 we d1 n
14 9 we d1 n
15 9 we d1 n
16 9 we d1 n
17 10 we d1 y
18 10 we d1 y
19 10 we d1 y
20 10 we d1 y
21 10 we d1 y
22 10 we d1 y
23 11 we d1 y
24 11 we d1 y
25 11 we d1 y
26 11 we d1 y
27 11 we d1 y
28 11 we d1 y
29 11 we d1 y
30 11 we d1 y
查看各层分布情况:
table(test$d)
n y
9 21
排序:
test=test[order(test$d),]
语法:
strata(data, stratanames=NULL, size, method=c("srswor","srswr","poisson","systematic"), pik,description=FALSE)
data: 带抽样数据。
stratanames: 进行分层所依据的变量名称。
size: 各层中要抽出的观测样本数。
method: 选择4中抽样方法,分别为无放回、有放回、泊松、系统抽样,默认为srswor。
pik: 设置各层中样本的抽样概率。
description: 选择是否输出含有各层基本信息的结果。
四个任选一:c("srswor","srswr","poisson","systematic")
用法:
sized1= round(0.7*length(test$d))
sized2=1-sized1
选择某一列作为分层依据:这里例子选的是 d 列
st=strata(test,stratanames=c("d"),size=c(sized), method="srswor")
分层后的数据:(ID_unit,是每层随机行被选中了,同时显示行的ID,Prob 是分层的概率,Stratum是分了多少层)
st
d ID_unit Prob Stratum
28 y 28 0.1428571 1
29 y 29 0.1428571 1
30 y 30 0.1428571 1
8 n 8 0.7777778 2
9 n 9 0.7777778 2
11 n 11 0.7777778 2
12 n 12 0.7777778 2
13 n 13 0.7777778 2
14 n 14 0.7777778 2
15 n 15 0.7777778 2
这里再次用pik来说明一下分层效果:
st=strata(test,stratanames=c("d"),size=c(sized),pik=c(.25,.75), method="srswor")
> st
d ID_unit Prob Stratum
5 y 5 0.1428571 1
7 y 7 0.1428571 1
23 y 23 0.1428571 1
8 n 8 0.7777778 2
10 n 10 0.7777778 2
11 n 11 0.7777778 2
12 n 12 0.7777778 2
13 n 13 0.7777778 2
14 n 14 0.7777778 2
16 n 16 0.7777778 2
查看分层后的全部数据:
getdata(test,st)
b c a ID_unit Prob Stratum
1 qw a1 2 1 0.5 1
3 we b1 3 3 1.0 2
4 er b1 4 4 0.5 3
6 wd c1 5 6 0.5 4
8 rt d2 6 8 1.0 5
拿出b,c,a放到数据框.
testdata<-getdata(test,st)
testdata<-as.data.frame(testdata)
执行三次
testdata[-4]
分层完毕:
> testdata
b c a
1 qw a1 2
3 we b1 3
4 er b1 4
6 wd c1 5
8 rt d2 6
例子二:引用R包sampling 的数据
library(sampling)
ps.options(pointsize=12)
options(width=60)
###################################################
### code chunk number 2: calib1
###################################################
data = rbind(matrix(rep("A", 150), 150, 1, byrow = TRUE),
matrix(rep("B", 100), 100, 1, byrow = TRUE))
data = cbind.data.frame(data, c(rep(1, 60), rep(2,50), rep(3, 60), rep(1, 40), rep(2, 40)),
1000 * runif(250))
sex = runif(nrow(data))
for (i in 1:length(sex)) if (sex[i] < 0.3) sex[i] = 1 else sex[i] = 2
data = cbind.data.frame(data, sex)
names(data) = c("state", "region", "income", "sex")
summary(data)
###################################################
### code chunk number 3: calib2
###################################################
table(data$state)
s=strata(data,c("state"),size=c(25,20), method="srswor")
##s=strata(data,c("state"),size=c(25,20),pik=c(.75,.25) method="srswor") 用了pik产生的值差不多。
s=getdata(data,s)