使用 R 的多级抽样,仅给出最终样本量

Multistage sampling with R with only final sample size given

我正在尝试实现一种算法,用于分几个阶段进行抽样,其中只有样本的最终大小是已知的。

这是我的抽样框结构的一个例子。其中:

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

  1. Select一组具有不等概率的简单随机抽样和替换。
  2. Select 简单随机抽样,不替换上一步 select 组中的一个簇,并将其从抽样框中移除。
  3. 在之前 selected 的集群中,select 只有 25% 的家庭。
  4. 重复直到达到准确的样本大小

因为

        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 实现这个算法。我知道有一个名为 sampling 的包,带有 multistage 函数,但是这是行不通的。因为,我必须在实现算法之前指定集群和组的数量。我的编程技能有限。我一直在尝试用 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
    }

你已经非常接近你想要实现的目标了(抛开代码的整洁,专注于数字):

首先,让我们更正 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
}

请注意,您最终会得到总数 > n 的总数,但您始终可以通过修改列表中最后一个集群的家庭数量将其调整为等于 n。

其次,您需要考虑的重要一点是,在整个算法中,各组的概率之和应加到 1。