如何抽取双变量最高正相关或近零相关的索引匹配样本?
解决方案:抽取指定相关性的样本数据
预处理数据
首先移除包含缺失值的行,避免干扰相关性计算:
# 清理缺失值 df_clean <- df[!is.na(df$B), ]
抽取最高正相关样本(接近+1)
要让样本中A与B的相关系数尽可能接近+1,核心是选择对正协方差贡献最大的数据点:
- 将A和B标准化为z分数,消除量纲影响
- 计算每个数据点的z分数乘积,该值越大,对正相关性的贡献越高
- 按乘积降序排序,取前50个点
# 计算z分数 df_clean$zA <- scale(df_clean$A) df_clean$zB <- scale(df_clean$B) # 计算z分数乘积(衡量对正相关的贡献) df_clean$pos_contribution <- df_clean$zA * df_clean$zB # 按贡献值降序排序,取前50个点 df_high_corr <- df_clean[order(-df_clean$pos_contribution), ][1:50, ] # 验证样本相关性 cor(df_high_corr$A, df_high_corr$B)
抽取最低相关样本(接近0)
要让样本相关性尽可能接近0,需要平衡数据点对协方差的正负贡献,避免整体偏向正或负相关。以下是两种简便实现方法:
方法1:分层抽样(保证分布均衡)
将A和B分别划分为5个分位数区间,从每个区间组合中抽取等量数据点,确保覆盖所有A和B的取值组合,从而削弱线性相关性:
library(dplyr) set.seed(123) # 固定随机种子保证结果可复现 # 为A和B创建分位数区间 df_clean$A_bin <- cut(df_clean$A, breaks = 5, labels = FALSE) df_clean$B_bin <- cut(df_clean$B, breaks = 5, labels = FALSE) # 从每个区间组合中抽取最多2个点,凑够50个样本 df_low_corr <- df_clean %>% group_by(A_bin, B_bin) %>% sample_n(min(n(), 2), replace = FALSE) %>% ungroup() %>% slice(1:50) # 验证样本相关性 cor(df_low_corr$A, df_low_corr$B)
方法2:平衡贡献值
计算每个点的z分数乘积,选择正负贡献值平衡的点,使总贡献和尽可能接近0:
# 按贡献值从小到大排序 df_sorted <- df_clean[order(df_clean$pos_contribution), ] # 从两端交替选取,平衡正负贡献 half <- 25 df_low_corr <- rbind( df_sorted[1:half, ], # 负贡献最大的25个点 df_sorted[(nrow(df_sorted)-half+1):nrow(df_sorted), ] # 正贡献最大的25个点 ) # 验证样本相关性 cor(df_low_corr$A, df_low_corr$B)
说明
- 上述方法均为启发式解法,因为精确找到最优50个点属于组合优化问题,计算成本极高
- 实际使用时可多次运行随机抽样方法,选择相关性最接近目标值的样本
内容的提问来源于stack exchange,提问作者raghav
相关产品推荐
相关产品推荐

