Enriquecimento GO (topGO): principalmente para montagens de novo - lmigueel/Bioinformatica GitHub Wiki

1. Sobre

O pacote topGO fornece ferramentas para testar os termos GO enquanto leva em consideração a topologia do gráfico GO. Diferentes estatísticas de teste e diferentes métodos para eliminar semelhanças e dependências locais entre os termos GO podem ser implementados e aplicados.

Uma das principais vantagens do topGO é a estrutura de teste de conjunto de genes unificado que oferece. Além de fornecer um conjunto de funções fáceis de usar para realizar a análise de enriquecimento GO, também permite ao usuário implementar facilmente novos testes estatísticos ou novos algoritmos que lidam com a estrutura gráfica do GO. Este framework unificado também facilita a comparação entre diferentes metodologias de enriquecimento GO. Há uma série de estatísticas de teste e algoritmos lidando com o grafo GO estruturado pronto para usar no topGO. A Tabela 1 apresenta a tabela de compatibilidade entre as estatísticas do teste e os métodos do gráfico GO.

Tabela 1. Algoritmos suportados pelo GO

algol fisher ks t globaltest sum
classic
elim
weight - - - -
weight01
lea
parentchild - - - -

Os algoritmos de elim e weight foram introduzidos em Alexa et al. (2006). O algoritmo padrão usado pelo pacote topGO é uma mistura entre os algoritmos elim e weight e será referido como weight01. O algoritmo parentchild foi introduzido por Grossmann et al. (2007).

Usaremos principalmente o teste exato de Fisher, que é baseado na contagem de genes.

2. Instalação

if (!requireNamespace("BiocManager", quietly = TRUE))
    install.packages("BiocManager")

BiocManager::install("topGO")

Acesse o MANUAL AQUI.

3. Exemplos

O script abaixo está completo. Ele fornece todas as métricas de corte (que possuem um p-valor associado), mas também a lista de genes presentes por processo GO, algo que originalmente não vem no script base. Eu tive que executar este procedimento pela necessidade e trago à vocês.

Eu utilizou muito o topGo após realizar uma montagem de novo e realizar uma anotação GO com o Pannzer2. Acesse sua anotação AQUI.

Você precisa de três arquivos:

  1. universeFile : arquivo contendo todos os genes do organismo e o GO associado a cada gene. Ele está no formado gene GO GO GO. Você pode fazer um script que percorre o arquivo output GO.out do Pannzer2 e montar esse arquivo. Como, por exemplo:
TRINITY_DN2789_c0_g1_i4 GO:0055085      GO:0006810      
TRINITY_DN28613_c1_g1_i2        GO:0042744      GO:0042743      GO:0072593 
TRINITY_DN8344_c2_g1_i3 GO:0097502      GO:0070085
...
  1. interestingGenesFile: lista de genes de interesse que você deseja saber quais processos GO estão enriquecidos

  2. output_file: arquivo de saída

Como exemplo, os arquivos (1), (2) e (3) possuem nomes isoforma_GO.txt, transcritos_diferenciais.txt e resultado_topGO.txt, respectivamente. Segue o script abaixo com os passos descritos.

Você pode trocar as primeiras linhas por:

args <- commandArgs(trailingOnly = TRUE)
universeFile = args[1]
interestingGenesFile = args[2]
output_file = args[3]

sendo possível rodar em linha de comando: Rscript topGO.R isoforma_GO.txt transcritos_diferenciais.txt resultado_topGO.txt .

Saliento que o dataset final "AllRes_final" possui todos os p-values calculados, mas irei utilizar como corte o teste de estrutura pelo weight01 + fisher, pela preferência na Tabela 1.

# topGO.R
# eg. run:
# Rscript topGO.R annotations.txt interestinggenes.txt output_file

#args <- commandArgs(trailingOnly = TRUE)
universeFile = "isoforma_GO.txt"
interestingGenesFile = "transcritos_diferenciais.txt"
output_file = "resultado_topGO.txt"

# load topGO
library("topGO")

# read in the 'gene universe' file
geneID2GO <- readMappings(file = universeFile)
geneUniverse <- names(geneID2GO)

# read in the genes of interest
genesOfInterest <- read.table(interestingGenesFile,header=FALSE)
genesOfInterest <- as.character(genesOfInterest$V1)
geneList <- factor(as.integer(geneUniverse %in% genesOfInterest))
names(geneList) <- geneUniverse

# build the GOdata object in topGO
myGOdata <- new("topGOdata", description="My project", ontology="BP", allGenes=geneList,  annot = annFUN.gene2GO, gene2GO = geneID2GO)

# run the Fisher's exact tests
resultClassic <- runTest(myGOdata, algorithm="classic", statistic="fisher")
resultElim <- runTest(myGOdata, algorithm="elim", statistic="fisher")
resultTopgo <- runTest(myGOdata, algorithm="weight01", statistic="fisher")
resultParentchild <- runTest(myGOdata, algorithm="parentchild", statistic="fisher")

# Eu gosto do weight01 + fisher. Vou cortar nele.

# see how many results we get where weight01 gives a P-value <= 0.001:
mysummary <- summary(attributes(resultTopgo)$score <= 0.001)
numsignif <- as.integer(mysummary[3](/lmigueel/Bioinformatica/wiki/3)) # how many terms is it true that P <= 0.001

# print out the top 'numsignif' results:
allRes <- GenTable(myGOdata, classicFisher = resultClassic, elimFisher = resultElim, topgoFisher = resultTopgo, parentchildFisher = resultParentchild, orderBy = "topgoFisher", ranksOf = "classicFisher", topNodes = numsignif)

# print a graph (to a pdf file) with the top 'numsignif' results:
output_file2 = paste(output_file,"Topgo", sep="_")
#printGraph(myGOdata, resultTopgo, firstSigNodes = numsignif, fn.prefix = output_file2, useInfo = "all", pdfSW = TRUE)

# print out the genes that are annotated with the significantly enriched GO terms:
myterms <- allRes$GO.ID
mygenes <- genesInTerm(myGOdata, myterms)

AllRes_final <- allRes
res <- NULL

for (i in 1:length(myterms)){
  myterm <- myterms[i]
  mygenesforterm <- mygenes[myterm][1](/lmigueel/Bioinformatica/wiki/1)
  myfactor <- mygenesforterm %in% genesOfInterest # find the genes that are in the list of genes of interest
  mygenesforterm2 <- mygenesforterm[myfactor == TRUE]
  mygenesforterm2 <- paste(mygenesforterm2, collapse=',')
  #print(paste("Term",myterm,"genes:",mygenesforterm2))
  res[i] <- mygenesforterm2
}

AllRes_final$genes <- res
write.table(AllRes_final,file= output_file,sep="\t")

Citação

Alexa A, Rahnenfuhrer J (2020). topGO: Enrichment Analysis for Gene Ontology. R package version 2.42.0.

Alexa, A., Rahnenf ̈uhrer, J., and Lengauer, T. (2006). Improved scoring of functional groups from geneexpression data by decorrelating go graph structure.Bioinformatics (Oxford, England), 22:1600–1607.10.1093/bioinformatics/btl140.

Grossmann, S., Bauer, S., Robinson, P. N., and Vingron, M. (2007). Improved detection of overrepresentationof gene-ontology annotations with parent child analysis.Bioinformatics, 23:3024. 10.1093/bioinformat-ics/btm440.

https://www.bioconductor.org/packages/devel/bioc/vignettes/topGO/inst/doc/topGO.pdf