r - 选择一个样本以匹配另一个数据集中的变量分布

标签 r sample frequency-distribution

设 x 是一个具有 5 个变量和 15 个观测值的数据集:

age gender  height  weight  fitness
17  M   5.34    68  medium
23  F   5.58    55  medium
25  M   5.96    64  high
25  M   5.25    60  medium
18  M   5.57    60  low
17  F   5.74    61  low
17  M   5.96    71  medium
22  F   5.56    75  high
16  F   5.02    56  medium
21  F   5.18    63  low
20  M   5.24    57  medium
15  F   5.47    72  medium
16  M   5.47    61  high
22  F   5.88    73  low
18  F   5.73    62  medium

适应度变量值的频率如下:
低 = 4,中 = 8,高 = 3。

假设我有另一个数据集 y 具有相同的 5 个变量但有 100 个观察值。该数据集中适应度变量值的频率如下:
低 = 42,中 = 45,高 = 13。

使用 R,我如何从 y 中获取代表性样本,以使样本适应度与 x 中的适应度分布紧密匹配?

我最初的想法是在 R 中使用样本函数并为 prob 参数分配加权概率。然而,使用概率会强制频率分布精确匹配。我的目标是在最大化样本大小的同时获得足够接近的匹配。

此外,假设我希望添加另一个约束,其中性别的分布也必须与 x 的分布紧密匹配?

最佳答案

y 中的最小频率为 13,对应于“高”健康水平。所以你不能采样超过这个数字。这是你的第一个限制。您想最大化您的样本量,因此您对所有 13 个样本进行了抽样。要匹配 x 中的比例,13 个应占总数的 20%,这意味着您的总数必须为 65 (13/0.2)。因此,其他频率必须是 17(低)和 35(中)。由于您的 y 中有足够多的这些健康水平,您可以以此为样本。如果任何其他采样频率超过 y 中的数量,那么您将有另一个约束,并且必须相应地调整这些。

对于抽样,您首先选择所有具有“高”适应度的记录(确定性抽样)。接下来,分别从其他级别抽样(分层随机抽样)。最后,将三者结合起来。

例子:

rm(list=ls())
# set-up the data (your "y"):
df <- data.frame(age=round(rnorm(100, 20, 5)), 
                 gender=factor(gl(2,50), labels=LETTERS[c(6, 13)]), 
                 height=round(rnorm(100, 12, 3)), 
                 fitness=factor(c(rep("low", 42), rep("medium", 45), rep("high", 13)), 
                                levels=c("low","medium","high")))

创建子集进行抽样:
fit.low <- subset(df, subset=fitness=="low")
fit.medium <- subset(df, subset=fitness=="medium")
fit.high <- subset(df, subset=fitness=="high")

从低适应度组中抽取 17 个样本(占总数的 40.5% 或 26.7%)。
fit.low_sam <- fit.low[sample(1:42, 17),]

从中等健康组中抽取 35 个样本(占总数的 77.8% 或 53.8%)。
fit.med_sam <- fit.medium[sample(1:45, 35),]

将它们全部结合起来。
fit.sam <- rbind(fit.low_sam, fit.med_sam, fit.high)

我尝试使用 sample_n 来做到这一点和 sample_frac来自 dplyr 的函数,但我认为这些函数不允许您进行不同比例的分层抽样。
library(dplyr)
df %>%
  group_by(fitness) %>%
  sample_n(size=c(17,35,13), weight=c(0.27, 0.53, 0.2))
# Error

但是采样包当然可以做到这一点。
Stratified random sampling from data frame
library(sampling)
s <- strata(df, "fitness", size=c(17,35,13), "srswor")
getdata(df, s)

关于r - 选择一个样本以匹配另一个数据集中的变量分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60556408/

相关文章:

python - 为条件频率分布创建标记和文本的元组

r - 垂直直方图

r - 命令行 - 适用于 Windows 的 Awk 命令

r - 在R中合并两列数据框

eclipse - gwt> 导入示例项目

c# - 将 wav 文件存储在数组中

python - 从列表中互斥随机抽样

python - 如何在 matplotlib "histogram"图表上添加(或注释)值标签(或频率)

r - 计算矩阵中非零列的数量