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

在R中针对多组互作组数据执行Kolmogorov-Smirnov检验

分组执行Kolmogorov-Smirnov(KS)检验的适配方案

数据样例

# 数据框dput输出
eee <- structure(list(interactome = c("HINT-binary", "HINT-binary", 
"HINT-binary", "HINT-binary", "HINT-binary", "HINT-binary", "HINT-comp", 
"HINT-comp", "HINT-comp", "HINT-comp", "HINT-comp", "HINT-comp", 
"InBioMap", "InBioMap", "InBioMap", "InBioMap", "InBioMap", "InBioMap", 
"Menche-2015", "Menche-2015", "Menche-2015", "Menche-2015", "Menche-2015", 
"Menche-2015"), class = c("observed", "rewired", "rewired", "rewired", 
"rewired", "rewired", "observed", "rewired", "rewired", "rewired", 
"rewired", "rewired", "observed", "rewired", "rewired", "rewired", 
"rewired", "rewired", "observed", "rewired", "rewired", "rewired", 
"rewired", "rewired"), PPI = c(844L, 609L, 591L, 593L, 590L, 
608L, 1329L, 874L, 872L, 864L, 807L, 855L, 7077L, 5049L, 5051L, 
5025L, 4975L, 5014L, 2445L, 1673L, 1652L, 1716L, 1712L, 1683L
), LCC = c(290L, 191L, 188L, 214L, 183L, 215L, 401L, 346L, 365L, 
366L, 359L, 356L, 635L, 615L, 613L, 613L, 617L, 615L, 528L, 476L, 
493L, 490L, 492L, 480L)), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 
1002L, 1003L, 1004L, 1005L, 1006L, 1007L, 2003L, 2004L, 2005L, 
2006L, 2007L, 2008L, 3004L, 3005L, 3006L, 3007L, 3008L, 3009L
), class = "data.frame")

需求说明

需要按interactome的4个分组(HINT-binary、HINT-comp、InBioMap、Menche-2015)分别执行KS检验:每个组内,将observed对应的PPI/LCC值,与同组所有rewired的PPI/LCC分布做对比,对应文献中观察值vs随机化重连网络分布的检验逻辑。

文献中对应图的描述:

(D) 高可信度人类互作组(Menche等人,2015)中观察到的LC基因间的蛋白质-蛋白质相互作用(PPI)数量(虚线)与1000个随机化互作组网络(密度图),显示LC基因间的PPI相对于随机预期显著富集(p < 10⁻³)。(E) 高可信度人类互作组中LC基因间的最大连通组件(LCC)大小(虚线)与1000个随机化互作组网络(密度图),显示LC基因占据人类互作组的一个独特区域(p < 10⁻³)。(F) LC基因被疾病基因预测算法(Ghiassian等人,2015)优先排序(p < 10⁻¹⁵,Kolmogorov–Smirnov检验)。

代码实现方案

1. 按分组执行KS检验(针对PPI和LCC指标)

使用dplyr分组处理,每个组内提取观察值和重连样本的分布,执行双样本KS检验:

library(dplyr)

# 对PPI和LCC分别执行分组KS检验
ks_results <- eee %>%
  group_by(interactome) %>%
  summarize(
    # PPI指标的KS检验
    ks_ppi = list(ks.test(
      x = PPI[class == "observed"],
      y = PPI[class == "rewired"],
      alternative = "greater" # 对应文献中观察值富集(大于随机分布)的假设
    )),
    # LCC指标的KS检验
    ks_lcc = list(ks.test(
      x = LCC[class == "observed"],
      y = LCC[class == "rewired"],
      alternative = "greater"
    )),
    # 提取检验结果的关键信息
    pval_ppi = ks_ppi[[1]]$p.value,
    stat_ppi = ks_ppi[[1]]$statistic,
    pval_lcc = ks_lcc[[1]]$p.value,
    stat_lcc = ks_lcc[[1]]$statistic
  ) %>%
  ungroup()

# 查看结果
print(ks_results)

2. 复刻文献中的可视化(密度图+观察值虚线)

以Menche-2015组的PPI为例,生成类似的分布对比图:

library(ggplot2)

# 筛选Menche-2015组数据
menche_data <- eee %>% filter(interactome == "Menche-2015")
observed_ppi <- menche_data$PPI[menche_data$class == "observed"]

# 绘制密度图+观察值虚线
ggplot(menche_data %>% filter(class == "rewired"), aes(x = PPI)) +
  geom_density(fill = "lightblue", alpha = 0.5) +
  geom_vline(xintercept = observed_ppi, linetype = "dashed", color = "red", linewidth = 1) +
  labs(
    title = "Menche-2015互作组:观察值vs随机重连PPI分布",
    x = "PPI数量",
    y = "密度"
  ) +
  annotate("text", x = observed_ppi + 100, y = 0.002, 
           label = paste0("p = ", format(ks_results$pval_ppi[ks_results$interactome == "Menche-2015"], scientific = TRUE))) +
  theme_bw()

关键说明

  • alternative = "greater":因为文献中观察值显著高于随机分布(富集),所以设置单侧检验;如果你的假设是分布不同而非单向,可改为"two.sided"。
  • 你的样例中每个组的rewired样本只有5个,实际大数据集应该是1000个(如文献所述),样本量足够时KS检验的结果更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:10:34