字符向量和列表之间的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
元素的 length
s 不相同,因此较短的长度会循环并产生异常。相反,使用 %in%
我正在尝试自己编写代码 运行 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
元素的 length
s 不相同,因此较短的长度会循环并产生异常。相反,使用 %in%