2017-01-18 6 views
0

Мне интересно, как вычислить некоторые показатели для каждого узла.igraph вычислить показатели для каждого узла и его сети

Для каждого вычислительного узла процента от мошеннических соединений для

  • прямого узла (направленный)
  • прямого узлом (неориентированного)
  • сети дружбы от узла (направленного)
  • дружбы сеть с узла (неориентированный)

    всего и каждого типа отношений.

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

Минимальный образец здесь

library(igraph) 
id = c("a", "b", "c", "d", "e", "f", "g") 
name = c("Alice", "Bob", "Charlie", "David", "Esther", "Fanny", "Gaby") 
fraud = c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE) 
verticeData <- data.frame(id, name, fraud) 
verticeData 

src <- c("a", "b", "c", "f", "e", "e", "d", "a") 
dst <- c("b", "c", "b", "c", "f", "d", "a", "e") 
relationship <-c("A", "B", "B", "B", "B", "A", "A", "A") 
edgeData <- data.frame(src, dst, relationship) 
edgeData 
g <- graph_from_data_frame(edgeData, directed = TRUE, vertices = verticeData) 
plot(g, vertex.color=V(g)$fraud) 
# TODO compute metrics 

У меня нет привилегий для перемещения, так буду делать вручную на основе комментария от https://stats.stackexchange.com/questions/256859/igraph-compute-metrics-for-each-node-and-its-network

ответ

2

gapply функции от sna пакета дает большую гибкость для расчета различные статистические данные эго. Он функционирует более или менее, как семейство функций apply, но, в частности, петли по сетевым окружениям. Пакет intergraph позволяет легко конвертировать между igraph и sna.

library(sna) 
net<-intergraph::asNetwork(g) 
c <- c(1,2) 
funcs <- c(sum,mean) 
for (i in funcs){ 
    for (j in list(1,2,c)){ 
    print(gapply(net,j,net %v% "fraud",i)) 
    } 
} 

gapply не супер прямолинейный для использования. Второй аргумент («MARGIN») указывает на строковые (исходящие связи), по столбцам (входящие связи) или на оба (то есть ненаправленные). Третий аргумент - это вектор статистики для вычисления, а четвертый аргумент - это функция, которую вы хотите использовать. Как вы можете, в третьем и четвертом аргументах существует большая гибкость.

> gapply(net,c(1,2),net %v% "fraud",sum) 
[1] 0 1 0 1 1 0 0 
> gapply(net,c(1),net %v% "fraud",sum) 
    Alice  Bob Charlie David Esther Fanny Gaby 
     0  0  0  1  0  0  0 
> gapply(net,c(2),net %v% "fraud",sum) 
    Alice  Bob Charlie David Esther Fanny Gaby 
     0  1  0  0  1  0  0 
+0

Я вижу, так что я бы нужен 1 пропуск, чтобы получить число в, один для полустепени один для степеней каждого узла, а затем 2 больше (1x для «уровня мошенничества» на узел и 1x для дружеские сети, мошеннические подключения). Разве это не много проходов над графиком? есть ли возможность их комбинировать? –

+1

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

+0

Вы думаете, что графические ядра могут быть лучше подходят для решения этой проблемы? –