字符向量和列表之间的R超几何测试,循环计算p值

R hypergeometric test between a character vector and a list, calculating p values in a loop

我正在尝试自己编写代码 运行 R 中的超几何测试 phyper

我有一个上调基因的特征向量:(或者这些是我从骨灰盒中取出的“红色”球)

gene.up <- c("A", "B", "C", "D")

我还有一个在我的实验中发现的所有基因的特征向量:(或者这些都是我从骨灰盒中取出的球——“白色”和“红色”)

gene.background <- c("A", "B", "C", "D", "E", "F")

我还有一个包含路径信息的字符列表:(或者每个“路径”都是我从我的骨灰盒中取出的球的子集,在这种情况下,我的骨灰盒有 5 个白球和 4 个红球)

gene.pathway.list <- list("pathwayA" = c("A", "F", "G"),
                          "pathwayB" = c("A", "B", "E", "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 和 rhs 元素的 lengths 不相同,因此较短的长度会循环并产生异常。相反,使用 %in%