R дает сбой, потому что brainGraph::efficiency()
пытается вычислить матрицу огромных и плотных расстояний, которая переполняет память моей машины (32 ГБ). Но я нашел решение, которое разбивает операцию на части и работает параллельно.
Глобальная эффективность - это среднее значение всех узловых эффективностей на графике. Узловая эффективность вершины i равна:
Мы можем последовательно рассчитать узловую эффективность для каждой вершины графа, которая разбивает вычисление матрицы расстояний на меньшие управляемые биты. Поскольку эффективность каждой вершины независима, мы можем распараллелить операцию, чтобы она не длилась вечно.
library(igraph)
library(doParallel)
# nodal efficiency function
get_eff <- function(i){return((1/(length(V(g)) - 1))*sum(1/distances(g, V(g)[i])[-i]))}
no_cores <- detectCores() - 1
cl <- makeCluster(no_cores)
registerDoParallel(cl)
result <- foreach(i = seq_along(V(g)), .combine = c, .packages = "igraph") %dopar% get_eff(i)
stopCluster(cl)
rm(cl)
global_eff <- mean(result)
Кроме того, мы можем построить график распределения узловой эффективности, а также глобальной (средней) эффективности, что дает нам лучшее понимание сети.
library(ggplot2)
data.frame(x = result) %>%
ggplot(aes(x)) +
geom_histogram() +
geom_vline(xintercept = mean(result), col = "red") # global efficiency
theme_minimal() +
labs(title = "Nodal efficiences", x = "", y = "Count")