Як обчислити заходи централізації в 4-мільйонній крайовій мережі за допомогою R?


9

У мене є файл CSV з 4 мільйонами країв спрямованої мережі, яка представляє людей, що спілкуються один з одним (наприклад, Джон надсилає повідомлення Марії, Мері надсилає повідомлення Енн, Джон надсилає ще одне повідомлення Марії тощо). Я хотів би зробити дві речі:

  1. Знайдіть ступінь, приналежність та (можливо) міри центральності власного вектора для кожної людини.

  2. Отримати візуалізацію мережі.

Я хотів би зробити це в командному рядку на сервері Linux, оскільки мій ноутбук не має великої потужності. У мене на цьому сервері та бібліотеці statnet встановлено R. Я знайшов цю посаду в 2009 році хтось більш компетентний, ніж я, який намагався зробити те ж саме і маючи проблеми з цим. Тож мені було цікаво, чи хтось ще має вказівки, як це зробити, бажано, роблячи мене крок за кроком, оскільки я знаю лише, як завантажити файл CSV та більше нічого.

Просто для того, щоб дати вам уявлення, ось як виглядає мій файл CSV:

$ head comments.csv
    "src","dest"
    "6493","139"
    "406705","369798"
$ wc -l comments.csv 
4210369 comments.csv

для деяких із цих заходів залежно від того, чи може R це обробляти, чи примітка, залежатиме від кількості окремих людей (вузлів) у мережі. R не обов'язково може бути найкращим інструментом для обчислювальних аспектів. Є хлопець з прізвищем Лесковець, який раніше був у Карнегі Меллон --- Я думаю, як студент ---, що робив багато матеріалів із описовою статистикою на великих графах. Існує багато утиліт, щоб "візуалізувати" графіки, але в основному я виявив, що їх досить важко інтерпретувати або не мають сенсу. Графік тільки розподілів ступенів може бути першим початком.
кардинал

Навіть складання 4 мільйонів балів може зайняти деякий час
Wok

@wok, нах. Шматок пирога на комп’ютерах сьогодні. У будь-якому випадку, ви завжди можете перейти до PNG, і це, ймовірно, буде досить добре для розподілу ступеня. Графік ОП насправді не настільки великий.
кардинал

Відповіді:


7

У вас є список ребер, який можна перетворити на мережевий об'єкт за допомогою мережевої бібліотеки. Ось приклад використання фіктивних даних.

library(network)

src <- c("A", "B", "C", "D", "E", "B", "A", "F")
dst <- c("B", "E", "A", "B", "B", "A", "F", "A")

edges <- cbind(src, dst)
Net <- as.network(edges, matrix.type = "edgelist")

summary(Net)
plot(Net)

Однак на застереження є: у вас дуже велика мережа, і я не впевнений, що сюжет буде таким інформативним. Це, мабуть, буде схоже на велику кулю пряжі. Я також не впевнений, наскільки добре ці бібліотеки справляються з такими великими наборами даних. Я пропоную вам ознайомитись з документацією для мережевих, статнет та ергм-бібліотек. Журнал статистичного програмного забезпечення (V24 / 3) пропонує кілька статей , що охоплюють ці бібліотеки. Проблему можна знайти тут:

http://www.jstatsoft.org/v24


1
Я тьмяно пам’ятаю карту світу мережі facebook, яка була зроблена в Р. Думаю, автор детально описав свій процес у своєму блозі. Я вважаю, що використання цього підходу дозволить створити карту, яка є інформативною навіть із 4 мільйонами вузлів.
заборгували Йессен

Перепрошую за наївне запитання, але як я можу перетворити таблицю в те , що у вас є , як srcі dst. Це те, що я зазвичай роблю для завантаження файлу (тепер файл з обмеженими вкладками): el <- read.csv("comment-net/comments-ouids.tsv",header=T,sep="\t")
amh

read.csv () повинен створити фрейм data.frame. as.network () може прочитати це безпосередньо або вам може знадобитися зробити as.matrix (el).
Джейсон Морган

Я досить скептично ставився до того, що ці бібліотеки здатні зробити багато з графіком мільйонів вузлів. Ви фактично використовували їх із порівнянними наборами даних?
Сабольч

