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

问题描述

我正在尝试自己编写代码以使用 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%

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...