You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何控制连续变量差异从不同分组中抽取匹配样本?

R 自动化匹配抽样解决方案

核心逻辑

通过蒙特卡洛重复抽样遍历可能的样本组合,每次从三个组各抽取5个条目后,计算词长、词频两个变量在三组间的差异显著性,最终保留两个变量的显著性p值均最大(即差异最小,无统计学意义)的样本组合。

完整实现代码

# 加载所需工具包(如未安装先运行 install.packages("dplyr"))
library(dplyr)

# 导入数据集
mydata = structure(list(word = c("elastisch", "rutschig", "verklebt", 
"dumpf", "hallend", "formbar", "gelb", "braun", "blond", "klebrig", 
"blass", "blendend", "schlaff", "bunt", "singend", "lauwarm", 
"strahlend", "biegsam", "durchsichtig", "verbal", "erleuchtet", 
"schrill", "erloschen", "dehnbar", "beige", "farbig", "gepunktet", 
"heiser", "musikalisch", "schweigend", "schreiend", "schwer", 
"transparent", "flackernd", "blinkend", "stumpf", "gedimmt", 
"lautlos", "gefleckt", "pappig", "feucht", "stumm", "eisig", 
"taub", "steif", "weich", "leise", "kalt", "fein", "laut", "warm", 
"still"), group = c("H", "H", "H", "A", "A", "H", "V", "V", "V", 
"H", "V", "V", "H", "V", "A", "H", "V", "H", "V", "A", "V", "A", 
"V", "H", "V", "V", "V", "A", "A", "A", "A", "H", "V", "V", "V", 
"H", "V", "A", "V", "H", "H", "A", "H", "A", "H", "H", "A", "H", 
"H", "A", "H", "A"), length = c(9L, 8L, 8L, 5L, 7L, 7L, 4L, 5L, 
5L, 7L, 5L, 8L, 7L, 4L, 7L, 7L, 9L, 7L, 12L, 6L, 10L, 7L, 9L, 
7L, 5L, 6L, 9L, 6L, 11L, 10L, 9L, 6L, 11L, 9L, 8L, 6L, 7L, 7L, 
8L, 6L, 6L, 5L, 5L, 4L, 5L, 5L, 5L, 4L, 4L, 4L, 4L, 5L), frequency = c(1.114, 
1.519, 1.176, 0.903, 1.079, 0.903, 2.328, 2.305, 2.255, 1.716, 
2.199, 1.944, 1.505, 1.724, 1.146, 1.176, 1.699, 1.255, 1.633, 
1.204, 1.591, 1.23, 1.531, 1.041, 1.447, 1.041, 1.041, 1.477, 
1.531, 1.544, 1.845, 3.72, 1, 0.903, 0.699, 1.756, 0.301, 1.982, 
0.301, 0.477, 2.241, 2.064, 1.431, 2.718, 2.236, 2.651, 2.877, 
3.311, 2.838, 3.333, 2.937, 3.435)), class = "data.frame", row.names = c(NA, 
-52L))

# 设置参数
n_per_group <- 5 # 每组抽取的样本量
n_iter <- 10000 # 迭代次数,次数越高找到最优解的概率越大
set.seed(123) # 设置随机种子保证结果可复现

# 初始化最优结果存储
best_p <- 0
best_sample <- NULL

# 迭代抽样
for (i in 1:n_iter) {
  # 按组抽样
  current_sample <- mydata %>%
    group_by(group) %>%
    slice_sample(n = n_per_group) %>%
    ungroup()
  
  # 计算两个变量的ANOVA p值
  p_length <- summary(aov(length ~ group, data = current_sample))[[1]][1, "Pr(>F)"]
  p_freq <- summary(aov(frequency ~ group, data = current_sample))[[1]][1, "Pr(>F)"]
  
  # 取两个p值的最小值作为当前抽样的评分,找评分最大的样本
  current_min_p <- min(p_length, p_freq)
  if (current_min_p > best_p) {
    best_p <- current_min_p
    best_sample <- current_sample
  }
}

# 输出最优样本
print("最优匹配样本:")
print(best_sample)

# 验证差异显著性
print("词长组间差异ANOVA检验:")
print(summary(aov(length ~ group, data = best_sample)))
print("词频组间差异ANOVA检验:")
print(summary(aov(frequency ~ group, data = best_sample)))

参数调整说明

  • 若迭代10000次后得到的p值仍小于0.05,可将n_iter参数调高到20000或50000,进一步扩大搜索范围
  • 若对变量权重有特殊要求,可修改current_min_p的计算逻辑,给更重要的变量设置更高权重
  • 若数据不符合正态分布,可将ANOVA替换为Kruskal-Wallis非参数检验,对应p值计算代码改为:
p_length <- kruskal.test(length ~ group, data = current_sample)$p.value
p_freq <- kruskal.test(frequency ~ group, data = current_sample)$p.value

内容的提问来源于stack exchange,提问作者Alex M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 22:39:02