2014-11-24 89 views
0

我想进行通路富集分析。 我有21个重要基因的列表,以及我想检查的多种类型的通路(即检查KEGG通路,GOterms,复合体等的富集)。解读R代码功能

我发现这个代码例子,在一个旧BIOC岗位。但是,我无法适应自己。

首先, 1这是什么意思?我不知道这个多重冒号语法。

hyperg <- Category:::.doHyperGInternal 

2 - 我不明白这条线是如何工作的。 hyperg.test是一个需要传递给它3个变量的函数,对吗?这是行不知何故通过“genes.by.pathways,significant.genes和all.geneIDs到THR hyperg.test?

,我想
pVals.by.pathway<-t(sapply(genes.by.pathway, hyperg.test, significant.genes, all.geneIDs)) 

代码以适应

library(KEGGREST) 
library(org.Hs.eg.db) 

    # created named list, length 449, eg: 
    # path:hsa00010: "Glycolysis/Gluconeogenesis" 

pathways <- keggList("pathway", "hsa") 

    # make them into KEGG-style human pathway identifiers 
human.pathways <- sub("path:", "", names(pathways)) 

    # for demonstration, just use the first ten pathways 

demo.pathway.ids <- head(human.pathways, 10) 
demo.pathways <- setNames(keggGet(demo.pathway.ids), demo.pathway.ids) 

genes.by.pathway <- lapply(demo.pathways, function(demo.pathway) { 
    demo.pathway$GENE[c(TRUE, FALSE)] 
     }) 

all.geneIDs <- keys(org.Hs.eg.db) 

    # chose one of these for demonstration. the first (a whole genome random 
    # set of 100 genes) has very little enrichment, the second, a random set 
    # from the pathways themselves, has very good enrichment in some pathways 

set.seed(123) 
significant.genes <- sample(all.geneIDs, size=100) 
#significant.genes <- sample(unique(unlist(genes.by.pathway)), size=10) 

    # the hypergeometric distribution is traditionally explained in terms of 
    # drawing a sample of balls from an urn containing black and white balls. 
    # to keep the arguments straight (in my mind at least), I use these terms 
    # here also 

hyperg <- Category:::.doHyperGInternal 
hyperg.test <- 
    function(pathway.genes, significant.genes, all.genes, over=TRUE) 
{ 
    white.balls.drawn <- length(intersect(significant.genes, pathway.genes)) 
    white.balls.in.urn <- length(pathway.genes) 
    total.balls.in.urn <- length(all.genes) 
    black.balls.in.urn <- total.balls.in.urn - white.balls.in.urn 
    balls.pulled.from.urn <- length(significant.genes) 
    hyperg(white.balls.in.urn, black.balls.in.urn, 
      balls.pulled.from.urn, white.balls.drawn, over) 
} 

pVals.by.pathway <- 
    t(sapply(genes.by.pathway, hyperg.test, significant.genes, all.geneIDs)) 

print(pVals.by.pathway) 
+1

是像您期望或代码行为不,你只是想只是更好地理解它?目前还不清楚你是否有问题或者只是想要信息。 – cdeterman 2014-11-24 13:43:19

+0

@cdeterman - 两个,我真的不明白,尤其是最后一行,这使得它很难改变它,我的“M收到此错误> pVals.by.pathway < - + T(sapply(基因。 by.pathway,hyperg.test,significant.genes,all.geneIDs)) FUN(X [[1L]],...的错误):找不到函数“hyperg” – user2814482 2014-11-24 13:54:37

回答

0

原因你是让你的错误是因为它似乎你没有Category包从Bioconductor的安装。我怀疑,因为三冒号操作:::了这一点。这种操作是非常相似的双冒号操作::。而与::您可以访问导出来自包的对象不加载它,:::允许访问非导出对象(在这种情况下函数从Category)。如果您安装了Category包,代码将无误地运行。

关于sapply声明:

pVals.by.pathway<-t(sapply(genes.by.pathway, hyperg.test, significant.genes, all.geneIDs)) 

您可以将其分为单独的部分去了解它。首先,sapply正在迭代gene.by.pathway的元素并将它们传递给hyperg.test的第一个参数。以下参数是两个附加参数。这是有点不清楚,我个人建议人们明确确定参数,以避免意外的惊喜,并避免需要完全相同的顺序。这是在这种情况下,有点重复,但一个很好的方式,以避免愚蠢的错误(比如把significant.genesall.geneIds后)

改写为:

pVals.by.pathway <- 
    t(sapply(genes.by.pathway, hyperg.test, significant.genes=significant.genes, all.genes=all.geneIDs)) 

一旦这个循环完成,sapply功能简化了输出到一个矩阵。但是,通过转置t,输出更加便于用户使用。

一般来说,试图了解复杂的apply报表时,我发现最好打散他们以更小的部分,看看对象本身的样子。

+0

谢谢,这有帮助,我不知道你可以通过这种方式将参数传递给函数 – user2814482 2014-11-24 14:26:08