如何在R中从多变量DataFrame提取多变量均匀分布的子样本
多变量均匀分布子样本抽取方案(R实现)
针对你的需求,以下三种方法可以实现让三个变量在各自取值范围内均匀分布的子样本抽取,每种方法对应不同的场景:
方法1:分箱分层抽样
先对每个变量按分位数分箱,再基于交叉分箱的分组进行抽样,确保每个变量的各区间都能被覆盖。
library(dplyr) # 对3个变量各分7组(匹配你单变量抽样的间隔比例) df <- df %>% mutate( var1_bin = ntile(variable1, 7), var2_bin = ntile(variable2, 7), var3_bin = ntile(variable3, 7) ) # 创建跨变量的交叉分组 df$cross_group <- interaction(df$var1_bin, df$var2_bin, df$var3_bin) # 从每个非空交叉组抽取1个样本 set.seed(123) # 固定随机种子保证结果可复现 sub_sample <- df %>% group_by(cross_group) %>% sample_n(size = 1) %>% ungroup() %>% select(-var1_bin, -var2_bin, -var3_bin, -cross_group) # 查看结果 sub_sample
方法2:拉丁超立方抽样(LHS)
这是专门为多变量均匀抽样设计的方法,能更高效地覆盖整个变量取值空间,比分箱法更灵活。
library(lhs) library(dplyr) # 设置抽取的样本量(67/7≈9,这里取9个样本) n_sample <- 9 # 生成LHS抽样的标准化分位点 set.seed(123) lhs_points <- randomLHS(n_sample, 3) # 找到与LHS分位点最匹配的原数据样本 sub_sample <- df[apply(lhs_points, 1, function(point) { # 计算每个样本到LHS分位点的欧氏距离 dists <- sqrt( (df$variable1 - quantile(df$variable1, point[1]))^2 + (df$variable2 - quantile(df$variable2, point[2]))^2 + (df$variable3 - quantile(df$variable3, point[3]))^2 ) which.min(dists) }), ] # 查看结果 sub_sample
方法3:k-means聚类抽样
通过聚类将数据按变量相似性分组,再从每个簇抽取样本,既保证分布均匀,也能保留数据的结构特征。
library(dplyr) # 设置簇数(同样取9个,匹配抽样比例) n_clusters <- 9 # 基于3个变量做k-means聚类 set.seed(123) cluster_fit <- kmeans(df[, c("variable1", "variable2", "variable3")], centers = n_clusters) df$cluster <- cluster_fit$cluster # 从每个簇抽取1个样本 sub_sample <- df %>% group_by(cluster) %>% sample_n(size = 1) %>% ungroup() %>% select(-cluster) # 查看结果 sub_sample
方法选择建议
- 分箱分层抽样:逻辑简单易理解,适合变量分布规则的场景;若交叉分箱后空组过多,可减少分箱数。
- LHS抽样:多变量均匀抽样的最优方案之一,对分布均匀性要求高时优先使用。
- 聚类抽样:适合变量间存在相关性的数据集,能同时兼顾分布均匀性和数据结构。
内容的提问来源于stack exchange,提问作者Thea
相关产品推荐
相关产品推荐

