我正在尝试在几个阶段实施一个采样算法,只有样本的最终大小才知道。
以下是我的采样框架结构示例。地点:
然后,该算法具有以下步骤:给定样本大小$ n $
因为
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
}
答案 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。