Tutoriel package R « bipartite »

Le logiciel R est un logiciel qui permet la mise en œuvre informatique de traitements statistiques. De nombreuses techniques sont implémentées  et utilisables à l’aide de packages. L’objet de ce billet est de présenter le package bipartite.

Ce package permet de visualiser un réseau biparti et de calculer les séries d’indices couramment utilisés dans l’analyse descriptive de réseaux, principalement en écologie. La visualisation est primordiale pour comprendre le réseau, les indices quant à eux permettent de résumer les différents aspects topologiques du réseau.

Les données en entrée doivent être de forme matricielle. Les colonnes correspondent au niveau supérieur du réseau avec m nœuds tandis que le niveau inférieur avec n nœuds s’apparente aux lignes de la matrice. Les matrice d’entrée sont de taille n*m. Les interactions d’espèces d’un même niveau trophique ne sont pas considérées comme pertinentes dans ce type de réseau. De ce fait, seuls les liens entre espèces de niveau différent sont représentés dans un réseau biparti.

Certaines fonctions ne s’appliquent qu’à des réseaux spécifiques à l’écologie. Elles ne seront pas toutes détaillées dans ce billet, qui a pour but de donner une vue d’ensemble générique de ce qu’il est possible de faire avec le package.

Le package met à disposition 19 réseaux quantitatifs sur la pollinisation extraits du site du National Center for Ecological Analysis and Synthesis.

La première étape consiste à charger le package :

# Installation du package
install.packages("bipartite") 
# Chargement du package
library(bipartite)

Les fonctions de base

Les paramètres “web” et “net” correspondent respectivement à un réseau explicité sous forme matricielle et à un réseau sous forme de liste pondérée. Dans un souci de simplicité, ils ne seront pas explicités à chaque fonction.

as.one.mode(matrice_bipartite) : convertit une matrice bimodale en une matrice unimodale.

as.tnet(web, type) : adapte le réseau entré en paramètre au type de réseau spécifié en option. L’option type peut prendre les valeurs {« weighted one-mode tnet », « binary two-mode tnet », « weighted two-mode tnet »,  « longitudinal tnet »}.

empty(matrice) : supprime les lignes et colonnes vides d’une matrice.

frame2webs(dataframe) : convertit un tableau au format data frame en une matrice réseau.

web2edges(matrice) : convertit une matrice réseau en une liste de liens pondérés.

sortweb(web, sort.order): trie le réseau de façon croissante (“inc”) ou décroissante (“dec”) en se basant sur les totaux des colonnes et des lignes.

sample <- rbind( c(1,2,4), c(5,2,2), c(5,6,1), c(6,5,1), c(1,2,1))
> sample
     [,1] [,2] [,3]
[1,]    1    2    4
[2,]    5    2    2
[3,]    5    6    1
[4,]    6    5    1
[5,]    1    2    1
> colSums(sample)
[1] 18 17  9
> rowSums(sample)
[1]  7  9 12 12  4
> sortweb(sample,"dec")
     [,1] [,2] [,3]
[1,]    5    6    1
[2,]    6    5    1
[3,]    5    2    2
[4,]    1    2    4
[5,]    1    2    1
> colSums(sortweb(sample,"dec"))
[1] 18 17  9
> rowSums(sortweb(sample,"dec"))
[1] 12 12  9  7  4

Générer des réseaux

mgen(web, n, keep.species, rep.cell) : génère un réseau simulé à partir d’une matrice de probabilité donnée et du nombre d’interaction souhaité. Par défaut, les options keep.species = TRUE et rep.cell = TRUE ajoutent des contraintes à la matrice générée. keep.species associe au moins une interaction entre chaque espèce. Cela permet de conserver les dimensions de la matrice en entrée. rep.cell autorise les interactions répétées.

#Création d'une matrice de probabilité
matrice_proba<-matrix(c(0.05,0.1,0.06,0.01,
                        0.15,0.03,0.01,0.1,
                        0.12,0.17,0.06,0,
                        0.05,0.01,0.04,0.04),4,4)

> mgen(web=matrice_proba,n=25)
     [,1] [,2] [,3] [,4]
[1,]    2    3    4    0
[2,]    2    1    7    1
[3,]    1    0    2    0
[4,]    0    2    0    0

swap.web(N,web) génère une liste de N matrices aléatoires de même dimension que la matrice de réseau initiale.

> swap.web(2,sample)
[[1]]
 [,1] [,2] [,3]
[1,] 3 3 1
[2,] 3 5 1
[3,] 4 5 3
[4,] 7 2 3
[5,] 1 2 1

[[2]]
 [,1] [,2] [,3]
[1,] 1 3 3
[2,] 6 2 1
[3,] 4 5 3
[4,] 5 6 1
[5,] 2 1 1

