当某些地层太小时,分层样本

时间:2014-04-24 13:19:45

标签: r sampling random-sample

我需要在每个层中绘制一个n观察的分层样本,但是某些层次的观测值比n少。如果一个阶层的观察结果太少(比如k<n个观察点),我想从该阶段中抽取所有k个观测值。

require(sampling)

n <- 10
geo_ID <- c(rep(1, times = 20), rep(2, times = 20), rep(c(1, 2, 3, 4), times = 5))
    set.seed(42)
V1 <- rnorm(60, 0, 1)
V2 <- rnorm(60, 2, 1)

DF <- data.frame(geo_ID = geo_ID, V1 = V1, V2 = V2)
    #Sort as explained in ?strata help file
DF <- DF[order(DF[, "geo_ID"]), ]

strata(DF, stratanames = "geo_ID", size = c(n, n, n, n), method = "srswor")

如果我如上所述使用未经替换的采样,我(可以理解)会收到错误:

Error in strata(DF, stratanames = "geo_ID", size = c(10, 10, 10, 10),  : 
  not enough obervations in the stratum 

使用替换进行抽样可以避免错误method = "srswr",但这并不理想,因为它有时会为足够大的层次绘制重复,以便只有唯一的样本绘制。

注意:在SO上有一个类似的问题,但它并没有得到真正的回答。另外我认为这个问题更为笼统。 (Stratified sampling - not enough observations)链接问题的答案通常不常用,因为它们要求(i)样本大小与层数大小成比例(而我需要一个固定数字)或(ii)手动编程层数地层,随着地层数量的增加,这是不可行的。

1 个答案:

答案 0 :(得分:4)

这并没有回答你关于如何使用&#34;采样&#34;包,但我写了a function called stratified,它会为你做这件事。

如果你有&#34; devtools&#34;安装后,您可以像这样加载:

library(devtools)
source_gist(6424112)

否则,只需将Gist中的函数代码复制到您的会话中即可享受乐趣。


用法很简单:

set.seed(1) ## So you can reproduce this
stratified(DF, group = "geo_ID", size = 10)
# Some groups
# ---3, 4---
# contain fewer observations than desired number of samples.
# All observations have been returned from those groups.
#    geo_ID          V1        V2
# 7       1  1.51152200 2.3358481
# 9       1  2.01842371 2.9207286
# 14      1 -0.27878877 1.0464766
# 20      1  1.32011335 0.9002191
# 5       1  0.40426832 1.2727079
# :::SNIP:::
# 43      3  0.75816324 0.9967914
# 47      3 -0.81139318 1.5777441
# 55      3  0.08976065 0.3389009
# 51      3  0.32192527 1.9749074
# 48      4  1.44410126 1.8776498
# 44      4 -0.72670483 3.8484819
# 60      4  0.28488295 2.1372562
# 52      4 -0.78383894 2.1080727
# 56      4  0.27655075 1.6176663

有一些&#34;有趣&#34;功能,比如在函数本身中对你的层次进行子集化:

## Selects only "geo_ID" values equal to 1 or 4
stratified(DF, group = "geo_ID", size = 10, select = list(geo_ID = c(1, 4)))

......采取比例样本:

## Just set the size argument to a value less than 1
stratified(DF, group = "geo_ID", size = .1)

...并使用多个列作为您的组。 Gist上的评论包括一些尝试的例子。