Построить направленный сетевой граф в R из набора данных - PullRequest
0 голосов
/ 28 февраля 2019

У меня проблемы с созданием ориентированного графа (с пакетом igraph) из моего набора данных (таблица данных из 10 столбцов) в R. Задача следующая: мне нужно построить ориентированный (сетевой) граф, гдеиндивидуальный X связан с индивидуальным Y, если X пригласил Y на платформу.В конечном итоге мне нужно определить размер самой длинной цепочки сети и рассчитать коэффициент кластеризации.

После фильтрации моего dt dt.user состоит из следующих 2 столбцов: user_id, inviter_id.

user_id: user identification
inviter_id: id of the user that invited this user to the platform

После очистки данных (удаления всех значений NA) я пытаюсь сделать эту работу, но я не уверен, что делаю это правильно, так как мой коэффициент кластеризации равен 0 (что кажетсяочень маловероятно):

all.users <- dt.users[, list(inviter_id, user_id)]

g.invites.network <- graph.data.frame(all.users, directed = TRUE)

Я пытался переключить направление соединений, но я все еще получаю те же результаты с точки зрения диаметра и коэффициента кластеризации:

all.users <- dt.users[, list(user_id, inviter_id)]

Мой вопрос: мой ориентированный граф неверен?Если так, что я делаю не так?Я считаю, что мой ответ неверен из-за коэффициента кластеризации, равного 0. Мне кажется очень маловероятным, что в этой сети вообще не образуется кластер.И я должен оставить ...list(inviter_id), user_id вместо ...list(user_id, inviter_id)?

Пример данных (40 строк):

dt.users <- data.table::data.table(
  inviter_id = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 23L, 22L, 31L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 63L, 4L, 4L, 4L), 
  user_id = c(17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 25L, 26L, 32L, 35L, 36L, 37L, 38L, 39L, 40L, 41L, 42L, 43L, 44L, 45L, 46L, 47L, 49L, 50L, 51L, 52L, 53L, 54L, 55L, 56L, 58L, 59L, 60L, 64L, 71L, 75L, 76L, 78L)
)

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 01 марта 2019

По крайней мере, для ваших образцов данных 0 - правильный ответ, и я подозреваю, что это всегда будет верно для вашего полного набора данных из-за способа его построения.

Я предполагаю, что когда вы говорите, что вы вычисляете "коэффициент кластеризации", вы вычисляете transitivity(g.invites.network), который дает ноль в качестве ответа.Согласно документации:

Это просто соотношение треугольников и связанных троек на графике.Для ориентированного графа направление ребер игнорируется.

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

Это очевидно на графике ваших выборочных данных.

plot(g.invites.network)

Network with no triangles

Сложение на основе комментариев
Существует два вида диаметра для вычисления - направленный и ненаправленный.Для ваших примеров данных направленный диаметр равен 2, а ненаправленный диаметр равен 4.

diameter(g.invites.network)
[1] 2
diameter(g.invites.network, directed=FALSE)
[1] 4

Вы можете получить вершины, составляющие эти пути, используя get_diameter

get_diameter(g.invites.network)
+ 3/43 vertices, named:
[1] 4  23 25
get_diameter(g.invites.network, directed=FALSE)
+ 5/43 vertices, named:
[1] 25 23 4  22 26

.Подмножество графика, чтобы получить представление о диаметрах, вы можете использовать induced_subgraph.Например, чтобы получить только эти узлы:

DiamPath =  get_diameter(g.invites.network, directed=FALSE)
DiameterGraph = induced_subgraph(g.invites.network, DiamPath)
plot(DiameterGraph)

Just the diameter vertices

Или, возможно, вы хотите посмотреть на диаметр в контексте, вы можете покрасить диаметрвершины по разному.

DiamPath =  get_diameter(g.invites.network, directed=FALSE)
VC = rep("orange", vcount(g.invites.network))
VC[DiamPath] = "red"
plot(g.invites.network, vertex.color=VC)

Diameter within the full graph

...