【问题标题】:Stratified sample when some strata are too small当某些层太小时分层样本
【发布时间】:2014-04-24 13:19:44
【问题描述】:

我需要在每个层中使用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) 逐层手动编程,随着层数的增加,这是不可行的。

【问题讨论】:

    标签: r sampling random-sample


    【解决方案1】:

    这并不能回答您关于如何使用“采样”包执行此操作的问题,但我已经写了a function called stratified,它将为您完成此操作。

    如果你安装了“devtools”,你可以像这样加载它:

    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
    

    有一些“有趣”的功能,比如在函数本身中对你的层进行子集:

    ## 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 上的 cmets 包含一些可供试用的示例。

    【讨论】:

    • 谢谢!一个问题,在我的真实数据中,我有多个地理 ID 字段,一些数字和一些字符。上面的函数适用于数字(城镇 ID),但是当我在字符字段(城镇名称)上运行它时,我得到这个响应:Error in if (length(x) == 1L &amp;&amp; is.numeric(x) &amp;&amp; x &gt;= 1) { : missing value where TRUE/FALSE needed。虽然没有数据可能无法知道,但也许你写了这个函数就知道了。
    • @DTRM,对不起。我已经离开几天了。我会尝试看看是否可以重新创建您的错误。否则,如果您有一些重新创建错误的示例数据,请更新您的问题并在此处的 cmets 中 ping 我。
    • @AHandcartAndMohair 要点链接目前已损坏:gist.github.com/mrdwab/6424112
    • This Question 是否也与您的抽样方法有关?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-12
    • 2021-01-19
    • 1970-01-01
    • 2017-04-23
    • 2019-12-27
    • 2022-11-20
    • 2020-05-04
    相关资源
    最近更新 更多