我无法找出现有方法或编写新代码来针对两种不同的人口基准分布使用数据集框架
中的分层抽样。由于我不能 100% 确定我使用了正确的术语,因此我将用一个简化的示例更具体地解释:
我有一个数据集,其中包含我了解其性别和教育水平的小组成员,以及抽样框架
。我想使用分层抽样从那里抽取样本。我知道性别
的人口分布,以及教育
的分布,但不知道联合分布(而且我不愿意假设教育在性别之间是相同分布的)。使用分层抽样,我希望最终得到一个在这两个基准上(大致)具有代表性的样本。
我提供下面的代码来展示如何在一个分布(性别
)上进行采样。我知道抽样包中存在简化分层抽样的功能,但据我了解,它们不具备两个边际分布的分层抽样功能。
library(dplyr)
N = 1000 # framework size
n = 300 # sample size
# create sampling framework
framework = data.frame(id = seq(1:N),
gender = sample(c("M","F"), N, replace = TRUE, prob = c(0.3, 0.7)),
education = sample(c("1. Low", "2. Mid", "3. High"), N, replace = TRUE, prob = c(0.2, 0.3, 0.5)))
# create population benchmarks
pop_gender = data.frame(gender = c("M", "F"),
prop = c(0.5, 0.5))
pop_education = data.frame(education = c("1. Low", "2. Mid", "3. High"),
prop = c(0.4, 0.3, 0.3))
# loop through strata (in this case just M/F) and select sample
selected = NA # empty selection vector
for(i in pop_gender$gender){
# subset framework to stratum
framework_sel = framework %>%
filter(gender == i)
# select sample from stratum
selected_i = sample(framework_sel$id, # sample from ids
n*pop_gender$prop[pop_gender$gender == i], # sample size within stratum
replace = FALSE)
selected = c(selected, selected_i)
}
# pull sample from framework
sample = framework %>%
filter(id %in% selected)
# compare sample to population
prop.table(table(sample$gender))
prop.table(table(sample$education))
需要明确的是:我希望最终得到一个在性别和教育方面都与人口相匹配的样本。
我很欣赏任何见解!
我没有包含在这个简化示例中的另一个问题是,框架很可能在某些层中没有足够的人员来采样到预期的层样本大小。
最佳答案
立方体采样,如sampling::samplecube
中那样进行采样以匹配多个边距。
我认为在实践中更常见的是进行采样以仅匹配一个边距,然后进行后分层/耙子以匹配另一个边距。
关于r - 基于两个总体基准分布的分层抽样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77505172/