使用 R 的多级抽样,仅给出最终样本量
Multistage sampling with R with only final sample size given
我正在尝试实现一种算法,用于分几个阶段进行抽样,其中只有样本的最终大小是已知的。
这是我的抽样框结构的一个例子。其中:
- cluster 是一组家庭。
- total_households是每个街区的户数
- group 是根据街区中的家庭数量对街区进行分组。
- 概率是select一组的概率。
然后,该算法有以下步骤:给定样本大小 $n$
- Select一组具有不等概率的简单随机抽样和替换。
- Select 简单随机抽样,不替换上一步 select 组中的一个簇,并将其从抽样框中移除。
- 在之前 selected 的集群中,select 只有 25% 的家庭。
- 重复直到达到准确的样本大小
因为
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。
我正在尝试实现一种算法,用于分几个阶段进行抽样,其中只有样本的最终大小是已知的。
这是我的抽样框结构的一个例子。其中:
- cluster 是一组家庭。
- total_households是每个街区的户数
- group 是根据街区中的家庭数量对街区进行分组。
- 概率是select一组的概率。
然后,该算法有以下步骤:给定样本大小 $n$
- Select一组具有不等概率的简单随机抽样和替换。
- Select 简单随机抽样,不替换上一步 select 组中的一个簇,并将其从抽样框中移除。
- 在之前 selected 的集群中,select 只有 25% 的家庭。
- 重复直到达到准确的样本大小
因为
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。