天天看點

R語言 分層抽樣---分層随機抽樣(SRS) strata的使用(一)

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)      
      

 

繼續閱讀