我正在研究通过非随机样本设计收集的心理评估数据。我的数据框由“性别”(男性和女性)和“教育程度”(“小学”、“高中”、“大学”)组成。然而,我的经验分布与真实分布不同。
我知道性别的真实参数是 0.7 女性和 0.3 男性。我也知道学校教育的真实参数是小学等于 0.5,高中等于 0.3,大学等于 0.2
我想要一个可以“剪切”(调整?)我的数据框以匹配这些特征的代码。我知道我的最终数据框的参与者将比当前的少。我想知道在这种情况下 for / 循环解决方案是否可行。
数据:
df2 = data.frame(
sex = rep(c("m","f"),135),
schooling = c("elementary","highschool","college")
)
prop.table(table(df2$sex))
prop.table(table(df2$schooling))
您可以按所需比例对观察结果进行加权,然后使用
dplyr::slice_sample()
:
set.seed(13)
library(dplyr)
prop_sex <- c(f = 0.7, m = 0.3)
prop_school <- c(elementary = 0.5, highschool = 0.3, college = 0.2)
df3 <- df2 %>%
mutate(wt = prop_sex[sex] * prop_school[schooling]) %>%
slice_sample(prop = 2/3, weight_by = wt)
prop.table(table(df3$sex))
# f m
# 0.6055556 0.3944444
prop.table(table(df3$schooling))
# college elementary highschool
# 0.2777778 0.4111111 0.3111111
根据您想要的精度级别,您可以迭代,直到比例落在目标的一定容差范围内。