Ускорение для вложенного цикла с использованием функции применения - PullRequest
0 голосов
/ 28 апреля 2019

Я плохо умею использовать семейство функций apply.

Я хочу использовать семейство apply вместо следующего типа вложенного цикла, повторяемого в 9076 x 9076 раз для ускорения вычислений. Минимальные воспроизводимые данные приведены ниже. Пожалуйста, помогите.

Данные:

data = structure(list(C1 = structure(c(3L, 4L, 2L, 5L, 1L), .Label = c("GO:0001525", 
"GO:0001869", "GO:0002576", "GO:0003723", "GO:0005515"), class = "factor"), 
    C2 = structure(c(2L, 3L, 1L, 4L, 5L), .Label = c("GO:0002020", 
    "GO:0003674", "GO:0003727", "GO:0005515", "GO:0005829"), class = "factor"), 
    C3 = structure(c(3L, 1L, 2L, 1L, 4L), .Label = c("", "GO:0002020", 
    "GO:0005576", "GO:0005886"), class = "factor"), C4 = structure(c(1L, 
    1L, 2L, 3L, 4L), .Label = c("", "GO:0002576", "GO:0005737", 
    "GO:0008201"), class = "factor")), class = "data.frame", row.names = c("A1BG", 
"A1CF", "A2M", "AAGAB", "AAMP"))

Код:

if (!requireNamespace("BiocManager", quietly = TRUE))
install.packages("BiocManager")
BiocManager::install("GO.db", version = "3.8")
BiocManager::install("GOSemSim", version = "3.8")
BiocManager::install("org.Hs.eg.db", version = "3.8")
BiocManager::install("annotate", version = "3.8")

install.packages("cluster")
install.packages("RUnit")

# download csbl.go_1.4.1.tar.gz from http://csbi.ltdk.helsinki.fi/csbl.go/

# R CMD INSTALL csbl.go_1.4.1.tar.gz

library(org.Hs.eg.db)
library(GO.db)
library(GOSemSim)


mat=matrix(,5,5)  %actual mat=matrix(,9076,9076)
hsGO <- godata('org.Hs.eg.db', ont="MF")

for (i in 1:5) %actual for(i in 1:9076)
{
for (j in 1:5) %actual for(j in 1:9076)
{
   a=as.matrix(data[i,1:ncol(data)])
   b=as.matrix(data[j,1:ncol(data)])
   a=a[a!=""]
   b=b[b!=""]
   mat[i,j]=mgoSim(a,b, semData=hsGO, measure="Wang", combine="BMA")
  }
  print(paste("ith Iteration: ",i))
}

Здесь я хочу выполнить функцию mgoSim, используя семейство функций apply для ускорения вычислений, используя 9076 x 9076, вложенный в цикл, я не получаю результат.

Заранее спасибо ...

1 Ответ

2 голосов
/ 29 апреля 2019

Я один из авторов GOSemSim (мой вклад заключался в ускорении процесса внутреннего кода).

Если я понял ваш код, вы хотите сравнить функциональность ваших генов в молекулярной функцииsubontology.

Вам нужен вектор генов или терминов GO для сравнения, я также использовал функцию mgeneSim для сравнения генов вместо того, чтобы самостоятельно сравнивать термины GO.(Если вы хотите сравнить термины го, это тоже можно сделать

genes <- rownames(data)
genes_entrez <- mapIds(org.Hs.eg.db, keys = genes, keytype = "SYMBOL", column = "ENTREZID")
m <- mgeneSim(g,  semData=hsGO, measure="Wang", combine="BMA")
colnames(m) <- rownames(data)
colnames(m) <- rownames(data)
       A1BG  A1CF   A2M AAGAB  AAMP
A1BG  1.000 0.477 0.477 0.477 0.383
A1CF  0.477 1.000 0.625 1.000 0.501
A2M   0.477 0.625 1.000 1.000 0.526
AAGAB 0.477 1.000 1.000 1.000 0.815
AAMP  0.383 0.501 0.526 0.815 1.000

Я наткнулся на этот вопрос с помощью biostars, но вы можете получить лучший вопрос либо в support.bioconductor.org или в bioinformatics.stackexchange.com .


Если вы хотите сравнить условия GO для каждой строки, вы можете сделать это:

go_terms <- unique(unlist(data))
go_terms <- go_terms[go_terms != ""]
go_sim <- mgoSim(as.character(go_terms), as.character(go_terms),  semData=hsGO, measure="Wang", combine=NULL)
genes2go <- apply(data, 1, function(x){x[x != ""]})

ТогдаВы можете перейти к genes2go и использовать combineScore для сравнения строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...