几年前,我使用UCINET进行社交网络分析。 Theese的日子我想再次使用SNA - 但这次我更喜欢统一的分析框架 - 对我来说就是R。
我查看了sna和statnet文档,但有点不知所措。
我想做的事情:首先:加载直接从例如拉出的二分/入射矩阵。网络调查(通常很有价值)。将此矩阵转换为两个邻接矩阵'(通过隶属关系和案例分类)。根据案例矩阵,它也可能是有针对性的,有价值的案例。
第二:加载顶点属性的文件(也来自例如websurvey数据)。
第三:然后用例如:顶点大小根据某些中心度量,由一些顶点属性着色和标记,只绘制值超过某个阈值的边。
这是一个小型关联矩阵:
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")
使用som属性数据:
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")
P.S。也许SNA会是这篇文章的好标签?我只是没有礼貌的善意: - )
答案 0 :(得分:7)
这是一个很好的问题,并为进一步探索R中的SNA提供了一些机会。我对igraph package更熟悉,所以我将使用该库中的函数回答您的问题。
问题的第一部分有一个相当简单的解决方案:
# 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 examples,甚至some of my own,因为有很多内容可以帮助您入门。祝你好运!
答案 1 :(得分:2)
这不会直接回答您的问题,但如果您还没有看过,我强烈建议您观看Drew Conway's presentation on SNA in R。
答案 2 :(得分:0)