问题描述
我正在尝试自己编写代码以使用 phyper
在 R 中运行超几何测试。
我有一个上调基因的特征向量:(或者这些是我从骨灰盒中取出的“红色”球)
gene.up <- c("A","B","C","D")
我还有一个包含在我的实验中发现的所有基因的特征向量:(或者这些都是我从骨灰盒中取出的球——“白色”和“红色”)
gene.background <- c("A","D","E","F")
我还有一个包含路径信息的字符列表:(或者每个“路径”都是我从骨灰盒中取出的球的子集,在这种情况下,我的骨灰盒有 5 个白色球和 4 个红色球)
gene.pathway.list <- list("pathwayA" = c("A","F","G"),"pathwayB" = c("A","H"),"pathwayC" = c("D","G","I"))
现在我需要对 gene.pathway.list
中的每个路径运行超几何测试。所以我创建了一个空数据框来存储来自超几何测试的路径名称和 p 值,并创建了一个如下所示的测试循环。
df <- data.frame(pathway=character(length(gene.pathway.list)),pvalue=numeric(length(gene.pathway.list)))
for (i in c(1:length(gene.pathway.list))) {
df[i,1] <- names(gene.pathway.list[i])
df[i,2] <- phyper(sum(gene.pathway.list[[i]] == gene.up),length(gene.pathway.list[[i]]),length(unique(unlist(gene.pathway.list))) - length(gene.pathway.list[[i]]),length(gene.background))
}
然而,输出值没有任何意义——例如,我的 pathway C
的 p 值为零,但是如何将 "C"
和 "D"
拉出的可能性是零?我想弄清楚出了什么问题,我设置不正确的是什么?
解决方法
我们可以使用 %in%
而不是 ==
for (i in c(1:length(gene.pathway.list))) {
df[i,1] <- names(gene.pathway.list[i])
df[i,2] <- phyper(sum(gene.pathway.list[[i]] %in% gene.up),length(gene.pathway.list[[i]]),length(unique(unlist(gene.pathway.list))) - length(gene.pathway.list[[i]]),length(gene.background))
}
-输出
> df
pathway pvalue
1 pathwayA 0.1071429
2 pathwayB 0.2142857
3 pathwayC 0.1071429
==
是元素比较运算符。 lhs 和 length
元素的 rhs
不相同,因此较短的长度会回收并产生异常。相反,使用 %in%