Тест перестановки на графах - igraph - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь вычислить тест перестановки индекса E-I, чтобы оценить гомофильность сети и измерить значимость индекса E-I. Однако, используя функцию permute () для создания нового графа, переставляя идентификаторы вершин, сеть будет переставлять, но при выполнении индекса E-I это всегда дает мне один и тот же результат 0,25. Так что-то не так с функцией перестановки?

actors <- data.frame(name=c("Alice", "Bob", "Cecil", "David",
                            "Esmeralda", "Ben", "Fritz", "Jon", "Anna",
                            "Julia"),
                     age=c(48,33,45,34,21, 12,33,44,66,99),
                     gender=c("F","M","F","M","F", "F","M","F","M","F"))

relations <- data.frame(from=c("Bob", "Cecil", "Cecil", "David",
                               "David", "Esmeralda",  "Cecil", "David",
                               "Esmeralda", "Jon", "Anna",
                               "Julia", "Bob", "Cecil", "Cecil", "David"),
                        to=c("Alice", "Bob", "David", "Esmeralda",  "Cecil", "David", "Alice", "Alice", "Bob", "Alice", "Fritz", "Jon", "Anna", "Alice", "Bob", "Cecil"),
                        same.dept=c(FALSE,FALSE,TRUE,FALSE,FALSE,TRUE, TRUE,FALSE,FALSE,TRUE,FALSE,FALSE, FALSE,TRUE,FALSE,FALSE),
                        friendship=c(4,5,5,2,1,1,1,3,5,7,9,1, 7,8,2,4), advice=c(4,5,5,4,2,3,1,5,7,8,2,4, 7,8,2,4))
g <- graph.data.frame(relations, directed=TRUE, vertices=actors)


V(g)$name <- as.character(vertex_attr(g, "gender"))
edges <- get.data.frame(g)

external <- length(which(edges$from != edges$to))

internal <- length(which(edges$from == edges$to))

ei_index = (external - internal) / nrow(edges)

new.graph <- permute(g, sample(vcount(g)))

1 Ответ

0 голосов
/ 03 октября 2018

Документация igraph гласит: permute keeps all graph, vertex and edge attributes of the graph. Это означает, что вы просто меняете порядок списка узлов. Ниже приведен пример отличия списков вершин, но списки ребер остаются прежними.

permute

Будет ли работать такая функция, как rewire?

ei_index <- function(g){
  edges <- get.data.frame(g)

  external <- length(which(edges$from != edges$to))

  internal <- length(which(edges$from == edges$to))

  ei_index = (external - internal) / nrow(edges)
  ei_index
}

set.seed(4321)
sapply(1:20, function(x){
  temp_g <- rewire(g, each_edge(p = 1, loops = F))
  ei_index(temp_g)
})

rewired

...