Плакат мав на увазі мережу з 4 мільйонами ребер , а не вузлами. Я використав statnetсімейство бібліотек у ненаправленій мережі понад 3500 вузлів (~ 8 мільйонів можливих країв). Це було цілком реально, особливо коли метою було лише обчислити мережеву статистику. Я навіть оцінив ERGM в мережах такого розміру. Але ваша думка добре прийнята; Сумніваюсь, що мережі мільйонів вузлів можна було легко проаналізувати.
Джейсон Морган

3

Я не думаю, що R - це перший вибір (можливо, я помиляюся). Тут вам знадобляться величезні масиви для індексації та підготовки мережевих файлів у відповідному форматі даних. Перш за все, я спробую використовувати бібліотеку Юре (Роб згадує його у публікації вище) SNAP- бібліотеку; це написано на C ++ і дуже добре працює у великих мережах.


Дякуємо, що згадали про SNAP. Я дивлюся в це. Ви його використовували? Зразок центральності, який постачається разом із цим, здається близьким до того, що я хочу. Я спробував змінити його, щоб він працював з моїми багатонаправленими даними графіків, але його не вдалося зібрати. Я не впевнений, чи доречно поставити питання про це тут, тому я можу створити новий Q.
amh

1
@andresmh, ви можете спробувати зменшити свій графік, щоб спочатку було одне спостереження на кожну спрямовану пару. Для власних значень ваші дані, ймовірно, аналогічні або еквівалентні зваженій випадковій прогулянці на графіку. Я не впевнений, чи SNAP це підтримує, але це, ймовірно, буде. Якщо все інше не вдасться, ви можете надіслати Юре дуже специфічний електронний лист. Він дуже приємний хлопець, тому я не здивуюсь, якби він дав коротке керівництво.
кардинал

@cardinal: Я знайшов зразок коду в SNAP, який робить саме те, що я хочу, але для непрямої графіки. Я думаю, що мій графік - це те, що документи SNAP називають "спрямованим багатографом". Тож я змінив лише один рядок centrality.cppз TUNGraphна TNEGraph(див. Pastebin.com/GHUquJvT рядок 24). Це вже не збирається. Я підозрюю, що для цього потрібен інший тип вузла? Я отримую помилку: centrality.cpp:24: error: conversion from ‘TUNGraph::TNodeI’ to non-scalar type ‘TNEGraph::TNodeI’ requested(див. Повну помилку на pastebin.com/86mCbByG )
amh

3

Gephi ( http://gephi.org/ ) може бути простим способом вивчення даних. Ви майже напевно можете візуалізувати його та виконати деякі обчислення (хоча я не користувався ним деякий час, тому не можу запам'ятати всі функції).


3

З минулого досвіду роботи з мережею у 7 мільйонів вузлів, я думаю, що візуалізація вашої повної мережі дасть вам зображення, яке не можна зрозуміти. Я можу запропонувати різні візуалізації з використанням підмножини ваших даних, наприклад просто використання перших 10 вузлів з найбільш вхідними або вихідними посиланнями. Я є другою пропозицією селеніуму щодо використання гефі.


@andresmh, Maslov і Sneppen ( Science , 2002) мають візуалізацію, яка може бути корисною в цьому контексті. Шукаючи останні статистичні дані / цитати, пов’язані з наукою, цитати цього твору, я виявив це також. Тут може бути ще одна пов’язана робота.
кардинал

1

Якщо ви переймаєтесь розміром мережі, ви можете спробувати igraphпакет у R. І якщо це погано працює в R, це може бути краще, ніж модуль Python. Або навіть networkxпакет для Python


1

Ви підозрюєте, що в мережі є невелика кількість дуже великих підключених компонентів? Якщо ні, ви можете розкласти його на окремі компоненти, що полегшить обчислення заходів центральності.


+1 до цього - якщо це повністю пов'язаний компонент, це одне, але якщо ви можете розкласти мережу, у вас є як менші дані, так і фактично кілька незалежних мереж, які можна аналізувати паралельно.
Фоміт

1

Є кілька програмних пакетів R, якими можна скористатися, включаючи "sna" та "network". Одна річ, на яку я не обов'язково покладаюся, якщо у вас виникають проблеми з продуктивністю sna, є NetworkX. Я люблю NetworkX до смерті і використовую його для більшості мого аналізу, але NetworkX дуже пишається тим, що це здебільшого суто пітонічна реалізація. Він особливо добре не використовує швидкий заздалегідь складений код, і часто він значно випереджає NetworkX за значних запасів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.