使用R进行多级采样,仅给出最终样本量

时间:2018-05-16 03:36:16

标签: r sampling multisampling

我正在尝试在几个阶段实施一个采样算法,只有样本的最终大小才知道。

以下是我的采样框架结构示例。地点:

  • cluster 是一个住户区。
  • total_households 是每个街区的住户数
  • 是一组块,具体取决于块中的住户数。
  • 概率是选择一个组的概率。

然后,该算法具有以下步骤:给定样本大小$ n $

  1. 选择一组具有不等比例的组,并使用简单的随机抽样替换。
  2. 使用简单的随机采样选择,而不替换上一步中选择的组中的一个聚类,并将其从采样框中删除。
  3. 在之前选择的群集中,只选择25%的家庭。
  4. 重复,直到达到确切的样本量
  5. 因为

            cluster   total_households group            Probability
     1       173494              13     2            4.055410e-01
     2       173495              19     5            4.176953e-02
     3       173496              22     5            4.176953e-02
     4       173497              21     5            4.176953e-02
     5       173498              18     5            4.176953e-02
     6       173499              27     7            6.775638e-05
     7       173500              15     4            5.020529e-01
    8       173501              19     5            4.176953e-02
    

    我想用R实现这个算法。我知道有一个带有采样的包,带有多级功能,但它不起作用。因为,我必须在实现算法之前指定群集和组的数量。我的编程技巧有限。我一直试图用while循环做一些事情,但我认为我的结果远非正确。

        require(dplyr) # to use pipes in the code 
    
        n_sample = 844
        group = NULL
        total = NULL
        cluster = NULL
        total_households = NULL
        total = 0
        i = 1
        while(total < n_sample){
        group[i] = groups[sample(nrow(groups),size = 1,prob = groups$P),c("group")]
        total_households = data[data$group==group[i],] %>% 
                              sample_n(size=1) %>% 
                                    select(total_households)
        cluster[i] = data[data$group==group[i],] %>%
                            sample_n(size=1) %>% 
                            select(cluster) %>% as.numeric() 
        data = data[data$cluster!=cluster[i],] 
        total = total+total_households
        i = i+1
        }
    

1 个答案:

答案 0 :(得分:1)

你非常接近你想要实现的目标(不考虑代码的整洁和专注于数字):

首先,让我们纠正while循环:( 2次修改)

while(total < n_sample){
group[i] = groups[sample(nrow(groups),size = 1,prob = groups$P),c("group")]
total_households = data[data$group==group[i],] %>% 
                      sample_n(size=1) %>% 
                      select(total_households) %>% as.numeric()          # Mod_1

cluster[i] = data[data$group==group[i],] %>%
                    sample_n(size=1) %>% 
                    select(cluster) %>% as.numeric() 
data = data[data$cluster!=cluster[i],] 
total = total+ (total_households*0.25)                                   # Mod_2
i = i+1
}

请注意,您最终会得到一个&gt; n,但您可以通过修改列表中最后一个群集的住户数来始终将其调整为n。

其次,您需要考虑的重要事项是,在整个算法中,组的概率总和应该加1。