在R&#39

时间:2015-05-22 17:07:32

标签: r igraph

我是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)

我一直在网上寻找Zachary数据集的结构,以便我可以正确地建模我的数据,但我正在努力寻找技术文档。

我的数据目前结构很长,以便:

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是个人的兴趣,{{1}是他们表现出兴趣的次数的索引。这有帮助吗?

我尝试在此数据集上运行社区算法(例如comments),但这似乎无法正常工作。关于这个n00b做错了什么的想法?

1 个答案:

答案 0 :(得分: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(无需计算邻接矩阵)。