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

是否有R函数可实现两组对应样本的两两相关性检验?

解决方案

针对你的需求,这里提供两种可行的实现思路,对应不同的检验场景:


场景1:对每个样本对(A1-B1、A2-B2…),检验该样本对所有指标的A/B值相关性

如果你的目标是计算每个样本对(比如A1和B1)中,锌、铁、镉等指标的A组数值与B组数值之间的相关性,可以按以下步骤操作:

步骤1:标准化数据结构

先给两个子集添加样本ID,确保A、B组样本一一对应:

# 给conA、conB添加样本ID(假设行顺序就是样本1-5)
conA$sample_id <- 1:nrow(conA)
conB$sample_id <- 1:nrow(conB)

步骤2:转换数据格式并合并

将宽格式数据转为长格式,方便按样本分组处理:

library(tidyr)
library(dplyr)

# 转换为长格式:样本ID、指标名、对应数值
conA_long <- conA %>% pivot_longer(-sample_id, names_to = "indicator", values_to = "A_value")
conB_long <- conB %>% pivot_longer(-sample_id, names_to = "indicator", values_to = "B_value")

# 按样本ID和指标名合并数据
merged_data <- inner_join(conA_long, conB_long, by = c("sample_id", "indicator"))

步骤3:批量执行相关性检验

使用dplyr分组+broom整理检验结果:

library(broom)

# 按样本ID分组,每组执行Spearman相关性检验
pairwise_cor_results <- merged_data %>%
  group_by(sample_id) %>%
  summarize(
    cor_test = list(tidy(cor.test(A_value, B_value, method = "spearman", exact = FALSE)))
  ) %>%
  unnest(cor_test)

# 查看结果
print(pairwise_cor_results)

步骤4:绘制线性模型图

每个样本对单独绘制指标散点图+线性拟合线:

library(ggplot2)

ggplot(merged_data, aes(x = A_value, y = B_value)) +
  geom_point(aes(color = indicator), size = 2) +
  geom_smooth(method = "lm", se = FALSE, color = "darkred") +
  facet_wrap(~sample_id, scales = "free") +
  labs(x = "A组指标值", y = "B组指标值", title = "各样本对指标关联线性拟合图") +
  theme_bw()

场景2:对每个指标(锌、铁、镉…),检验该指标在所有对应样本对中的相关性

如果你的目标是针对单个指标(比如锌),检验所有A1-B1、A2-B2…配对样本的数值相关性(每个指标单独生成检验结果和可视化图),可以按以下操作:

步骤1:批量执行指标相关性检验

循环遍历每个指标,执行检验并整理结果:

library(broom)
library(dplyr)

# 定义需要检验的指标列表
indicators <- c("zinc", "iron", "cadmium")

# 循环执行检验,存储结果
indicator_cor_results <- lapply(indicators, function(ind) {
  test_res <- cor.test(conA[[ind]], conB[[ind]], method = "spearman", exact = FALSE)
  tidy(test_res) %>% mutate(indicator = ind)
}) %>% bind_rows()

# 查看结果
print(indicator_cor_results)

步骤2:绘制各指标的线性模型图

每个指标单独绘制配对样本的散点图+拟合线:

library(ggplot2)
library(tidyr)

# 转换数据为长格式用于绘图
plot_data <- conA %>%
  mutate(group = "A") %>%
  bind_rows(conB %>% mutate(group = "B")) %>%
  pivot_longer(-c(group, sample_id), names_to = "indicator", values_to = "value") %>%
  pivot_wider(names_from = group, values_from = value)

ggplot(plot_data, aes(x = A, y = B)) +
  geom_point(size = 2) +
  geom_smooth(method = "lm", se = TRUE, color = "darkblue") +
  facet_wrap(~indicator, scales = "free") +
  labs(x = "A组指标值", y = "B组指标值", title = "各指标对应样本关联线性拟合图") +
  theme_bw()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:15:10