在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
相关产品推荐
相关产品推荐

