Calculates the graph level secrecy index of a graph and its vertices

g_secrecy(g, type = 0, p = 0.25, digits = 3)

v_secrecy(g, type = 1, p = 0.25, digits = 3)

Arguments

g

graph of class igraph, network, matrix

type

numeric, which secrecy type needs to be returned: 0, 1, 2, or 3.

p

probability, needed when type == 0 or type == 2

digits

number of decimals used

Value

data.frame

Details

The secrecy measure is useful for covert networks where its members want to remain undetected to the law enforcement agencies (LEA's), even when some of their peers are detected.

The secrecy measure is defined as the fraction of the network that remains unexposed if a single member of the network is detected. Hence, the score runs between 0 (= everybody gets exposed as soon as 1 person is exposed) to 1 (= nobody gets exposed when 1 person is exposed). In real cases, the boundary values of 0 and 1 will only occur in pathological networks.

This relies on two things: 1. the probability of an individual becoming exposed when the LEA conducts a surveillance; 2. the fraction of the network that is exposed when a member of the network becomes detected in that surveillance.

There are several ways of computing the network's secrecy.

S1 assumes that every actor has the same probability of being detected under a surveillance (with p = 1/number_of_vertices) and defines the secrecy that individual i 'contributes' to the network as the fraction of individuals that remain unexposed when upon monitoring individual i all his links with his neighbors are detected.

S2 assumes that whenever an individual in the network is being monitored, communication between him and one of his neighbors is detected independently with probability p. The case where p = 1 therefore corresponds to measure S1. If individual i has di neighbors the number of neighbors that will be detected is binomially distributed. As with S1, it is assumed that every actor has the same probability of being detected under a surveillance (with p = 1/number_of_vertices).

The calculation of S2 requires the user to specify a reasonable value for p, which may not be obvious.

S3 no longer assumes that i = 1/n for all i in V (as in S1 and S2). It can be argued that i = 1/n is a fair assumption when a covert operation is in its initial phase. However, if an operation passed its initial stage the probability of exposure will vary among network members. This happens because certain individuals, due to a more central position in the network, are more likely to be discovered. In S3 this is captured by the equilibrium distribution of a random walk on the graph. This random walk chooses its next vertex at random from the neighbors of the current vertex including itself.

NOTE: measure S3 can break down in certain graphs and is no longer bound to \[0,1\]. Discard of S3 in those situations.

This function either returns one of the three secrecy measures (specified by type) or a data.frame containing all three. When type == 0 or type == 2, a reasonable value for p should be specified.

The function g_secrecy returns the overall secrecy score of the graph: this is the fraction of vertices in the graph expected to remain unexposed under a single surveillance when a single vertex is exposed by the LEA. Here, the default scenario is type = 0.

The function v_secrecy returns the secrecy score per vertex, this is the fraction of vertices in the graph that are to remain unexposed under a surveillance when that vertex is exposed multiplied by the probability of that vertex being exposed to begin with. In other words: if 1 vertex in the graph is exposed, what is the fraction of vertices that that is likely to remain unexposed, due to vertex i? This is indeed determined by the number of neighbors of i and the risk of i being the one to be exposed.

In scenarios 1 and 2, all vertices have the same probability of being exposed, so this secrecy score is proportional to the fraction that they leave unexposed when captured. For scenario 3, more central vertices are more likely to be exposed themselves, so more central vertices will have lower secrecy than other vertices (with the same number of neighbors): these central vertices are more easily exposed and therefore threaten the secrecy of the graph more. Here, the default scenario is type = 1.

Note that the graph-level secrecy score is equal (barring rounding differences) to the sum of the vertex-level secrecy scores.

References

The formulas come from Lindelauf, R., Borm, P., & Hamers, H. (2009). The influence of secrecy on the communication structure of covert networks. Social Networks, 31(2), 126-137.

Examples

if (FALSE) { # \dontrun{
data(Madrid_bombing, package = "snafun")
g <- Madrid_bombing[[25]]
g_secrecy(g) # all three measures, p = .25
g_secrecy(g, p = .1) # all three measures, p = .1
g_secrecy(g, type = 1)  # only S1

v_secrecy(g, type = 0)
# almost the same, difference only due to rounding of each score
v_secrecy(g, type = 0) |> colSums()
} # }