2015-05-22 59 views
0

我是新来的igraph和社会网络分析,而不是R.结构化数据

我奋力正确地构建我的社区检测数据集,但已经成功地使用IGRAPH生成一个共生矩阵as directed [here]。接下来我要做的是在同一个数据集上使用社区检测算法来创建一个图表,显示群集as is done in the answer here

如何做到这一点的示例代码如下:

df1 <- graph.famous("Zachary") 
df2 <- walktrap.community(df1) #any algorithm 
plot.communities(df2, df) 

我一直在网上找到了扎卡里数据集的结构上戳,这样我就可以正确模拟我的数据,但我正在努力寻找通过技术文档的方法。

我的数据,目前在长形结构化,使得:

id   interest comments 
1    Comedy   2 
1 Music: Electronic   11 
1  Video Gaming   10 
1   Music: Pop   1 
1  Entertainment   1 
1  Video Gaming   4 
2  Video Gaming   45 
2  Entertainment   26 
2   Music: Pop   1 
2   Comedy   14 
3  Video Gaming   10 
3  Entertainment   4 
3   Comedy   8 
4  Video Gaming   9 
4 Music: Electronic   1 
4  Music: Pop   2 
5  Music: Pop   2 
5  Entertainment   1 
5  Video Gaming   1 
6  Video Gaming   12 

我试图找到重叠在人群中,我学习兴趣的集群,所以ID是一个人,在interests是人的兴趣,以及comments是他们已经表现出兴趣的次数的指数。这有帮助吗?

我试着在这个数据集上运行社区算法(例如df2 <- walktrap.community(df)),但似乎没有正常工作。关于这个n00b做错了的想法?

+0

图形由节点和边组成。您的数据集中与节点有关的内容以及您如何知道哪些节点已连接?对于Zarchary数据,它可以用邻接矩阵('get.adjacency(df1)')或边缘列表('get.edgelist(df1)')表示。 – MrFlick

+0

@MrFlick节点是列“利益“ - 即喜剧,博弈等。我试图找到我正在研究的人群中重叠兴趣的集群,因此身份证是一个人,利益是人的利益,”评论“是很多时候他们表现出兴趣。这有帮助吗? – roody

+0

这是有道理的,但仍然不能很好地转化为图形的语言。所以你希望每个兴趣成为一个节点,然后你想要一个节点之间的边缘,如果一个用户共享这两个利益?我不确定你会如何处理评论栏,因为这看起来不适合作为节点或边缘权重。我仍然很难看到这些数据如何以图表的形式表现出来。 – MrFlick

回答

0

图形不会让您聚集个人,但只能找出哪些变量是相关的。不过,如果你想从你的数据中建立一个图表,这是你必须做的。 (请注意,我已将您的示例数据保存为.csv文件,并将其上传到Dropbox中以制作一个易于重现的示例)。

library(repmis) 
library(igraph) 

test=source_data("https://www.dropbox.com/s/bochkedd4o3gzvq/so.csv?dl=0") 

首先,你要的是建立一个矩阵,每个单独的一行,每个功能一米栏:

matrix=matrix  
rownames(matrix)=unique(test[,1]) 
colnames(matrix)=unique(test[,2]) 

,并在单元格的值对应于利益的力量:

for (i in 1:nrow(matrix)){ 
    temp=test[test[,1]==i,][,2:3] 
    for (j in 1:ncol(matrix)){ 
    matrix[i,j]=sum(temp[temp[,1]==colnames(matrix)[j],2]) # sum is used because of duplicates 
    } 
} 

你得到的是:

> matrix 
    comedy electronic gaming pop ent 
1  2   11  14 1 1 
2  14   0  45 1 26 
3  8   0  10 0 4 
4  0   1  9 2 0 
5  0   0  1 2 1 
6  0   0  12 0 0 

然后,从,你可以创建一个邻接矩阵:

x=t(matrix)%*%matrix 

而你得到的是:

> x 
      comedy electronic gaming pop ent 
comedy  264   22 738 16 398 
electronic  22  122 163 13 11 
gaming  738  163 2547 79 1225 
pop   16   13  79 10 29 
ent   398   11 1225 29 694 

建立从图形很简单:

g=graph.adjacency(x,weighted=T,mode="undirected",diag=FALSE) 
g=simplify(g) 

您可以将任何社区检测算法应用于对象g,例如:

spinglass.community(g,weight=E(g)$weight) 

如果你想聚集个人而不是变量,我会看看PCA和层次聚类(例如参见FactoMineR包中的优秀HCPC函数)。在这种情况下,您将使用上面的对象matrix(不需要计算邻接矩阵)。

+0

你能否解释一下矩阵x中的数字是什么,这是交叉产品的结果。 – user20650

+0

@ user20650请查看'graph.adjacency'函数的文档:http://igraph.org/r/doc/graph.adjacency.html – Antoine

+0

感谢您的回复。例如,为了扩展我的问题,'264'在'x'的喜剧/喜剧元素中涉及了什么 - 我不知道这与原始数据有什么关系(我知道im很可能很慢)ps 。我明白你正试图形成一个加权邻接矩阵。 – user20650