Основная СНС в 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, если вы еще этого не видели.
Вы также можете обратиться к Лабораториям анализа социальных сетей в R и SoNIA, в частности к лаборатории по данным о членстве.