Основная СНС в R? - Как загрузить сетевые данные

Несколько лет назад я использовал UCINET для анализа социальной сети. В эти дни я хотел бы снова использовать SNA - но на этот раз я предпочитаю унифицированную структуру анализа - для меня это R.

Я просмотрел документацию по sna и statnet, но немного перегружен.

Что я хотел бы сделать: во-первых: загрузить матрицу двудольных / заболеваемости, взятую непосредственно, например, из веб-опроса (часто оцениваемого). Преобразуйте эту матрицу в две матрицы смежности "(присоединение по принадлежности и случаи по случаям). Это также может быть направленная, оцененная шкала случаев.

Второе: загрузить файл (также, например, из данных веб-опроса) атрибутов вершины.

В-третьих: Затем постройте график, например, с размером вершины в соответствии с некоторой мерой центральности, раскрашенный и помеченный некоторыми атрибутами вершины, с нарисованными только ребрами со значением, превышающим определенный порог.

Это мини-матрица заболеваемости:

data <- structure(list(this = c(0, 1, 0, 1, 1, 2, 0, 1, 3), 
 that = c(1, 1, 3, 0, 0, 0, 2, 1, 0), 
 phat = c(0, 0, 2, 1, 0, 0, 1, 2, 0)), 
 .Names = c("this", "that", "phat"), 
 row.names = c("a", "b", "c", "d", "e", "f", "g", "h", "i"), 
 class = "data.frame")

с данными атрибута сома:

att <-structure(list(sex = structure(c(1L, 1L, 2L, 2L, 1L, 2L, 1L, 
1L, 1L), .Label = c("F", "M"), class = "factor"), agegr = c(1L, 
1L, 3L, 1L, 3L, 1L, 1L, 3L, 1L), place = structure(c(1L, 2L, 
1L, 1L, 1L, 1L, 2L, 2L, 1L), .Label = c("Lower", "Upper"), 
class = "factor")), .Names  = c("sex", 
"agegr", "place"), row.names = c(NA, -9L), class = "data.frame")

ps может быть, SNA будет хорошим тегом для этого поста? У меня просто нет нужной НАСТОЛЬКО доброй воли:-)

3 ответа

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

Первая часть вашего вопроса имеет довольно простое решение:

# Convert data frame to graph using incidence matrix
G<-graph.incidence(as.matrix(data),weighted=TRUE,directed=FALSE)
summary(G)
# Vertices: 12 
# Edges: 30 
# Directed: TRUE 
# No graph attributes.
# Vertex attributes: type, name.
# Edge attributes: weight.

Это возвращает объект графа с ненаправленными и взвешенными ребрами из матрицы инцидентности. Для создания графиков аффилированности из двудольного графа у вас есть два варианта. Самый простой и быстрый способ:

proj<-bipartite.projection(G)

Это вернет список с каждой проекцией, индексированной как $proj1 и proj2, к сожалению, эти проекты не содержат веса ребер, которые вы обычно хотели бы при выполнении этой манипуляции. Для этого лучшим решением будет просто выполнить умножение матриц самостоятельно.

# Create the matrices, and set diagonals to zero
M<-as.matrix(data)
affil.matrix<-M%*%t(M)
diag(affil.matrix)<-0
cases.matrix<-t(M)%*%M
diag(cases.matrix)<-0
# Create graph objects from matrices
affil.graph<-graph.incidence(affil.matrix,weighted=TRUE)
cases.graph<-graph.incidence(cases.matrix,weighted=TRUE)

Генерирование графиков с данными атрибутов немного сложнее и требует большего кодирования, но я рекомендую просмотреть некоторые примеры igraph или даже мои собственные, так как есть много, чтобы вы начали. Удачи!

Это не дает прямого ответа на ваш вопрос, но я настоятельно рекомендую посмотреть презентацию Дрю Конвея о SNA в R, если вы еще этого не видели.

Другие вопросы по тегам