Sampling von Subgraphen aus verschiedenen Größen mit igraph
Ich habe ein igraph Objektmygraph
mit ~ 10.000 Knoten und ~ 145.000 Kanten, und ich muss eine Reihe von Untergraphen aus diesem Diagramm erstellen, aber mit unterschiedlichen Größen. Was ich brauche, ist, Untergraphen von einer bestimmten Größe (von 5 Knoten bis 500 Knoten) zu erstellen, bei denen alle Knoten in jedem Untergraphen verbunden sind. Ich muss ~ 1000 Untergraphen für jede Größe erstellen (d. H. 1000 Untergraphen für Größe 5, 1000 für Größe 6 usw.) und dann einige Werte für jedes Diagramm anhand verschiedener Knotenattribute berechnen. Ich habe Code, aber es dauert lange, bis alle Berechnungen durchgeführt sind. Ich dachte bei der Verwendung dergraphlets
Funktion, um die verschiedenen Größen zu erhalten, aber jedes Mal, wenn ich es auf meinem Computer starte, stürzt es aufgrund von Speicherproblemen ab.
Hier ist der Code, den ich verwende:
er erste Schritt bestand darin, eine Funktion zu erstellen, mit der die Teilgraphen unterschiedlicher Größe erstellt und die erforderlichen Berechnungen durchgeführt werden könne
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
}
er zweite Schritt bestand darin, die Funktion auf den tatsächlichen Graphen anzuwende
### 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)
}