У меня есть объект igraph mygraph
с ~ 10000 узлов и ~ 145 000 ребер, и мне нужно создать несколько подграфов с этого графика, но с разными размерами.
Мне нужно создать подграфы определенного размера (от 5 узлов до 500 узлов), где все узлы связаны на каждом подграфе. Мне нужно создать ~ 1000 подграфов для каждого размера (т.е. 1000 подграфов для размера 5, 1000 для размера 6 и т.д.), А затем вычислить некоторые значения для каждого графика в соответствии с различными атрибутами node.
У меня есть код, но для выполнения всех вычислений требуется много времени. Я думал использовать функцию graphlets
, чтобы получать разные размеры, но каждый раз, когда я запускаю ее на своем компьютере, она падает из-за проблем с памятью.
Вот код, который я использую:
Первым шагом было создать функцию для создания подграфов разного размера и выполнить необходимые вычисления.
random_network<-function(size,G){
score_fun<-function(g){
subsum <- sum(V(g)$weight*V(g)$RWRNodeweight)/sqrt(sum(V(g)$RWRNodeweight^2))
subsum
}
genes.idx <- V(G)$name
perm <- c()
while(length(perm)<1000){
seed<-sample(genes.idx,1)
while( length(seed)<size ){
tmp.neigh <- V(G)[unlist(neighborhood(G,1,seed))]$name
tmp.neigh <- setdiff(tmp.neigh, seed)
if( length(tmp.neigh)>0 )
seed<-c(seed,sample(tmp.neigh,1)) else break
}
if( length(seed)==size )
perm <- c(perm,score_fun(induced.subgraph(G,seed)))
}
perm
}
Второй шаг состоял в том, чтобы применить функцию к фактическому графу
### generate some example data
library(igraph)
my_graph <- erdos.renyi.game(10000, 0.0003)
V(my_graph)$name <- 1:vcount(my_graph)
V(my_graph)$weight <- rnorm(10000)
V(my_graph)$RWRNodeweight <- runif(10000, min=0, max=0.05)
### Run the code to get the subgraphs from different size and do calculations based on nodes
genesets.length<- seq(5:500)
genesets.length.null.dis <- list()
for(k in 5:max(genesets.length){
genesets.length.null.dis[[as.character(k)]] <- random_network(size=k,G=my_graph)
}