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)
写评论
很抱歉,必須登入網站才能發佈留言。