genweb(N1,N2,dens) : génère un réseau biparti aléatoire avec un niveau supérieur de taille N1, un niveau inférieur de taille N2, dont la densité moyenne est prise en compte avec le paramètre dens.

shuffle.web(web,N) : crée aléatoirement un nombre N de nouvelles matrices réseaux de même dimension à partir de la matrice réseau spécifiée.

symmetrise_w(web,method) génère un réseau unimodal non orienté à partir d’un réseau unimodal orienté. L’option method précise la méthode à utiliser pour déterminer le poids de chaque relation non orienté (MAX attribue le poids maximal, MIN attribue le poids minimal, AMEAN = moyenne des poids, SUM = somme des poids, prod, diff)

#Création d’un réseau
sample2 <- rbind(
 c(1,2,3),
 c(2,3,5),
 c(3,1,1),
 c(2,5,6),
 c(1,3,5),
 c(5,2,10),
 c(4,2,6),
 c(4,3,10))

> sample2
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    2    3    5
[3,]    3    1    1
[4,]    2    5    6
[5,]    1    3    5
[6,]    5    2   10
[7,]    4    2    6
[8,]    4    3   10

> symmetrise_w(sample2,method="MAX")
      i j  w
 [1,] 1 2  3
 [2,] 1 3  5
 [3,] 2 1  3
 [4,] 2 3  5
 [5,] 2 4  6
 [6,] 2 5 10
 [7,] 3 1  5
 [8,] 3 2  5
 [9,] 3 4 10
[10,] 4 2  6
[11,] 4 3 10
[12,] 5 2 10
> symmetrise_w(sample2,method="MIN")
     i j w
[1,] 1 3 1
[2,] 2 5 6
[3,] 3 1 1
[4,] 5 2 6
> symmetrise_w(sample2,method="SUM")
      i j  w
 [1,] 1 2  3
 [2,] 1 3  6
 [3,] 2 1  3
 [4,] 2 3  5
 [5,] 2 4  6
 [6,] 2 5 16
 [7,] 3 1  6
 [8,] 3 2  5
 [9,] 3 4 10
[10,] 4 2  6
[11,] 4 3 10
[12,] 5 2 16

 Les fonctions d’affichage

plotweb (web) permet de visualiser une matrice réseau bipartite

data(mosquin1967)
plotweb(mosquin1967)

Il est possible de réduire les labels des variables en n’affichant qu’une partie du label (options high.lablength et low.lablength), de faire une rotation à 90 degré des labels (option text.rot), de personnaliser les liens (option arrow pour la forme et col.interaction pour la couleur). L’option y.lim permet de délimiter la hauteur du réseau.

plotweb(mosquin1967, high.lablength=3, low.lablength=3,text.rot=90, arrow="down", col.interaction="pink", y.lim=c(-1,2.5))


Dans l’exemple suivant, la taille (options y.width.low, y.width.high) et la couleur des noeuds (options col.high, col.low) ont été modifiées, et les interactions sont représentées par des lignes.

plotweb(mosquin1967, high.lablength=3, low.lablength=3, text.rot=90, arrow="both",     y.width.low=0.05,y.width.high=0.05, col.high="light blue",col.low="light green")

plotweb3

Enfin un dernier exemple, voici comment représenter sur le graphique l’intensité des interactions entre les noeuds de chaque niveau (options low.abun, high.abun).

# Simuler différentes intensités d'interactions low.abun = round(runif(dim(mosquin1967)[1],1,20)) 
names(low.abun) <- rownames(mosquin1967)

> plotweb(mosquin1967, high.lablength=3, low.lablength=3, text.rot=90,     low.abun=low.abun, arrow="up", bor.col.interaction="red3",col.interaction="red",y.width.low=0.05,y.width.high=0.05,
col.high="blue",col.low="green3")

visweb(web) permet de visualiser un réseau sous forme de grille

visweb(mosquin1967)

Il existe de nombreuses possibilités pour améliorer la fonction visweb(). L’option type=diagonale fait apparaitre les plus fortes interactions sur la diagonale et permet de visualiser les nœuds qui ont une intensité d’interaction semblable. En ajoutant le paramètre square= »compartment » ,  les nœuds sont triés par groupe d’interaction. « frame=TRUE » dessine la délimitation de ces groupes.

visweb(mosquin1967, type="diagonal", square="compartment", text="none",frame=TRUE)

visweb2

 

La matrice réseau est triée par ligne et par colonne à l’aide de « type=nested ». Les lettres majuscules sur le réseau ci-dessous représentent le groupe associé à chaque interaction « text=compartment ».  La couleur des lettres est définie par l’option textcol, celle des cases par box.col et celle des contours par box.border

