用R语言建立网络格式的数据
2016-05-31 23:29阅读:
这几天,摸索了一类建立网络原始数据的方法(R语言环境下)。
初衷:1.开辟除UCinet之外的另一种方法,可以处理网络分析的数据类型。
2.指数随机图模型(ERGM)的主流分析软件包statnet,是搭载于R语言环境的。为了尝试ERGM模型,必然无法绕开R语言环境的学习。这就决定了,必然需要借组R语言环境建立网络原始数据。
基于以上目的,这些天一直专研R语言平台,借助swirl()自助学习软件包,和导师赠送的基本R语言及ERGM模型书籍,对该平台的使用进行了尝试,学到一些技巧。为避免日久遗忘,记录于此,以备后来回看。若同时对网友有所裨益,欢迎转载,希望能有同行交流切磋。
主要内容:
1.网络格式数据(network)的建立;
2.网络节点属性(vertice attribute)的导入。
看似仅仅以上两点内容,却让我查找资料好久。某些R语言帮助文件的内容比较简短,缺乏实例,因此无法提供更为直接的帮助。本人借助百度查找到一些国外大学网站的相关资料(如宾夕法尼亚州立大学教学资源网址:http://sites.stat.psu.edu/~dhunter/Rnetworks/),摸索实践后才得以掌握。
1.网络格式数据(network)的建立
本人习惯使用网络邻接矩阵(adjacency)记录网络,因此仅以此为起点建立网络。建立网络类型数据需要使用的R语言软件包为“network”。在进行相应的网络数据建立之前,需要安装并载入该软件包。命令格式如下:
install.packages('network')
library(network)
随后,找到保存有网络邻接矩阵的数据文件(一般为excel中的cs
v格式)。若邻接矩阵数据源文件格式为文本文档(即txt文件),建议转为csv格式。本文使用的邻接矩阵数据源文件(adj.csv)内部数据如下图所示:
图1
邻接矩阵数据源文件(以上截图只显示了前27行数据,后续数据自动隐藏)
注意,以上文件内容中的首行与首列,均不需要节点名称。
接下来,在R语言平台读入该csv文件,命令如下:
mtr<-read.csv(file.choose(), header=F)
****该命令采用对话框方式指导用户选择数据文件,最后的参数“header=F”意指数据文件的首行不表示节点名称。用户通过弹出的对话框找到邻接矩阵数据源文件,点击打开按钮完成导入。
以邻接矩阵为基础 ,可以直接建立网络数据network。命令如下:
net1<-network(mtr)
****network是建立网络数据的函数,括号内的mtr正是刚才导入的邻接矩阵数据。通过上述命令,一个名为net1的网络加你起来,该网络的内容概要可以
通过如下命令查看:
summary(net1)
结果显示如下:
Network attributes:
vertices = 38
directed = TRUE
hyper = FALSE
loops = FALSE
multiple = FALSE
bipartite = FALSE
total edges = 146
missing edges = 0
non-missing edges = 146
density = 0.1038407
Vertex attributes:
vertex.names:
character valued attribute
38 valid vertex names
No edge attributes
Network edgelist matrix:
[,1] [,2]
[1,] 10 1
[2,] 34 1
[3,] 9 2
[4,] 10 2
[5,] 14 2
[6,] 15 2
[7,] 19 2
[8,] 23 2
[9,] 28 2
[10,] 29 2
[11,] 36 2
[12,] 4 3
[13,] 6 3
[14,] 7 3
[15,] 15 3
[16,] 21 3
[17,] 3 4
[18,] 6 4
[19,] 19 4
[20,] 21 4
[21,] 22 4
[22,] 27 4
[23,] 12 5
[24,] 14 5
[25,] 23 5
[26,] 33 5
[27,] 36 5
[28,] 3 6
[29,] 7 6
[30,] 11 6
[31,] 15 6
[32,] 21 6
[33,] 22 6
[34,] 28 6
[35,] 4 7
[36,] 6 7
[37,] 14 7
[38,] 9 8
[39,] 20 8
[40,] 27 8
[41,] 29 8
[42,] 34 8
[43,] 35 8
[44,] 2 9
[45,] 8 9
[46,] 12 9
[47,] 16 9
[48,] 25 9
[49,] 34 9
[50,] 36 9
[51,] 1 10
[52,] 34 10
[53,] 38 10
[54,] 3 11
[55,] 4 11
[56,] 6 11
[57,] 7 11
[58,] 15 11
[59,] 19 11
[60,] 21 11
[61,] 33 12
[62,] 36 12
[63,] 7 14
[64,] 28 14
[65,] 6 15
[66,] 7 15
[67,] 9 16
[68,] 24 16
[69,] 26 16
[70,] 31 16
[71,] 35 16
[72,] 25 17
[73,] 17 18
[74,] 4 19
[75,] 6 19
[76,] 25 19
[77,] 27 19
[78,] 28 19
[79,] 8 20
[80,] 34 20
[81,] 3 21
[82,] 6 21
[83,] 7 21
[84,] 11 21
[85,] 28 21
[86,] 14 22
[87,] 28 22
[88,] 2 23
[89,] 29 23
[90,] 30 23
[91,] 33 23
[92,] 36 23
[93,] 8 24
[94,] 10 24
[95,] 16 24
[96,] 26 24
[97,] 31 24
[98,] 35 24
[99,] 17 25
[100,] 19 25
[101,] 16 26
[102,] 35 26
[103,] 3 27
[104,] 6 27
[105,] 19 27
[106,] 22 27
[107,] 14 28
[108,] 2 29
[109,] 10 29
[110,] 23 29
[111,] 38 30
[112,] 8 31
[113,] 10 31
[114,] 16 31
[115,] 24 31
[116,] 26 31
[117,] 35 31
[118,] 8 32
[119,] 24 32
[120,] 31 32
[121,] 12 33
[122,] 23 33
[123,] 8 34
[124,] 9 34
[125,] 10 34
[126,] 13 34
[127,] 19 34
[128,] 25 34
[129,] 27 34
[130,] 38 34
[131,] 8 35
[132,] 16 35
[133,] 24 35
[134,] 26 35
[135,] 31 35
[136,] 2 36
[137,] 5 36
[138,] 9 36
[139,] 12 36
[140,] 23 36
[141,] 30 36
[142,] 33 36
[143,] 37 36
[144,] 36 37
[145,] 10 38
[146,] 34 38
通过已经得到的网络数据net1,可以绘制该网络图,命令如下:
plot(net1)
得到绘图如下:
图2
net1的网络图机构
以上建立网络数据的方法适用于大多数情况。但是上述过程没有涉及节点属性的导入。因此,建立起的网络数据比较单薄,接下来介绍一种直接导入节点属性的方法。
2. 网络节点属性(vertice attibute)的导入
与前述第1点内容相同,节点属性的原始文件建议也保存在csv格式文件中。本文中所有节点的属性如下:
图3
节点属性一瞥:三种属性分别为资历senority、项目数量project、所属办公室office(该图只显示了前27行数据,后续数据自动隐藏)
首先,需要在R语言环境下读入该源文件,命令如下:
node_attri<-read.csv(file.choose(),header=T)
****上述最后一个参数“header=T”表示源文件中的首行“
senority | project |
office”在导入时作为节点属性的名称,不可忽略。
有了前述两个数据——节点属性和邻接矩阵,下面可以直接建立一个饱满的网络数据了:
net2<-network(mtr,vertex.attr = node_attri)
****这里将邻接矩阵、节点属性作为第一和第二参数一齐赋值给网络
建立好的网络数据net2的概要如下:
在R语言平台键入“net2”回车,结果现实:
> net2
Network attributes:
vertices = 38
directed = TRUE
hyper = FALSE
loops = FALSE
multiple = FALSE
bipartite = FALSE
total edges= 146
missing edges= 0
non-missing edges= 146
Vertex attribute names:
*****注意这两行,节点属性中已经包含办公
office projects seniority vertex.names
*****室、项目和资历三项属性
No edge attributes
若想知道网络数据net2中所有的项目属性值project,可键入如下命令查看:
net2 %v% 'projects'
结果:
[1]
9
5
0
1 13
0
0
7
5
9
2 12
4
1
0 14
5
1
2
5
1
0
6
4
6 27
1
[28]
6
7 15 19 17 18
4 16 14 19
8
若要查看其他节点属性,以此类推。
到这一步,一个包含各节点属性的饱满网络net2已经建立。
本文篇幅不长,但是我这几日孜孜以求的结果,记录在此备忘。若网友觉得有用,欢迎留言。