【问题标题】:Random sampling with different strata不同层次的随机抽样
【发布时间】:2019-01-14 23:28:28
【问题描述】:

我有一个数据集,我想从中选择随机的行样本,但要遵循一些预定义的规则。这可能是一个非常基本的问题,但我对此很陌生,并且仍在努力掌握基本概念。我的数据集包含大约 330 行数据(我在这里包含了一个简化版本),其中包含几列。我想从 330 行中抽取 50 行(为了简单起见,我将这些数字保留在模拟数据集中,因为这是我遇到的问题的一部分),并可以选择将预定义的规则添加到抽样过程中。 这是数据的模拟版本:

bank<-data.frame(matrix(0,nrow=330,ncol=5))
colnames(bank)<-c("id","var1","var2","year","lo")
bank$id<-c(1:330)
bank$var1<-sample(letters[1:5],330,replace=T)
bank$var2<-sample(c("s","r"),330,replace=T)
bank$var3<-sample(2010:2018,330,replace=T)
bank$lo<-sample(c("lo1","lo2","lo3","lo4","lo5","lo6"),330,replace=T)

我用来尝试采样正确行数的代码是

library(splitstackshape)
x<-splitstackshape::stratified(indt=bank,group=c("var1","var2","year","lo"),0.151)

但是,这不是选择 50 行。我最初尝试定义 size=50 但我收到以下错误:

Groups b s 2012 lo4,... [there is a very long list here],...contain fewer rows than requested. Returning all rows.

然后我尝试将大小定义为百分比:0.151(15.1%?)这应该是 330 个中的 50 个,但采样 5 行(我尝试 0.5 并采样 44 行,如果我尝试 0.500000001 它采样 287 行? ??)。

我错过了什么?目前我被困在这里。

一旦我设法对正确的行数 (50) 进行抽样,我想定义一些规则,例如:只有高达 50% 的样本可以有 2018 年(bank$year)并且最多只能有一半的 bank$ year==2018 行可以有bank$var2=="r"。显然我不希望有人为我这样做,但是请您提供一些建议

1- 为什么我得到错误的行数(可能只是语法?) 2- 如果 splitstackshape::stratified() 不是实现这一目标的最佳选择,我应该研究什么包?

非常感谢! M

【问题讨论】:

    标签: r sampling


    【解决方案1】:

    我认为问题在于您的数据集(正如您在此处共享的那样)相当小,您有大量地层(5 个字母 X 2 s 或 r X 9 年 X 6 lo 类别),而且不可能从每个层中抽取所需大小的样本。当我将样本量增加到 33,000 并抽取 15.1% 的样本时,我得到的样本量为 4,994。将 size = 50 设置为从每个层请求大小为 50 的样本,这对于您共享的数据是不可能的。

    > bank<-data.frame(matrix(0,nrow=33000,ncol=5))
    > colnames(bank)<-c("id","var1","var2","year","lo")
    > bank$id<-c(1:33000)
    > bank$var1<-sample(letters[1:5],33000,replace=T)
    > bank$var2<-sample(c("s","r"),33000,replace=T)
    > bank$var3<-sample(2010:2018,33000,replace=T)
    > bank$lo<-sample(c("lo1","lo2","lo3","lo4","lo5","lo6"),330,replace=T)
    > 
    > k <- stratified(bank, group = c('var1', 'var2', 'var3', 'lo'), size = .151)
    > dim(k)
    [1] 4994    6
    

    【讨论】:

      【解决方案2】:

      另一个过程,通过选择每个组所需的 n = 样本,由 Jenny Bryan here 提供;根据每组的特定样本大小从您指定 n 的组中抽样,samp 是每 n 组的随机样本;所以需要根据每组的比例调整n:

      bank %>% 
        group_by(var1) %>% 
        nest() %>% 
        mutate(n = c(7,0,9,1,13),
               samp = map2(data, n, sample_n)) %>% 
        select(var1, samp) %>% 
        unnest()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        • 2014-06-22
        • 2022-11-28
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        相关资源
        最近更新 更多