visweb(mosquin1967, type="nested", text="compartment",box.border="light blue",textcol="pink2")

Pour changer d’une simple représentation matricielle du réseau, on peut représenter les interactions avec des cercles (circles=TRUE, boxes=FALSE) de taille proportionnelle à l’intensité de l’interaction. La taille maximale des cercles est fixée par circle.max. La couleur du fond et des bordures se modifient avec outerbox.col et outerbox.border.

visweb(mosquin1967, circles=TRUE,  boxes=FALSE,  labsize=1, circle.max=3,     circle.col="white" ,outerbox.col="blue3",outerbox.border="red",text="no")

Les fonctions de calcul d’indices

distance_w(net, directed) retourne une matrice renseignant la taille des plus courts chemins entre chaque nœud. L’option directed précise si le réseau est orienté ou non.

betweenness_w(net, directed)  – closeness_w (net, directed) calculent les indices betweenness et closeness pour les nœuds à partir de la distance_w() pour le réseau spécifié en paramètre.

sampledata <- rbind(
 c(1,2,3),
 c(2,3,5),
 c(3,1,1),
 c(2,5,6),
 c(1,3,5),
 c(5,2,10),
 c(4,3,10))
> betweenness_w(sampledata,directed=TRUE)
   node betweenness
[1,]    1           4
[2,]    2           5
[3,]    3           5
[4,]    4           0
[5,]    5           0

V.ratio(web) calcule le ratio variance inter noeud (à l’intérieur d’un noeud) / variance intra noeuds (entre les noeuds). Ce ratio a été suggéré, en écologie, par Schluter pour les variances inter et intra espèces.

degreedistr(web, plot.it, level) calcule le degré de chaque noeud, construit la fonction de répartition associée, et y ajuste les distributions théoriques de la loi exponentielle,  de la loi de puissance et de la loi de puissance tronquée. La fonction retourne les coefficients et les ajustements, l’option plot.it=True permet de représenter ces ajustements. Il est également possible de faire cette analyse sur un des deux niveaux du réseau (level= »high », « low », « both »).

second.extinct(réseau,participant,method): Simule les répercussions au sein du réseau lorsqu’un ou plusieurs noeuds sont supprimés. En écologie, cette fonction s’apparente à la simulation des conséquences de l’extinction d’une espèce. Les options participant et method permettent respectivement de définir le niveau trophique  des espèces concernées par l’extinction et la méthode de simulation à utiliser. Pour cela, différentes méthodes sont proposées : random (méthode aléatoire), un nœud est aléatoirement retiré du réseau ; abundance (méthode par défaut) : le nœud avec la plus faible abondance est retiré du réseau. Les options ext.row et ext.col  donnent la liste des nœuds.

networklevel(web) : Calcule une série d’indices associé au réseau bipartite tels que la densité (« connectance »), le rapport de variance (V.ratio), l’asymétrie du réseau (« web asymmetry »), le nombre de regroupement (« number of compartment »)… Il est possible de ne demander la compilation que d’un certain nombre d’indices avec l’option index. Attention, l’orthographe des indices doit parfaitement correspondre.

Pour ne calculer que la densité et l’asymétrie du réseau mosquin1967 sur le niveau supérieur du réseau (option level), il suffit de lancer la fonction suivante :

networklevel(mosquin1967,index=c(“connectance”,  ”web asymmetry”), level=”higher”)

specieslevel(web) est équivalent à la fonction networklevel() pour les nœuds. Le code R ci-après permet de calculer les degrés, les degrés normalisés, les indices de closeness et betweenness de tous les nœuds du réseau.

specieslevel(mosquin1967,index=c(“degree”,”ND”,”closeness”,”betweenness”),level=”both”)

La  robustesse du réseau

null.distr(N, web, dist) : A partir du réseau en paramètre, ajuste les totaux marginaux à partir de la distribution spécifiée en option (distr=”lognormal”,”negbin”) et simule N modèles nuls en fonction des distributions marginales ajustées.

null.t.test(web, N) : Basé sur un test de Student, ce test compare la matrice réseau entrée en paramètre avec un réseau aléatoire pour tester la validité d’un réseau. Il est possible de tester le réseau avec plusieurs réseaux aléatoires à l’aide du paramètre N. La fonction renvoie un tableau avec les valeurs observés, la moyenne sous l’hypothèse nulle, les bornes supérieures et inférieures de l’intervalle de confiance à 95%

Extensions

Pour le calcul d’indicateurs de réseaux multipartites : npartite(..)

Affichage de réseaux tripartite : plotweb2(..)

 

Ce billet a été rédigé par Camille Brisson et Chloé Migayrou dans le cadre d’un cours d’analyse de réseaux dispensé par Laurent Beauguitte à l’ENSAI.


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *