Использование тидиграфа для получения узлов и метрик на уровне графов для каждой группы

Я опробую тидиграф о сетях, основанных на различных экспериментальных методах, и мне больше всего интересно узнать метрики по всему графу и, возможно, также метрики на уровне узлов. Кажется, я не могу понять, как работает тидиограф.

Я использую R v3.5 и Tidygraph v1.1.

Мои данные структурированы таким образом:

dat <- data.frame(Treatment = rep(c("A","B"),each = 2),
                  from = c("sp1","sp2","sp1","sp2"),
                  to = c("sp2","sp3","sp3","sp3"),
                  weight = runif(4))

Если я хочу получить для каждой процедуры метрику по всему графику, такую ​​как диаметр, я бы соблазнился:

dat %>%
 as_tbl_graph() %>%
 activate(edges) %>%
 group_by(Treatment) %>%
 mutate(Diameter = graph_diameter(weights = weight))

Но я не уверен в результате, так как диаметры даны для каждого ребра, в то время как я ожидал бы одну меру на обработку (на график).

Точно так же, если я хочу получить некоторые метрики, такие как связность каждого узла для каждой обработки, это, кажется, не так просто, так как переменные обработки отбрасываются из таблицы узлов. Я пробовал различные способы взлома, такие как вставка идентификаторов процедур в столбцы from и to перед вызовом as_tbl_graph() следующим образом:

dat %>%
 mutate(from = paste(from, Treatment, sep = "_"),
       to = paste(to, Treatment, sep = "_")) %>%
 as_tbl_graph() %>%
 mutate(Treatment = substr(name, 5, 5), name = substr(name, 1, 3)) %>%
 group_by(Treatment) %>%
 mutate(Centrality = centrality_betweenness())

Но я получил ошибки, что полученные векторы были неправильного размера (6 вместо 3 или 1).

Есть ли способ с помощью тидиографа получить метрики на уровне группы и на уровне узла?

0 ответов

Я думаю, что это интересная проблема. Я пробовал несколько раз и до сих пор не нашел лучшего решения для этого. Но я подозреваю, что эта проблема нуждается morph() функция для того, чтобы правильно отделить график. Опять же, я не так много изучал. Но здесь я даю простое решение проблемы диаметра, используя morph() функция. Надеюсь, это поможет вам.

dat %>% 
 as_tbl_graph() %>%
 activate(edges) %>% 
 morph(to_split,split_by = "edges")%>% 
 filter(Treatment=="A") %>% 
 mutate(Diameter = graph_diameter(weights = weight)) %>% 
unmorph() %>% activate(edges) %>%  
morph(to_split,split_by = "edges") %>%
filter(Treatment=="B") %>%
mutate(Diameter = graph_diameter(weights = weight)) %>% 
unmorph()
Другие вопросы по тегам