Я хочу сделать то же самое, что просили здесь, используя первый подход из вопроса.
К сожалению, переменная mods
из следующей строки не определена, и я спрашиваю себя, как ее настроить:
g2 <- delete.edges(out, wc$removed.edges[seq(length = which.max(mods) - 1)])
Однако я думаю, что функция edge.betweenness.community
устарела, и используемая мной более новая версия настроена следующим образом:
wc <- cluster_edge_betweenness(out, weights = (E(out)$value, directed = FALSE, bridges = TRUE, membership = TRUE, modularity = TRUE)
Однако мне сложно настроить функцию delete.edge
–
первый вызов удаляет слишком много ребер, а второй — слишком мало:
out2 <- delete.edges(out, wc$removed.edges[seq(length = which.max(wc$modularity))])
out2 <- delete.edges(out, wc$removed.edges[which.max(wc$modularity)])
Для полноты картины добавляю данные из процитированного вопроса:
from to value sourceID targetID
1 74 80 0.2829 255609 262854
2 74 61 0.2880 255609 179585
3 80 1085 0.2997 262854 3055482
4 1045 1046 0.1842 2970629 2971615
5 1046 1085 0.2963 2971615 3055482
6 1046 1154 0.2714 2971615 3087803
7 1085 1154 0.2577 3055482 3087803
8 1085 1187 0.2850 3055482 3101131
9 1085 1209 0.2850 3055482 3110186
10 1154 1243 0.2577 3087803 3130848
11 1154 1187 0.2305 3087803 3101131
12 1154 1209 0.2305 3087803 3110186
13 1154 1244 0.2577 3087803 3131379
14 1243 1187 0.1488 3130848 3101131
15 1243 1209 0.1488 3130848 3110186
16 1243 1244 0.1215 3130848 3131379
17 1243 1281 0.2997 3130848 3255811
Вместо delete.edges
я думаю, вы можете использовать disjoint_union
+ induced_subgraph
, как показано ниже.
g <- graph_from_data_frame(df)
ceb <- cluster_edge_betweenness(g)
out <- do.call(
disjoint_union,
lapply(groups(ceb), \(x) induced_subgraph(g, x))
)
и сюжеты выглядят так
par(mfrow = c(2, 1))
plot(ceb, g, main = "Edge betweenness")
plot(cluster_edge_betweenness(out), out, main = "Disjoint union")
@Sulz, не могли бы вы привести пример того, что вы хотите изменить в больших сообществах?
Я беру вопрос обратно, думаю, я нашел решение, которое использует ваш ответ, но сначала разделяет сеть на части, а затем использует ваш подход к коду:ceb <- кластер_edge_betweenness(name_graph, Directed = FALSE, Weights = (E( name_graph)$similarity+1)*10) all_communities <- igraph::groups(ceb) big_communities <- Filter(function(x) length(x) > 20, all_communities) small_communities <- Filter(function(x) length(x) ) <= 20, all_communities), а затем запустите свой код только в больших сообществах (lapply(large_communities, ваш код, затем присоедините bakc к другим
@Sulz, кажется, ты решил проблему, отлично!
Большое спасибо за вашу помощь. Мои исходные данные намного больше (6710 узлов/7921 ребро), и я немного удивлен, что только 4 ребра были удалены (которые разделяют некоторые из моих крупнейших сообществ, но некоторые большие сообщества все еще существуют). Тем не менее, я спрашиваю себя, возможно ли настроить так, чтобы код работал только в больших сообществах (скажем, N>15), а затем снова присоединялся к исходной сети?