r - 基于两个总体基准分布的分层抽样

标签 r sampling survey

我无法找出现有方法或编写新代码来针对两种不同的人口基准分布使用数据集框架中的分层抽样。由于我不能 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/

相关文章:

r - 将日期转换为特定格式,如月日、年

r - ggplot2position_dodge影响误差条宽度

filter - 低通 FIR 滤波器 - 无延迟

python - readframes 在 python 中返回 2 个字节

r - 如何报告 svyglm 对象的拟合优度?

PHP 将表单响应插入到单独的 MySQL 表/行中

r - 无法使用来自 tidyr 的新 pivot_wider() 填充缺失值

r - 使用 lattice 和 quantreg 绘制多分位数回归线

matlab - MATLAB中两个不同长度数据集的重采样

r - 是否可以在 Windows 上获得 R 调查包的 `svyby` 函数 multicore= 参数?