-
Notifications
You must be signed in to change notification settings - Fork 1
/
Fragmentation centrality.R
140 lines (82 loc) · 4.35 KB
/
Fragmentation centrality.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
##====================Fragmentation centrality function in a bipartite network
#=========Intramodal fragmentation is the fragmentation score for the row x row and column by column projections
#========Crossmodal fragmentation is the fragmentation score for first mode actors on the second mode projection and vice versa
##=======Total fragmentation is the average of these two fragmentation scores
#===================================================================================================
# WARNING
#===================================================================================================
## Function is not optimized for efficiency--computation can take a long time in large networks
#===================================================================================================
##affiliation.mat is a binary affiliation matrix with first mode actors on the rows and second mode actors on the columns
fragmentation.centrality.bipartite<-function(affiliation.mat){
require(statnet)
require(igraph)
require(tnet)
if(nrow(affiliation.mat)>=100 |
ncol(affiliation.mat)>=100)(warning('Large network; computation may take a few minutes.'))
mafia<-as.matrix(affiliation.mat)
fakenet<-graph_from_incidence_matrix(mafia)
fakenet<-fakenet
###intramodal fragmentation--takes ~1 minute
nact<-nrow(mafia)+ncol(mafia)
mafiafrag1<-vector(length=nact)
for (i in 1:nrow(mafia)){
projnet<-fakenet
fragnet<-delete_vertices(projnet, i) ##delete vertex for focal actor, fragnet is subgraph without i
fragnet<-get.edgelist(fragnet)
fragnet<-as.tnet(fragnet, type="binary two-mode tnet")
projfirstmode<-projecting_tm(fragnet, method="Newman") ##project with Newman weights
distfirstproj<-distance_w(projfirstmode, directed=NULL, gconly=FALSE) #shortest path algorithm
distnet<-(sum(1/distfirstproj, na.rm=TRUE)) ##sum 1/distances, all distances are counted twice, so no need to multiply by two (as in equation)
distnet<-((nrow(mafia)^2)-nrow(mafia))/distnet ##numerator is total number of potential edges in projection, ensures increasing values indicate increasing vulnerability
mafiafrag1[i]<-distnet}
for (i in nrow(mafia):nact){
if(i==nrow(mafia)){i<-i+1}
projnet<-fakenet
fragnet<-delete_vertices(projnet, i)
fragnet<-t(get.incidence(fragnet))###transpose to project second mode
projsecmode<-projecting_tm(fragnet, method="Newman")
distsecproj<-distance_w(projsecmode, directed=NULL, gconly=FALSE)
#projsecmode$w
distnet2<-(sum(1/distsecproj, na.rm=TRUE))
distnet2<-((ncol(mafia)^2)-ncol(mafia))/distnet2
mafiafrag1[i]<-distnet2
}
intramodalmafiafrag<-mafiafrag1
###cross modal fragmentation
crossmafia<-vector(length=nact)
for (i in nrow(mafia):nact){
if(i==nrow(mafia)){i<-i+1}
projnet<-fakenet
fragnet<-delete_vertices(projnet, i) ##delete focal vertex
fragnet<-get.edgelist(fragnet)
projfirstmode<-projecting_tm(fragnet, method="Newman") ##project first mode
distfirstproj<-distance_w(projfirstmode, directed=NULL, gconly=FALSE)
distnet<-(sum(1/distfirstproj, na.rm=TRUE))
distnet<-((nrow(mafia)^2)-nrow(mafia))/distnet ###numerator is size of first mode network
crossmafia[i]<-distnet
if(i==nact){break}
}
for (i in 1:nrow(mafia)){##first mode
projnet<-fakenet
fragnet<-delete_vertices(projnet, i)
fragnet<-t(get.incidence(fragnet))##take transpose to project second mode
projsecmode<-projecting_tm(fragnet, method="Newman")
distsecproj<-distance_w(projsecmode, directed=NULL, gconly=FALSE)
#projsecmode$w
distnet2<-(sum(1/distsecproj, na.rm=TRUE))
distnet2<-((ncol(mafia)^2)-ncol(mafia))/distnet2 ##constrain by total potential edges in second mode network
crossmafia[i]<-distnet2
}
crossnodalmafia<-crossmafia
##total fragmentation
totalmafia<-(crossmafia+mafiafrag1)/2
fragmentation.output<-list(intramodalmafiafrag,crossnodalmafia,totalmafia)
names(fragmentation.output)<-c("Intramodal Fragmentation Centrality","Crossmodal Fragmentation Centrality","Overall Fragmentation Centrality")
fragmentation.output
}
###Example--not run
library(igraph)
fakenet<-sample_bipartite(50, 15, type="gnp", runif(1, min=0.1, max=0.4), directed=FALSE)
my.affiliation.matrix<-as.matrix(as_incidence_matrix(fakenet))
fragmentation.centrality.bipartite(my.affiliation.matrix)