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

如何抽取双变量最高正相关或近零相关的索引匹配样本?

解决方案:抽取指定相关性的样本数据

预处理数据

首先移除包含缺失值的行,避免干扰相关性计算:

# 清理缺失值
df_clean <- df[!is.na(df$B), ]

抽取最高正相关样本(接近+1)

要让样本中A与B的相关系数尽可能接近+1,核心是选择对正协方差贡献最大的数据点:

  1. 将A和B标准化为z分数,消除量纲影响
  2. 计算每个数据点的z分数乘积,该值越大,对正相关性的贡献越高
  3. 按乘积降序排序,取前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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:54:35