R/measure_centrality.R
measure_central_eigen.RdThese functions calculate common eigenvector-related centrality measures, or walk-based eigenmeasures, for one- and two-mode networks:
node_eigenvector() measures the eigenvector centrality of nodes
in a network.
node_power() measures the Bonacich, beta, or power centrality of
nodes in a network.
node_alpha() measures the alpha or Katz centrality of nodes in a
network.
node_pagerank() measures the pagerank centrality of nodes in a network.
node_hub() measures how well nodes in a network serve as hubs pointing
to many authorities.
node_authority() measures how well nodes in a network serve as
authorities from many hubs.
tie_eigenvector() measures the eigenvector centrality of ties in a
network.
net_eigenvector() measures the eigenvector centralization for a
network.
All measures attempt to use as much information as they are offered,
including whether the networks are directed, weighted, or multimodal.
If this would produce unintended results,
first transform the salient properties using e.g. to_undirected() functions.
All centrality and centralization measures return normalized measures
by default, including for two-mode networks.
node_eigenvector(.data, normalized = TRUE, scale = TRUE)
node_power(.data, normalized = TRUE, scale = FALSE, exponent = 1)
node_alpha(.data, alpha = 0.85)
node_pagerank(.data)
node_authority(.data)
node_hub(.data)
node_subgraph(.data)
tie_eigenvector(.data, normalized = TRUE)
net_eigenvector(.data, normalized = TRUE)An object of a manynet-consistent class:
matrix (adjacency or incidence) from {base} R
edgelist, a data frame from {base} R or tibble from {tibble}
igraph, from the {igraph} package
network, from the {network} package
tbl_graph, from the {tidygraph} package
Logical scalar, whether the centrality scores are normalized. Different denominators are used depending on whether the object is one-mode or two-mode, the type of centrality, and other arguments.
Logical scalar, whether to rescale the vector so the maximum score is 1.
Decay rate or attentuation factor for the Bonacich power centrality score. Can be positive or negative.
A constant that trades off the importance of external influence against the importance of connection. When \(\alpha = 0\), only the external influence matters. As \(\alpha\) gets larger, only the connectivity matters and we reduce to eigenvector centrality. By default \(\alpha = 0.85\).
A numeric vector giving the eigenvector centrality measure of each node.
A numeric vector giving each node's power centrality measure.
We use {igraph} routines behind the scenes here for consistency and because they are often faster.
For example, igraph::eigencentrality() is approximately 25% faster than sna::evcent().
Eigenvector centrality operates as a measure of a node's influence in a network.
The idea is that being connected to well-connected others results in a higher score.
Each node's eigenvector centrality can be defined as:
$$x_i = \frac{1}{\lambda} \sum_{j \in N} a_{i,j} x_j$$
where \(a_{i,j} = 1\) if \(i\) is linked to \(j\) and 0 otherwise,
and \(\lambda\) is a constant representing the principal eigenvalue.
Rather than performing this iteration,
most routines solve the eigenvector equation \(Ax = \lambda x\).
Note that since {igraph} v2.1.1,
the values will always be rescaled so that the maximum is 1.
Power centrality includes an exponent that weights contributions to a node's centrality based on how far away those other nodes are. $$c_b(i) = \sum A(i,j) (\alpha = \beta c(j))$$ Where \(\beta\) is positive, this means being connected to central people increases centrality. Where \(\beta\) is negative, this means being connected to central people decreases centrality (and being connected to more peripheral actors increases centrality). When \(\beta = 0\), this is the outdegree. \(\alpha\) is calculated to make sure the root mean square equals the network size.
Alpha or Katz (or Katz-Bonacich) centrality operates better than eigenvector centrality for directed networks because eigenvector centrality will return 0s for all nodes not in the main strongly-connected component. Each node's alpha centrality can be defined as: $$x_i = \frac{1}{\lambda} \sum_{j \in N} a_{i,j} x_j + e_i$$ where \(a_{i,j} = 1\) if \(i\) is linked to \(j\) and 0 otherwise, \(\lambda\) is a constant representing the principal eigenvalue, and \(e_i\) is some external influence used to ensure that even nodes beyond the main strongly connected component begin with some basic influence. Note that many equations replace \(\frac{1}{\lambda}\) with \(\alpha\), hence the name.
For example, if \(\alpha = 0.5\), then each direct connection (or alter) would be worth \((0.5)^1 = 0.5\), each secondary connection (or tertius) would be worth \((0.5)^2 = 0.25\), each tertiary connection would be worth \((0.5)^3 = 0.125\), and so on.
Rather than performing this iteration though, most routines solve the equation \(x = (I - \frac{1}{\lambda} A^T)^{-1} e\).
Subgraph centrality measures the participation of a node in all subgraphs in the network, giving higher weight to smaller subgraphs. It is defined as: $$C_S(i) = \sum_{k=0}^{\infty} \frac{(A^k)_{ii}}{k!}$$ where \((A^k)_{ii}\) is the \(i\)th diagonal element of the \(k\)th power of the adjacency matrix \(A\), representing the number of closed walks of length \(k\) starting and ending at node \(i\). Weighting by \(\frac{1}{k!}\) ensures that shorter walks contribute more to the centrality score than longer walks.
Subgraph centrality is a good choice of measure when the focus is on local connectivity and clustering around a node, as it captures the extent to which a node is embedded in tightly-knit groups within the network. Note though that because of the way spectral decomposition is used to calculate this measure, this is not a good measure for very large graphs.
Bonacich, Phillip. 1991. “Simultaneous Group and Individual Centralities.” Social Networks 13(2):155–68. doi:10.1016/0378-8733(91)90018-O
Bonacich, Phillip. 1987. “Power and Centrality: A Family of Measures.” The American Journal of Sociology, 92(5): 1170–82. doi:10.1086/228631 .
Katz, Leo 1953. "A new status index derived from sociometric analysis". Psychometrika. 18(1): 39–43.
Bonacich, P. and Lloyd, P. 2001. “Eigenvector-like measures of centrality for asymmetric relations” Social Networks. 23(3):191-201.
Brin, Sergey and Page, Larry. 1998. "The anatomy of a large-scale hypertextual web search engine". Proceedings of the 7th World-Wide Web Conference. Brisbane, Australia.
Kleinberg, Jon. 1999. "Authoritative sources in a hyperlinked environment". Journal of the ACM 46(5): 604–632. doi:10.1145/324133.324140
Estrada, Ernesto and Rodríguez-Velázquez, Juan A. 2005. "Subgraph centrality in complex networks". Physical Review E 71(5): 056103. doi:10.1103/PhysRevE.71.056103
Other centrality:
measure_central_between,
measure_central_close,
measure_central_degree
Other measures:
measure_attributes,
measure_central_between,
measure_central_close,
measure_central_degree,
measure_closure,
measure_cohesion,
measure_diffusion_infection,
measure_diffusion_net,
measure_diffusion_node,
measure_features,
measure_heterogeneity,
measure_hierarchy,
measure_holes,
measure_periods,
measure_properties,
member_diffusion
node_eigenvector(ison_southern_women)
#> ▂▁▂▁▂▂▁▁
#> Evelyn Laura Theresa Brenda Charlotte Frances Eleanor Pearl Ruth Verne Myra
#> 1 0.901 0.85 1 0.861 0.493 0.616 0.676 0.549 0.703 0.653 0.559
#> # ... with 7 more values from this nodeset unprinted. Use `print(..., n = Inf)` to print all values.
#> E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13
#> 1 0.371 0.391 0.612 0.448 0.735 0.749 0.833 1 0.777 0.413 0.224 0.476 0.291
#> # ... with 1 more values from this nodeset unprinted. Use `print(..., n = Inf)` to print all values.
node_power(ison_southern_women, exponent = 0.5)
#> ▁▁▂▄▁▁▁
#> Evelyn Laura Theresa Brenda Charlotte Frances Eleanor Pearl Ruth Verne Myra
#> 1 -1.44 -1.38 -1.44 -1.38 -1.00 -1.38 -1.38 -1.52 -1.44 -1.44 -1.52
#> # ... with 7 more values from this nodeset unprinted. Use `print(..., n = Inf)` to print all values.
#> E1 E2 E3 E4 E5 E6 E7 E8 E9 E10 E11 E12 E13
#> 1 -1.32 -1.32 -1.32 -1.32 -1.32 -1.62 -1.62 -1.62 -1.62 -1.32 -1.32 -1.32 -1.32
#> # ... with 1 more values from this nodeset unprinted. Use `print(..., n = Inf)` to print all values.
tie_eigenvector(ison_adolescents)
#> `Betty-Sue` `Sue-Alice` `Alice-Jane` `Sue-Dale` `Alice-Dale` `Jane-Dale`
#> 1 0.574 1 0.701 0.821 0.849 0.521
#> # ... with 4 more values from this nodeset unprinted. Use `print(..., n = Inf)` to print all values.
net_eigenvector(ison_southern_women)
#> Mode 1 Mode 2
#> 0.0849 0.2630