---
title: "Indirect relations in networks"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{04 indirect relations in networks}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

This vignette describes the importance of indirect relations on networks, how 
they are used in centrality indices and how they are implemented in the `netrankr` package.

________________________________________________________________________________

## Theoretical Background
A one-mode network can be described as a *dyadic variable* $x\in \mathcal{W}^\mathcal{D}$,
where $\mathcal{W}$ is the value range of the network (in the simple case of 
unweighted networks $\mathcal{W}=\{0,1\}$) and $\mathcal{D}=\mathcal{N}\times\mathcal{N}$ 
describes the dyadic domain of actors $\mathcal{N}$.
\
\
Observed presence or absence of ties (the value range is binary) is usually not 
the relation of interest for network analytic tasks. Instead, mostly implicitly, 
relations are *transformed* into a new set of *indirect* relations on the basis 
of the *observed* relations. As an example, consider (shortest path) distances in the 
underlying graph. While they are fairly easy to derive from an observed network 
of contacts, it is impossible for actors in a network to answer the question 
"How far away are you from others you are not connected with?". We denote generic 
transformed networks from an observed network $x$ as $\tau(x)$. 
\
\

With this notion of indirect relations, we can express centrality indices in
a common framework as
$$
c_\tau(i)=\sum\limits_{t \in \mathcal{N}} \tau(x)_{it}
$$
Degree and closeness centrality, for instance, can be obtained by setting $\tau=id$ 
and $\tau=dist$, respectively. Others need several additional specifications which 
can be found in [Brandes (2016)](https://dx.doi.org/10.1177/2059799116630650) or 
[Schoch & Brandes (2016)](https://doi.org/10.1017/S0956792516000401). 
\
With this framework, we can characterize centrality indices as degree-like 
measures in a suitably transformed network $\tau(x)$. 

________________________________________________________________________________

## Indirect relations in the `netrankr` package

```{r setup, warning=FALSE,message=FALSE}
library(netrankr)
library(igraph)
```

The `netrankr` package implements a great variety of indirect relations that are
(or could be) used for centrality related considerations in a network. All indirect
relations can be computed with the `indirect_relations()` function, by specifying
the `type` parameter. 

```{r indirstandard}
g <- graph.empty(n=11,directed = FALSE)
g <- add_edges(g,c(1,11,2,4,3,5,3,11,4,8,5,9,5,11,6,7,6,8,
                   6,10,6,11,7,9,7,10,7,11,8,9,8,10,9,10))
V(g)$name <- 1:11

#adjacency
A <- indirect_relations(g,type = "identity")
#shortest path distances
D <- indirect_relations(g,type="dist_sp")
#dyadic dependencies (as used in betweenness centrality)
B <- indirect_relations(g,type = "depend_sp")
#resistance distance (as used in information centrality)
R <- indirect_relations(g,type="dist_resist")
#Logarithmic forest distance (parametrized family of distances)
LF <- indirect_relations(g, type = "dist_lf",lfparam = 1) 
#Walk distance (parametrized family of distances)
WD <- indirect_relations(g, type = "dist_walk",dwparam = 0.001) 
#Random walk distance
WD <- indirect_relations(g, type = "dist_rwalk") 
#See ?indirect_relations for further options
```

The function takes an additional parameter `FUN` which can be used to pass a function
to further transform relations. The main use is to obtain indirect relations based on walk counts.

```{r indirwalks}
#count the limit proportion of walks (used for eigenvector centrality)
W <-  indirect_relations(g,type = "walks",FUN = walks_limit_prop)
#count the number of walks of arbitrary length between nodes, weighted by 
#the inverse factorial of their length (used for subgraph centrality)
S <-  indirect_relations(g,type = "walks",FUN = walks_exp)
```

Additional parameters can also be passed to calculate parameterized versions of
relations.
```{r indirparam}
#Calculate dist(s,t)^-alpha
D <- indirect_relations(g,type="dist_sp",FUN=dist_dpow,alpha = 2)
```

To view all predefined transformation functions see `?transform_relations`. The 
predefined functions follow the naming scheme `<relation>_<transformation>`. 
The functions `dist_` are thus only meaningful fordistance type relations such as 
`type="dist_sp"` or `type="dist_resist"`. Equivalently, `walks_` for `type="walks"`. 
The predefined functions are not exhaustive and just constitute the most common 
transformations. It is, however, straightforward to pass your own transformation function. 

```{r own_func}
dist_integration <- function(x){
  x <- 1 - (x - 1)/max(x)
}
D <- indirect_relations(g,type="dist_sp",FUN=dist_integration)
```

The function `dist_integration()` computes
$$
\tau(x)_{ij}=1-\frac{dist(i,j)-1}{max_{i,j}\; dist(i,j)}
$$
which is used in the centrality index *integration* defined by [Valente and Foreman (1998)](https://doi.org/10.1016/S0378-8733(97)00007-5)

The computed relations CAN be used to build centrality indices (e.g. with the provided Rstudio
`index_builder()`), but also to derive partial rankings with `positional_dominance()`.
Consult the respective [vignette](positional_dominance.html) for help.