我是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做错了什么的想法?
答案 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
(无需计算邻接矩阵)。