diff --git a/chapters/day2.html b/chapters/day2.html index b2178b5..3badba6 100644 --- a/chapters/day2.html +++ b/chapters/day2.html @@ -353,8 +353,8 @@
1.1. degrees
1.2. trophic levels
-1.3. modularity and clustering
-1.4. generalism, network specialization, nestedness
+1.3. generalism, network specialization
+1.4. modularity, clustering, nestedness
1.5. robustness to species removal
1.6. \(\beta\) diversity of networks
The script script_metricsnull.R contains the examples given in the presentation. The source script functions.R contains the functions especially devised for this course. The source script crutch_functions.R is only useful if the FWebs package cannot be installed/compiled on your computer.
-source('functions.R')
+The script script_metricsnull_v2.R contains the examples given in the presentation. The source script functions.R contains the functions especially devised for this course.
load("mg1.Rdata")
+source('functions.R')
We will make use of two real datasets: Food web data from Cruz-Escalona, V. H., Arreguin-Sanchez, F. & Zetina-Rejon, M. (2007) Analysis of the ecosystem structure of Laguna Alvarado, western Gulf of Mexico, by means of a mass balance model. Estuarine, Coastal and Shelf Science, 72, 155-167.
-mat_foodweb<-t(as.matrix(mg1[[1]][[223]]))
-rownames(mat_foodweb)<-names(mg1[[1]][[223]])
-colnames(mat_foodweb)<-names(mg1[[1]][[223]])
+mat_foodweb<-t(as.matrix(mg1[[1]][[433]]))
+rownames(mat_foodweb)<-names(mg1[[1]][[433]])
+colnames(mat_foodweb)<-names(mg1[[1]][[433]])
Plant-pollinator data from Barrett, S. C. H. & Helenurm, K. (1987) The reproductive biology of boreal forest herbs. I. Breeding systems and pollination. Canadian Journal of Botany, 65, 2036-2046.
mat_plantpol<-barrett1987
mat_plantpol_bin<-mat_plantpol
@@ -378,15 +379,16 @@ Preamble
One of the most useful R objects to work on networks is the graph, created through the igraph package. Here is a collection of examples, using functions from different packages for graphical display.
+One of the most useful R objects to work on networks is the graph, created through the igraph package. Here is a collection of examples, using functions from different packages for graphical display.
foodweb<-graph_from_adjacency_matrix(mat_foodweb)
+foodweb<-largest_component(foodweb)
plot(foodweb,layout=layout_as_food_web3(foodweb))
-plotMyMatrix(as_adj(foodweb,sparse=FALSE))
-undirected_foodweb<-as.undirected(foodweb)
plotMyMatrix(as_adj(undirected_foodweb,sparse=FALSE))
-pollination<-graph_from_biadjacency_matrix(mat_plantpol)
plot(pollination,layout=layout_as_bipartite)
pollination_bin<-graph_from_biadjacency_matrix(mat_plantpol_bin)
plotweb(mat_plantpol)
-In the following: - foodweb is a directed binary network - undirected_foodweb is its undirected equivalent (the adjacency matrix has been made symmetric) - pollination is a weighted bipartite network - pollination_bin is its binarized version
FWebs and bipartite both yield lots of ‘’built-in automatic outputs’’, accessible through the following commands for instance:
+The functions salvaged from FWebs and the bipartite package both yield lots of ‘’built-in automatic outputs’’, accessible through the following commands for instance:
fw.metrics(list(list(mat_foodweb)))
## Computing network metrics for food web 1 of 1...
## $number_nodes
## [1] 106
##
## $number_links
-## [1] 300
+## [1] 233
##
## $link_density
-## [1] 2.830189
+## [1] 2.198113
##
## $connectance
-## [1] 0.02695418
+## [1] 0.02093441
##
## $compartmentalization
## [1] NaN
##
## $maximum_trophic_level
-## [1] 3.902716
+## [1] 3.84058
networklevel(mat_plantpol)
-## connectance web asymmetry
-## 0.13643791 0.78947368
-## links per species number of compartments
-## 1.46491228 2.00000000
-## compartment diversity cluster coefficient
-## 1.09233738 0.08333333
-## modularity Q nestedness
-## 0.56789091 10.23754699
-## NODF weighted nestedness
-## 30.78467181 0.66555488
-## weighted NODF interaction strength asymmetry
-## 13.49547377 0.23565934
-## specialisation asymmetry linkage density
-## -0.20755966 9.29902902
-## weighted connectance Fisher alpha
-## 0.08157043 81.60982542
-## Shannon diversity interaction evenness
-## 4.11901613 0.57933698
-## Alatalo interaction evenness H2
-## 0.38703061 0.57807328
-## number.of.species.HL number.of.species.LL
-## 102.00000000 12.00000000
-## mean.number.of.shared.partners.HL mean.number.of.shared.partners.LL
-## 0.56105611 2.07575758
-## cluster.coefficient.HL cluster.coefficient.LL
-## 0.29803030 0.28659537
-## weighted.cluster.coefficient.HL weighted.cluster.coefficient.LL
-## 0.83564121 0.17336473
-## niche.overlap.HL niche.overlap.LL
-## 0.34762949 0.13855758
-## togetherness.HL togetherness.LL
-## 0.14499265 0.05157815
-## C.score.HL C.score.LL
-## 0.50388420 0.59112597
-## V.ratio.HL V.ratio.LL
-## 1.54171552 27.81509917
-## discrepancy.HL discrepancy.LL
-## 71.00000000 63.00000000
-## extinction.slope.HL extinction.slope.LL
-## 5.03901043 1.31930756
-## robustness.HL robustness.LL
-## 0.81044468 0.48828945
-## functional.complementarity.HL functional.complementarity.LL
-## 382.39912254 338.58919107
-## partner.diversity.HL partner.diversity.LL
-## 0.68675599 2.17835524
-## generality.HL vulnerability.LL
-## 2.31225322 16.28580482
+## connectance web asymmetry links per species number of compartments
+## 0.13643791 0.78947368 1.46491228 2.00000000
+## compartment diversity cluster coefficient modularity Q nestedness
+## 1.09233738 0.08333333 0.56737521 10.23333209
+## NODF weighted nestedness weighted NODF spectral radius
+## 30.78467181 0.66719667 13.49547377 72.55427745
+## interaction strength asymmetry specialisation asymmetry linkage density weighted connectance
+## 0.23565934 -0.20755966 9.29902902 0.08157043
+## Fisher alpha Shannon diversity interaction evenness Alatalo interaction evenness
+## 81.60982933 4.11901613 0.57933698 0.38703061
+## H2 number.of.species.HL number.of.species.LL mean.number.of.shared.partners.HL
+## 0.57807328 102.00000000 12.00000000 0.56105611
+## mean.number.of.shared.partners.LL cluster.coefficient.HL cluster.coefficient.LL weighted.cluster.coefficient.HL
+## 2.07575758 0.29803030 0.28659537 0.83564121
+## weighted.cluster.coefficient.LL niche.overlap.HL niche.overlap.LL togetherness.HL
+## 0.17336473 0.34762949 0.13855758 0.14499265
+## togetherness.LL C.score.HL C.score.LL V.ratio.HL
+## 0.05157815 0.50388420 0.59112597 1.54171552
+## V.ratio.LL discrepancy.HL discrepancy.LL extinction.slope.HL
+## 27.81509917 71.00000000 63.00000000 5.84839013
+## extinction.slope.LL robustness.HL robustness.LL functional.complementarity.HL
+## 1.54269007 0.82379068 0.52452619 382.39912254
+## functional.complementarity.LL partner.diversity.HL partner.diversity.LL generality.HL
+## 338.58919107 0.68675599 2.17835524 2.31225322
+## vulnerability.LL
+## 16.28580482
The issue is that not all these outputs are equally useful… Let’s dissect them one by one.
A basic element of representation of networks is the degree of a node. The degree of a node is the number of interactions it shares with other nodes. For undirected networks, this definition is straightforward and corresponds to row- or column-sums of the binary adjacency matrix. For directed networks, one actually needs to define the in-degree and out-degree of each node, which correspond respectively to the number of incoming and outgoing edges. The function degree of igraph computes all of these using the argument called mode.
-degree(foodweb)
-## Unicellular algae Filamentous algae Ostracoda
-## 31 31 8
-## Alona Chydorus Paracyclops
-## 7 6 6
-## Keratella Lepadella Cephalodella
-## 4 7 7
-## Monommata Lecane Bdelloidea
-## 7 7 8
-## Eucyclops Arcella Difflugia
-## 12 8 4
-## Centropyxis Nebella Quadrulella
-## 2 4 4
-## Heleopera Euglypha Trinema
-## 4 4 4
-## Cyphoderia Vorticella Heliozoa
-## 6 3 5
-## Ploesoma Oligochaeta Nematoda
-## 10 5 6
-## Polypedilum Leptonema Hydrophilus
-## 8 6 4
-## Tupiperla Heterelmis (larvae) Corynoneura
-## 8 6 6
-## Limnophyes Polypedilum gr. Fallax Tanytarsini Genus B
-## 4 4 3
-## Cricotopus sp. 2 Metriocnemus Tanytarsini Genus A
-## 4 5 1
-## Pentaneura Cricotopus sp. 1 Rheotanytarsus
-## 8 7 8
-## Turbellaria Hydrozoa Phylloicus
-## 26 6 2
-## Laccophilus Brachycera Thienemaniella sp3
-## 1 4 4
-## Nanocladius Cryptochironomus Acarina
-## 5 4 14
-## Saetheria sp. 2 Tanytarsini Genus D Polypedilum (Tripoudura)
-## 2 1 2
-## Limnocoris Hexatoma Phaenopsectra
-## 1 2 2
-## Simuliidae Stenochironomus Imparfinis mirini
-## 4 4 23
-## Hirudinea Amphipoda Collembola
-## 1 4 3
-## Baetis Oecetis Aphyla
-## 1 2 1
-## Progomphus Castoraeshna Libellulidae
-## 3 2 4
-## Hetaerina Enallagma Cordulidae
-## 4 4 3
-## Gyretes (larvae) Gyretes (adult) Megadytes (larvae)
-## 1 1 1
-## Tropisternus Hydrotassa Dryops
-## 1 1 1
-## Ceratopogonidae sp. 1 Ceratopogonidae sp. 2 Procladius
-## 1 1 1
-## Parametriocnemus Chironomini Xestochironomus
-## 1 1 1
-## Saetheria sp. 1 Tribellos sp. 1 Goldichironomus
-## 2 2 1
-## Constempellina Organic matter Vascular hydrophytes
-## 0 58 13
-## Paratendipes Dixella Hisonotus sp.
-## 4 0 4
-## Geophagus brasiliensis Astyanax scabripinnis Characidium schubarti
-## 12 17 12
-## Hoplias malabaricus Nimbocera paulensis Terrestrial insects
-## 1 0 4
-## Euchanis Leusquereusia Petrophyla sp2
-## 7 2 4
-## Petrophyla sp1 Ababesmya karelia Megapodogrionidae sp1
-## 1 5 3
-## Megapodogrionidae sp2
-## 5
-degree(foodweb,mode="in")
-## Unicellular algae Filamentous algae Ostracoda
-## 0 0 2
-## Alona Chydorus Paracyclops
-## 3 2 1
-## Keratella Lepadella Cephalodella
-## 1 3 3
-## Monommata Lecane Bdelloidea
-## 3 3 3
-## Eucyclops Arcella Difflugia
-## 7 3 2
-## Centropyxis Nebella Quadrulella
-## 1 3 3
-## Heleopera Euglypha Trinema
-## 3 3 3
-## Cyphoderia Vorticella Heliozoa
-## 3 1 4
-## Ploesoma Oligochaeta Nematoda
-## 7 1 3
-## Polypedilum Leptonema Hydrophilus
-## 3 2 3
-## Tupiperla Heterelmis (larvae) Corynoneura
-## 4 1 1
-## Limnophyes Polypedilum gr. Fallax Tanytarsini Genus B
-## 1 3 0
-## Cricotopus sp. 2 Metriocnemus Tanytarsini Genus A
-## 3 3 0
-## Pentaneura Cricotopus sp. 1 Rheotanytarsus
-## 5 1 2
-## Turbellaria Hydrozoa Phylloicus
-## 25 5 1
-## Laccophilus Brachycera Thienemaniella sp3
-## 0 1 1
-## Nanocladius Cryptochironomus Acarina
-## 2 3 9
-## Saetheria sp. 2 Tanytarsini Genus D Polypedilum (Tripoudura)
-## 1 0 1
-## Limnocoris Hexatoma Phaenopsectra
-## 0 1 1
-## Simuliidae Stenochironomus Imparfinis mirini
-## 3 3 22
-## Hirudinea Amphipoda Collembola
-## 1 4 3
-## Baetis Oecetis Aphyla
-## 1 2 1
-## Progomphus Castoraeshna Libellulidae
-## 3 2 4
-## Hetaerina Enallagma Cordulidae
-## 4 4 3
-## Gyretes (larvae) Gyretes (adult) Megadytes (larvae)
-## 1 1 1
-## Tropisternus Hydrotassa Dryops
-## 1 1 1
-## Ceratopogonidae sp. 1 Ceratopogonidae sp. 2 Procladius
-## 1 1 1
-## Parametriocnemus Chironomini Xestochironomus
-## 1 1 1
-## Saetheria sp. 1 Tribellos sp. 1 Goldichironomus
-## 2 2 1
-## Constempellina Organic matter Vascular hydrophytes
-## 0 0 0
-## Paratendipes Dixella Hisonotus sp.
-## 4 0 4
-## Geophagus brasiliensis Astyanax scabripinnis Characidium schubarti
-## 12 17 12
-## Hoplias malabaricus Nimbocera paulensis Terrestrial insects
-## 1 0 0
-## Euchanis Leusquereusia Petrophyla sp2
-## 3 1 3
-## Petrophyla sp1 Ababesmya karelia Megapodogrionidae sp1
-## 1 3 3
-## Megapodogrionidae sp2
-## 5
-degree(foodweb,mode="out")
-## Unicellular algae Filamentous algae Ostracoda
-## 31 31 6
-## Alona Chydorus Paracyclops
-## 4 4 5
-## Keratella Lepadella Cephalodella
-## 3 4 4
-## Monommata Lecane Bdelloidea
-## 4 4 5
-## Eucyclops Arcella Difflugia
-## 5 5 2
-## Centropyxis Nebella Quadrulella
-## 1 1 1
-## Heleopera Euglypha Trinema
-## 1 1 1
-## Cyphoderia Vorticella Heliozoa
-## 3 2 1
-## Ploesoma Oligochaeta Nematoda
-## 3 4 3
-## Polypedilum Leptonema Hydrophilus
-## 5 4 1
-## Tupiperla Heterelmis (larvae) Corynoneura
-## 4 5 5
-## Limnophyes Polypedilum gr. Fallax Tanytarsini Genus B
-## 3 1 3
-## Cricotopus sp. 2 Metriocnemus Tanytarsini Genus A
-## 1 2 1
-## Pentaneura Cricotopus sp. 1 Rheotanytarsus
-## 3 6 6
-## Turbellaria Hydrozoa Phylloicus
-## 1 1 1
-## Laccophilus Brachycera Thienemaniella sp3
-## 1 3 3
-## Nanocladius Cryptochironomus Acarina
-## 3 1 5
-## Saetheria sp. 2 Tanytarsini Genus D Polypedilum (Tripoudura)
-## 1 1 1
-## Limnocoris Hexatoma Phaenopsectra
-## 1 1 1
-## Simuliidae Stenochironomus Imparfinis mirini
-## 1 1 1
-## Hirudinea Amphipoda Collembola
-## 0 0 0
-## Baetis Oecetis Aphyla
-## 0 0 0
-## Progomphus Castoraeshna Libellulidae
-## 0 0 0
-## Hetaerina Enallagma Cordulidae
-## 0 0 0
-## Gyretes (larvae) Gyretes (adult) Megadytes (larvae)
-## 0 0 0
-## Tropisternus Hydrotassa Dryops
-## 0 0 0
-## Ceratopogonidae sp. 1 Ceratopogonidae sp. 2 Procladius
-## 0 0 0
-## Parametriocnemus Chironomini Xestochironomus
-## 0 0 0
-## Saetheria sp. 1 Tribellos sp. 1 Goldichironomus
-## 0 0 0
-## Constempellina Organic matter Vascular hydrophytes
-## 0 58 13
-## Paratendipes Dixella Hisonotus sp.
-## 0 0 0
-## Geophagus brasiliensis Astyanax scabripinnis Characidium schubarti
-## 0 0 0
-## Hoplias malabaricus Nimbocera paulensis Terrestrial insects
-## 0 0 4
-## Euchanis Leusquereusia Petrophyla sp2
-## 4 1 1
-## Petrophyla sp1 Ababesmya karelia Megapodogrionidae sp1
-## 0 2 0
-## Megapodogrionidae sp2
-## 0
-The degree distribution corresponds to the realized empirical distribution of degrees in the network. Different operations can be done with a degree distribution: 1. it can be computed empirically 2. one can generate similar networks from a degree sequence 3. a degree distribution can be compared to existing benchmark distributions
-Here are three different ways to represent a degree distribution, using different functions from different packages.
-hist(degree(foodweb),breaks=0:max(degree(foodweb)))
-plot(degree_distribution(foodweb, cumulative = TRUE),type="l")
-dd.fw(list(as.data.frame(mat_foodweb)), log = FALSE, cumulative = TRUE)
-## iter degree1 probability
-## 1 iter1 1 0.971698113
-## 2 iter1 2 0.764150943
-## 3 iter1 3 0.660377358
-## 4 iter1 4 0.603773585
-## 5 iter1 5 0.377358491
-## 6 iter1 6 0.320754717
-## 7 iter1 7 0.245283019
-## 8 iter1 8 0.179245283
-## 9 iter1 9 0.113207547
-## 10 iter1 10 0.113207547
-## 11 iter1 11 0.103773585
-## 12 iter1 12 0.103773585
-## 13 iter1 13 0.075471698
-## 14 iter1 14 0.066037736
-## 15 iter1 15 0.056603774
-## 16 iter1 16 0.056603774
-## 17 iter1 17 0.056603774
-## 18 iter1 18 0.047169811
-## 19 iter1 19 0.047169811
-## 20 iter1 20 0.047169811
-## 21 iter1 21 0.047169811
-## 22 iter1 22 0.047169811
-## 23 iter1 23 0.047169811
-## 24 iter1 24 0.037735849
-## 25 iter1 25 0.037735849
-## 26 iter1 26 0.037735849
-## 27 iter1 27 0.028301887
-## 28 iter1 28 0.028301887
-## 29 iter1 29 0.028301887
-## 30 iter1 30 0.028301887
-## 31 iter1 31 0.028301887
-## 32 iter1 32 0.009433962
-## 33 iter1 33 0.009433962
-## 34 iter1 34 0.009433962
-## 35 iter1 35 0.009433962
-## 36 iter1 36 0.009433962
-## 37 iter1 37 0.009433962
-## 38 iter1 38 0.009433962
-## 39 iter1 39 0.009433962
-## 40 iter1 40 0.009433962
-## 41 iter1 41 0.009433962
-## 42 iter1 42 0.009433962
-## 43 iter1 43 0.009433962
-## 44 iter1 44 0.009433962
-## 45 iter1 45 0.009433962
-## 46 iter1 46 0.009433962
-## 47 iter1 47 0.009433962
-## 48 iter1 48 0.009433962
-## 49 iter1 49 0.009433962
-## 50 iter1 50 0.009433962
-## 51 iter1 51 0.009433962
-## 52 iter1 52 0.009433962
-## 53 iter1 53 0.009433962
-## 54 iter1 54 0.009433962
-## 55 iter1 55 0.009433962
-## 56 iter1 56 0.009433962
-## 57 iter1 57 0.009433962
-## 58 iter1 58 0.009433962
-Using simple tests (here, Kolmogorov-Smirnov’s test), one can compare an empirical distribution of degrees to benchmark distributions, such as the binomial, Poisson or negative binomial.
-ks.test(degree(foodweb),"pbinom",size=length(V(foodweb)),prob=mean(degree(foodweb))/length(V(foodweb)))
-## Warning in ks.test.default(degree(foodweb), "pbinom", size =
-## length(V(foodweb)), : aucun ex-aequo ne devrait être présent pour le test de
-## Kolmogorov-Smirnov
-##
-## Asymptotic one-sample Kolmogorov-Smirnov test
-##
-## data: degree(foodweb)
-## D = 0.29636, p-value = 1.64e-08
-## alternative hypothesis: two-sided
-ks.test(degree(foodweb),"ppois",lambda=mean(degree(foodweb)))
-## Warning in ks.test.default(degree(foodweb), "ppois", lambda =
-## mean(degree(foodweb))): aucun ex-aequo ne devrait être présent pour le test de
-## Kolmogorov-Smirnov
-##
-## Asymptotic one-sample Kolmogorov-Smirnov test
-##
-## data: degree(foodweb)
-## D = 0.28956, p-value = 3.813e-08
-## alternative hypothesis: two-sided
-ks.test(degree(foodweb),"pnbinom",mu = mean(degree(foodweb)), size = mean(degree(foodweb))^2/(var(degree(foodweb))-mean(degree(foodweb))))
-## Warning in ks.test.default(degree(foodweb), "pnbinom", mu =
-## mean(degree(foodweb)), : aucun ex-aequo ne devrait être présent pour le test de
-## Kolmogorov-Smirnov
-##
-## Asymptotic one-sample Kolmogorov-Smirnov test
-##
-## data: degree(foodweb)
-## D = 0.3424, p-value = 3.213e-11
-## alternative hypothesis: two-sided
-Power laws are among the most popular distributions of degrees discussed in the literature. However, a question worth asking is whether power laws are useful in ecology, i.e. whether it is actually possible to ascertain power-lawed degrees in ecological networks. As Stumpf and Porter (2012) clearly articulated, this would require to have degrees ranging at the very least between 1 and 100 (2 orders of magnitude), which is quite unheard of.
-Connectance is an important notion. It is defined as the proportion of possible interactions that really exist. There are plenty of ways to implement its computation (e.g. using mean), but it is important to correct these according to the impossible interactions (e.g. correcting for self-links or edges within levels in bipartite networks).
-Here, using basic functions as well as some from cheddar and FWebs.
-mean(mat_foodweb)
-## [1] 0.02669989
-DirectedConnectance(as_Community(foodweb))
-## [1] 0.02669989
-mean(as_adj(undirected_foodweb,sparse=FALSE))/2
-## [1] 0.02669989
-mean(as_adj(foodweb,sparse=FALSE))
-## [1] 0.02669989
-fw.metrics(list(list(mat_foodweb)))$connectance
-## Computing network metrics for food web 1 of 1...
-## [1] 0.02695418
-Trophic levels classically correspond to the number of trophic links between a species and any basal species (primary producers) + 1. Basal species always belong to level 1 and consumers of basal species belong to species 2, etc. Complexity arises when species are omnivorous and can feed on multiple trophic levels. The package cheddar has methods to compute all the classic trophic levels. For instance, the first column of foodweb_TL gives trophic levels as computed using the ‘’shortest path’’ method (TL of a species is exactly 1+the size of the shortest path to any basal species) while the third column yields the longest trophic level (the longest path linking the focal species to any basal species).
+Trophic levels classically correspond to the number of trophic links between a species and any basal species (primary producers) + 1. Basal species always belong to level 1 and consumers of basal species belong to species 2, etc. Complexity arises when species are omnivorous and can feed on multiple trophic levels. The package cheddar has methods to compute all the classic trophic levels. For instance, the first column of foodweb_TL gives trophic levels as computed using the ‘’shortest path’’ method (TL of a species is exactly 1+the size of the shortest path to any basal species) while the third column yields the longest trophic level (the longest path linking the focal species to any basal species).
foodweb_TL<-TrophicLevels(as_Community(foodweb))
-plotMyMatrix(mat_foodweb,clustering=list("row"=foodweb_TL[,1],"col"=foodweb_TL[,1]))
-plotMyMatrix(mat_foodweb,clustering=list("row"=foodweb_TL[,3],"col"=foodweb_TL[,3]))
-Another possible measure of trophic levels is the top-down measure of MacKay et al., which is based on the use of a normalized Laplacian of the graph. It yields a measure of trophic level that is maximal for apex predators and decreases according to the distance between species and the apex predators (more or less). Because this trophic level score depends on the Laplacian, it requires a single-component network (to be checked before using it). Here we use it on the largest component of foodweb.
-count_components(foodweb)
-## [1] 4
-tl.1<-trophic_levels(largest_component(foodweb))
-
-plot(TrophicLevels(as_Community(largest_component(foodweb),"."))[,1],tl.1[,1],xlab="ShortestTL",ylab="MacKayTL")
-plot(TrophicLevels(as_Community(largest_component(foodweb),"."))[,6],tl.1[,1],xlab="PreyAveragedTL",ylab="MacKayTL")
-plotMyMatrix(as_adj(foodweb,sparse=FALSE),clustering=list("row"=foodweb_TL[,3],"col"=foodweb_TL[,3]))
+Another possible measure of trophic levels is the top-down measure of MacKay et al., which is based on the use of a normalized Laplacian of the graph. It yields a measure of trophic level that is maximal for apex predators and decreases according to the distance between species and the apex predators (more or less).
+tl.1<-trophic_levels(foodweb)
+
+plot(TrophicLevels(as_Community(foodweb,"."))[,1],tl.1[,1],xlab="ShortestTL",ylab="MacKayTL")
+plot(TrophicLevels(as_Community(foodweb,"."))[,6],tl.1[,1],xlab="PreyAveragedTL",ylab="MacKayTL")
+These plots show the correspondence between the classic TL 1 (shortest path) and 6 (prey-averaged TL) and MacKay’s TL definition.
Ecological interaction networks can have non-random structures. In ecology, we tend to focus on two such structures: modularity (on the left) and nestedness (on the right).
In ecology, one nagging question is whether we can reliably tell the level of specialization of the different species, i.e. whether they depend on a single species or can substitute one interactor species for another one.
+Blüthgen et al. (2006) proposed a metric (often noted \(d_i\) or \(d^\prime_i\) in its relative version) to work out the level of specialisation of a species based on weighted interactions, using the following equation: \[d_i = \sum_j \frac{w_{ij}}{W_{i\cdot}} ln\left[ \frac{w_{ij}W_{\cdot \cdot}}{W_{i\cdot}W_{\cdot j}}\right]\] where \(w_{ij}\) is the weight of the interaction between species \(i\) and \(j\), \(W_{i\cdot}\) is the sum of all interactions of species \(i\) (row sum), \(W_{\cdot j}\) is the sum of all interactions of species \(j\) (column sum), and \(W_{\cdot \cdot}\) is the sum of all interaction weights between all species.
+The following formula yields the relative specialization score, which is always between 0 and 1: \[d^\prime_i = \frac{d_i-d_{min}}{d_{max}-d_{min}}\] where the \(d_{min}\) and \(d_{max}\) values are obtained from theoretical minimum and maximum.
+The dfun function in the package bipartite does the computation of both \(d\) and \(d^\prime\), but the computation of \(d_{min}\) is not always accurate. One can check the relationship between specialization and degree with a simple scatter plot.
dfun(mat_plantpol)
+## $dprime
+## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis Cornus.canadensis Cypripedium.acaule Linnaea.borealis
+## 0.4029868 0.8734263 0.4617572 0.5573480 0.1978600 0.5606655
+## Maianthemum.canadense Medeola.virginiana Oxalis.montana Pyrola.secunda Trientalis.borealis Trillium.undulatum
+## 0.6348963 1.0000000 0.7139439 0.5462431 0.7462165 0.4919476
+##
+## $d
+## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis Cornus.canadensis Cypripedium.acaule Linnaea.borealis
+## 0.9987162 1.8296061 1.6615624 0.7119762 1.3358969 1.6530716
+## Maianthemum.canadense Medeola.virginiana Oxalis.montana Pyrola.secunda Trientalis.borealis Trillium.undulatum
+## 1.2600139 6.3099183 1.4272914 3.0608135 4.1383474 2.8379140
+##
+## $dmin
+## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis Cornus.canadensis Cypripedium.acaule Linnaea.borealis
+## 0.2416664 0.2299450 0.4001940 0.1076680 0.6219049 0.3182885
+## Maianthemum.canadense Medeola.virginiana Oxalis.montana Pyrola.secunda Trientalis.borealis Trillium.undulatum
+## 0.2040323 1.6655274 0.2088886 0.8183194 0.9834566 0.8183194
+##
+## $dmax
+## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis Cornus.canadensis Cypripedium.acaule Linnaea.borealis
+## 2.120264 2.061423 3.131864 1.191924 4.230477 2.699000
+## Maianthemum.canadense Medeola.virginiana Oxalis.montana Pyrola.secunda Trientalis.borealis Trillium.undulatum
+## 1.867267 6.309918 1.915469 4.923624 5.211306 4.923624
+plot(degree(pollination)[!V(pollination_bin)$type],dfun(mat_plantpol)$dprime,xlab="degrees",ylab="d'")
+This function was coded for bipartite networks, but you need to transpose the bi-adjacency matrix to obtain the values of \(d\) or \(d^\prime\) for the other level.
+dfun(t(mat_plantpol))
+## $dprime
+## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp. Andrena.melanochroa Andrena.miranda
+## 0.00000000 0.21563785 0.07436233 0.13593241 0.04749160
+## Andrena.nivalis Andrena.rufosignata Andrena.sigmundi Andrena.thaspii Andrena.wheeleri
+## 0.00000000 0.07436233 0.00000000 0.00000000 0.18138730
+## Andrena.wilkella Andrena.w.scripta Anthaxia.expansa Anthonomus.sp. Blera.badia
+## 0.37904305 0.19882256 0.26144023 0.00000000 0.00000000
+## Blera.confusa Blera.nigripes Bombus.perplexus Bombus.ternarius Bombus.terricola
+## 0.28139346 0.00000000 0.19070143 0.27712368 0.17343875
+## Bombus.vagans Bombylius.major Bombylius.pigmaeus Cantharis.sp. Carposcalis.confusus
+## 0.15129125 0.16064599 0.13195455 0.00000000 0.38747019
+## Carposcalis.obscura Cateres.pennatus Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
+## 0.78534318 0.18138730 0.07436233 0.00000000 0.00000000
+## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes Cheilosia.sialia Cheilosia.slossonae
+## 0.00000000 0.07436233 0.22572129 0.07436233 0.13195455
+## Cheilosia.tristis Crabro.sp. Dalopius.sp. Dialictus.cressoni Dialictus.imitatus
+## 0.18138730 0.08699553 0.00000000 0.20792957 0.22937119
+## Dialictus.sp. Eclimus.harrisi Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
+## 0.16289528 0.30481234 1.00000000 0.13195455 0.00000000
+## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos Eusphalerum.sp. Evodinus.monticola
+## 0.29446614 0.38985945 0.32822619 0.70755994 0.00000000
+## Evylaeus.divergens Evylaeus.quebecensis Fannia.ungulata Halictus.confusus Halictus.rubicundus
+## 0.00000000 0.14829973 0.38962890 0.00000000 0.09710005
+## Hoplitis.producta Hylaeus.basalis Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
+## 0.72913325 0.00000000 0.55310629 0.29446614 0.00000000
+## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma Melanostoma.sp. Nomada.cuneata
+## 0.00000000 0.02646228 0.15763329 0.22572129 0.13195455
+## Nomada.sayi Orsodacne.atra Orthoneura.pulchella Osmia.lignaria Osmia.proxima
+## 0.00000000 0.00000000 0.04749160 0.37904305 0.10709229
+## Osmia.pumila Paramyia.nitens Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
+## 0.29446614 0.89940438 0.51915999 0.29446614 0.13195455
+## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis Pieris.napi Poanes.hobomok
+## 0.13195455 0.21508697 0.23907334 0.00000000 0.37904305
+## Psithyrus.sp. Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica Sphaerophoria.bifurcata
+## 0.00000000 0.29446614 0.37904305 0.13227114 0.30083960
+## Sphaerophoria.longipilosa Sphaerophoria.sp. Sphecodes.sp. Syritta.pipiens Syritta.rectus
+## 0.00000000 0.19515964 0.07436233 0.00000000 0.00000000
+## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi Thamnotettix.confinis Trachysida.aspera
+## 0.00000000 0.13593241 0.07436233 0.13195455 0.18138730
+## Tropidia.quadrata Tychius.stephensi Vespula.arenaria Xylota.bigelowi Xylota.hinei
+## 0.10189683 0.13593241 0.72913325 0.28139346 0.04749160
+## Xylota.sp. Zeraea.americana
+## 0.00000000 0.08699553
+##
+## $d
+## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp. Andrena.melanochroa Andrena.miranda
+## 1.1919245 1.8672670 1.1919245 1.1919245 0.7805245
+## Andrena.nivalis Andrena.rufosignata Andrena.sigmundi Andrena.thaspii Andrena.wheeleri
+## 0.8364486 1.1919245 1.1919245 1.1919245 2.1202635
+## Andrena.wilkella Andrena.w.scripta Anthaxia.expansa Anthonomus.sp. Blera.badia
+## 3.1318644 0.9311967 1.5625142 1.1919245 1.1919245
+## Blera.confusa Blera.nigripes Bombus.perplexus Bombus.ternarius Bombus.terricola
+## 1.1919245 1.1919245 1.0759162 1.8487036 0.6982811
+## Bombus.vagans Bombylius.major Bombylius.pigmaeus Cantharis.sp. Carposcalis.confusus
+## 0.4146760 0.7984489 1.8672670 1.1919245 1.9571744
+## Carposcalis.obscura Cateres.pennatus Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
+## 5.2113060 2.1202635 1.1919245 1.1919245 1.1919245
+## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes Cheilosia.sialia Cheilosia.slossonae
+## 1.1919245 1.1919245 1.9154691 1.1919245 1.8672670
+## Cheilosia.tristis Crabro.sp. Dalopius.sp. Dialictus.cressoni Dialictus.imitatus
+## 2.1202635 1.2523152 1.1919245 0.9686997 1.9329168
+## Dialictus.sp. Eclimus.harrisi Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
+## 0.4403134 1.7598962 6.3099183 1.8672670 1.1919245
+## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos Eusphalerum.sp. Evodinus.monticola
+## 2.6990004 1.7178941 1.2370680 1.1798908 1.1919245
+## Evylaeus.divergens Evylaeus.quebecensis Fannia.ungulata Halictus.confusus Halictus.rubicundus
+## 0.8364486 0.6271943 2.6990004 1.1919245 1.3006181
+## Hoplitis.producta Hylaeus.basalis Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
+## 4.9236239 1.1919245 2.6990004 2.6990004 1.1919245
+## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma Melanostoma.sp. Nomada.cuneata
+## 1.1919245 0.9629468 1.5899865 1.9154691 1.8672670
+## Nomada.sayi Orsodacne.atra Orthoneura.pulchella Osmia.lignaria Osmia.proxima
+## 1.1919245 1.1919245 0.7805245 3.1318644 1.0577689
+## Osmia.pumila Paramyia.nitens Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
+## 2.6990004 1.9648339 1.2565624 2.6990004 1.8672670
+## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis Pieris.napi Poanes.hobomok
+## 1.8672670 1.5601276 1.0586413 1.1919245 3.1318644
+## Psithyrus.sp. Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica Sphaerophoria.bifurcata
+## 1.1919245 2.6990004 3.1318644 1.4687473 1.5691864
+## Sphaerophoria.longipilosa Sphaerophoria.sp. Sphecodes.sp. Syritta.pipiens Syritta.rectus
+## 1.1919245 1.4674317 1.1919245 1.1919245 1.1919245
+## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi Thamnotettix.confinis Trachysida.aspera
+## 1.1919245 1.1919245 1.1919245 1.8672670 2.1202635
+## Tropidia.quadrata Tychius.stephensi Vespula.arenaria Xylota.bigelowi Xylota.hinei
+## 0.8364486 1.1919245 4.9236239 1.1919245 0.7805245
+## Xylota.sp. Zeraea.americana
+## 1.1919245 1.2523152
+##
+## $dmin
+## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp. Andrena.melanochroa Andrena.miranda
+## 1.191924466 0.836448563 0.836448563 0.559607915 0.559607915
+## Andrena.nivalis Andrena.rufosignata Andrena.sigmundi Andrena.thaspii Andrena.wheeleri
+## 0.836448563 0.836448563 1.191924466 1.191924466 1.191924466
+## Andrena.wilkella Andrena.w.scripta Anthaxia.expansa Anthonomus.sp. Blera.badia
+## 1.191924466 0.112437627 0.372726551 1.191924466 1.191924466
+## Blera.confusa Blera.nigripes Bombus.perplexus Bombus.ternarius Bombus.terricola
+## 0.089460825 1.191924466 0.221831524 0.559607915 0.058989497
+## Bombus.vagans Bombylius.major Bombylius.pigmaeus Cantharis.sp. Carposcalis.confusus
+## 0.025770376 0.116027905 1.191924466 1.191924466 0.221831524
+## Carposcalis.obscura Cateres.pennatus Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
+## 1.191924466 1.191924466 0.836448563 1.191924466 1.191924466
+## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes Cheilosia.sialia Cheilosia.slossonae
+## 1.191924466 0.836448563 0.836448563 0.836448563 1.191924466
+## Cheilosia.tristis Crabro.sp. Dalopius.sp. Dialictus.cressoni Dialictus.imitatus
+## 1.191924466 0.836448563 1.191924466 0.112437627 0.836448563
+## Dialictus.sp. Eclimus.harrisi Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
+## 0.025452320 0.372726551 1.191924466 1.191924466 1.191924466
+## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos Eusphalerum.sp. Evodinus.monticola
+## 1.191924466 0.112437627 0.047925742 0.004890966 1.191924466
+## Evylaeus.divergens Evylaeus.quebecensis Fannia.ungulata Halictus.confusus Halictus.rubicundus
+## 0.836448563 0.070383992 0.836448563 1.191924466 0.836448563
+## Hoplitis.producta Hylaeus.basalis Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
+## 1.191924466 1.191924466 0.221831524 1.191924466 1.191924466
+## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma Melanostoma.sp. Nomada.cuneata
+## 1.191924466 0.836448563 0.836448563 0.836448563 1.191924466
+## Nomada.sayi Orsodacne.atra Orthoneura.pulchella Osmia.lignaria Osmia.proxima
+## 1.191924466 1.191924466 0.559607915 1.191924466 0.559607915
+## Osmia.pumila Paramyia.nitens Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
+## 1.191924466 0.016188829 0.024272240 1.191924466 1.191924466
+## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis Pieris.napi Poanes.hobomok
+## 1.191924466 0.559607915 0.099097400 1.191924466 1.191924466
+## Psithyrus.sp. Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica Sphaerophoria.bifurcata
+## 1.191924466 1.191924466 1.191924466 0.836448563 0.221831524
+## Sphaerophoria.longipilosa Sphaerophoria.sp. Sphecodes.sp. Syritta.pipiens Syritta.rectus
+## 1.191924466 0.559607915 0.836448563 1.191924466 1.191924466
+## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi Thamnotettix.confinis Trachysida.aspera
+## 1.191924466 0.559607915 0.836448563 1.191924466 1.191924466
+## Tropidia.quadrata Tychius.stephensi Vespula.arenaria Xylota.bigelowi Xylota.hinei
+## 0.372726551 0.559607915 1.191924466 0.089460825 0.559607915
+## Xylota.sp. Zeraea.americana
+## 1.191924466 0.836448563
+##
+## $dmax
+## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp. Andrena.melanochroa Andrena.miranda
+## 6.309918 5.616771 5.616771 5.211306 5.211306
+## Andrena.nivalis Andrena.rufosignata Andrena.sigmundi Andrena.thaspii Andrena.wheeleri
+## 5.616771 5.616771 6.309918 6.309918 6.309918
+## Andrena.wilkella Andrena.w.scripta Anthaxia.expansa Anthonomus.sp. Blera.badia
+## 6.309918 4.230477 4.923624 6.309918 6.309918
+## Blera.confusa Blera.nigripes Bombus.perplexus Bombus.ternarius Bombus.terricola
+## 4.007333 6.309918 4.700480 5.211306 3.744969
+## Bombus.vagans Bombylius.major Bombylius.pigmaeus Cantharis.sp. Carposcalis.confusus
+## 2.596346 4.364008 6.309918 6.309918 4.700480
+## Carposcalis.obscura Cateres.pennatus Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
+## 6.309918 6.309918 5.616771 6.309918 6.309918
+## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes Cheilosia.sialia Cheilosia.slossonae
+## 6.309918 5.616771 5.616771 5.616771 6.309918
+## Cheilosia.tristis Crabro.sp. Dalopius.sp. Dialictus.cressoni Dialictus.imitatus
+## 6.309918 5.616771 6.309918 4.230477 5.616771
+## Dialictus.sp. Eclimus.harrisi Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
+## 2.572249 4.923624 6.309918 6.309918 6.309918
+## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos Eusphalerum.sp. Evodinus.monticola
+## 6.309918 4.230477 3.670861 1.665527 6.309918
+## Evylaeus.divergens Evylaeus.quebecensis Fannia.ungulata Halictus.confusus Halictus.rubicundus
+## 5.616771 3.825012 5.616771 6.309918 5.616771
+## Hoplitis.producta Hylaeus.basalis Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
+## 6.309918 6.309918 4.700480 6.309918 6.309918
+## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma Melanostoma.sp. Nomada.cuneata
+## 6.309918 5.616771 5.616771 5.616771 6.309918
+## Nomada.sayi Orsodacne.atra Orthoneura.pulchella Osmia.lignaria Osmia.proxima
+## 6.309918 6.309918 5.211306 6.309918 5.211306
+## Osmia.pumila Paramyia.nitens Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
+## 6.309918 2.182784 2.397895 6.309918 6.309918
+## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis Pieris.napi Poanes.hobomok
+## 6.309918 5.211306 4.112694 6.309918 6.309918
+## Psithyrus.sp. Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica Sphaerophoria.bifurcata
+## 6.309918 6.309918 6.309918 5.616771 4.700480
+## Sphaerophoria.longipilosa Sphaerophoria.sp. Sphecodes.sp. Syritta.pipiens Syritta.rectus
+## 6.309918 5.211306 5.616771 6.309918 6.309918
+## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi Thamnotettix.confinis Trachysida.aspera
+## 6.309918 5.211306 5.616771 6.309918 6.309918
+## Tropidia.quadrata Tychius.stephensi Vespula.arenaria Xylota.bigelowi Xylota.hinei
+## 4.923624 5.211306 6.309918 4.007333 5.211306
+## Xylota.sp. Zeraea.americana
+## 6.309918 5.616771
+plot(degree(pollination)[V(pollination_bin)$type],dfun(t(mat_plantpol))$dprime,xlab="degrees",ylab="d'")
+In the case of unipartite directed networks / food webs, dfun can also be used.
foodweb_spe.res<-dfun(as_adj(foodweb,sparse=FALSE))$dprime #as resource
+foodweb_spe.con<-dfun(t(as_adj(foodweb,sparse=FALSE)))$dprime #as consumer
+interm_species_list<-intersect(names(foodweb_spe.res),names(foodweb_spe.con))
+plot(foodweb_spe.res[which(names(foodweb_spe.res)%in%interm_species_list)],foodweb_spe.con[which(names(foodweb_spe.con)%in%interm_species_list)],xlab="d' as prey",ylab="d' as consumer")
+Blüthgen et al. (2006) also introduced a network-level metric of specialization which is based on Shannon’s entropy. The metric \(H_2\) is simply the entropy of interaction weights and the relative measure \(H_2^\prime\) is its opposite, scaled between 0 and 1.
+H2fun(mat_plantpol)
+## H2 H2min H2max H2uncorr
+## 0.5780733 3.4320000 5.0600000 4.1190000
+Modularity, as defined by Newman, is given by the following formula: \[\begin{equation} Q = \frac{1}{A} \sum_{i,j} \left[ a_{ij} - \frac{d_i d_j}{A}\right]\delta_{ij} \end{equation}\] where \(A\) is the total number of connections in the network (i.e. \(A = \sum_i \sum_j a_{ij}\)), \(d_i\) is the degree of species \(i\) (i.e. \(d_i = \sum_j a_{ij}\)) and the \(\delta_{ij}\) are dummy variables indicating whether species/nodes \(i\) and \(j\) are assumed to belong to the same module/community/cluster. In layman’s terms, modularity is a quantity that measures how ‘’intense’’ interactions are within modules, i.e. compares \(a_{ij}\) to its expectation given the degrees of \(i\) and \(j\), but only taking into account edges within modules. The principle of modularity search is to look for the partitioning of nodes into communities/modules that maximizes the associated modularity score. The problem of modularity search is quite complex (NP-complete problem) and thus can be solved with different algorithms that have their pros and cons.
-Modularity, in its classic form, only works for undirected networks. Three algorithms that are often used in ecology are the edge-betweenness algorithm (EB), the leading-eigenvector one (LE) and the Louvain algorithm (ML).
+Modularity, in its classic form, only works for undirected networks. Three algorithms that are often used in ecology are the edge-betweenness algorithm (EB), the leading-eigenvector one (LE) and the Louvain algorithm (ML). Another useful one (and also more efficient) is simulated annealing, as implementing in rnetcarto.
foodweb_EB.mod<-cluster_edge_betweenness(undirected_foodweb)
foodweb_LE.mod<-cluster_leading_eigen(undirected_foodweb)
-foodweb_ML.mod<-cluster_louvain(undirected_foodweb)
+foodweb_ML.mod<-cluster_louvain(undirected_foodweb)
+foodweb_SA.mod<-cluster_netcarto(undirected_foodweb)
Here is a comparison of modules as obtained through the three algorithms used before.
-par(mfrow=c(1,3))
+Here is a comparison of modules as obtained through the four algorithms used before.
+par(mfrow=c(2,2))
plot(foodweb_EB.mod,foodweb,layout = layout_as_food_web(foodweb))
plot(foodweb_LE.mod,foodweb,layout = layout_as_food_web(foodweb))
-plot(foodweb_ML.mod,foodweb,layout = layout_as_food_web(foodweb))
-
+plot(foodweb_ML.mod,foodweb,layout = layout_as_food_web(foodweb))
+plot(foodweb_SA.mod,foodweb,layout = layout_as_food_web(foodweb))
+It is also possible to plot the modules using the ‘’matrix’’ visualization of networks.
-plotMyMatrix(as_adj(undirected_foodweb,sparse=FALSE),clustering=list("row"=foodweb_ML.mod$membership,"col"=foodweb_ML.mod$membership))
-plotMyMatrix(as_adj(undirected_foodweb,sparse=FALSE),clustering=list("row"=foodweb_SA.mod$membership,"col"=foodweb_SA.mod$membership))
+For the sake of visualizing whether the modules obtained with the different algorithms correspond, we can make use of alluvial plots.
make_alluvial_2(foodweb_ML.mod$membership,foodweb_LE.mod$membership,"Louvain","Leading_eigen")
-make_alluvial_2(foodweb_ML.mod$membership,foodweb_EB.mod$membership,"Louvain","Edge_betweenness")
-make_alluvial_2(foodweb_ML.mod$membership,foodweb_SA.mod$membership,"Louvain","Simulated annealing")
+Modularity work as easily on bipartite networks as on unipartite ones. However, the representation of the modules is more useful when done on the bi-adjacency matrix.
-pollination_LE.mod<-cluster_leading_eigen(pollination_bin)
+pollination_SA.mod<-cluster_netcarto(pollination_bin)
-plotMyMatrix(mat_plantpol_bin,clustering=list("row"=pollination_LE.mod$membership[!V(pollination_bin)$type],"col"=pollination_LE.mod$membership[V(pollination_bin)$type]))
-
+plotMyMatrix(mat_plantpol_bin,clustering=list("row"=pollination_SA.mod$membership[!V(pollination_bin)$type],"col"=pollination_SA.mod$membership[V(pollination_bin)$type]))
+A convenient alternative algorithm to find clusters within a network is spectral clustering. The idea of spectral clustering is to make use of the Laplacian matrix \(L\) of the graph, given by: \[L = D - A\] where \(D\) is the diagonal matrix of nodes’ degrees and \(A\) is the adjacency matrix.
The Laplacian matrix has interesting properties, the best of all being that the number of zeros among its eigenvalues yield the number of components of the graph (one 0 means there is a single connected component, two zeros means the network is split in two disconnected components, etc.). The eigenvectors associated the zero eigenvalues can inform on the membership of nodes to the different components.
-The heuristics of the spectral clustering is to use the eigenvectors associated with the set of small non-zero eigenvalues of \(L\) to deduce the ``almost components’’ of the graph. To do so, one chooses a number of no-zero eigenvalues to keep and then the algorithm uses the associated eigenvector to find the groups through a K-means algorithm on the space obtained with these eigenvectors.
-The function laplacian_spectral_gap computes the ‘’spectral gap’’ plot and tries to find the optimum number of clusters.
+The heuristics of the spectral clustering is to use the eigenvectors associated with the set of small non-zero eigenvalues of \(L\) to deduce the ‘’almost components’’ of the graph. To do so, one chooses a number of no-zero eigenvalues to keep and then the algorithm uses the associated eigenvector to find the groups through a K-means algorithm on the space obtained with these eigenvectors.
+The function laplacian_spectral_gap computes the ‘’spectral gap’’ plot and tries to find the optimum number of clusters.
foodweb_SG<-laplacian_spectral_gap(undirected_foodweb)
-foodweb_SG$optim_n
-## [1] 5
+## [1] 3
Once we know how many clusters we are looking for, we can compute the spectral clustering.
-foodweb_SC<-spectral_clustering(undirected_foodweb,5)
+foodweb_SC<-spectral_clustering(undirected_foodweb,foodweb_SG$optim_n)
plotMyMatrix(as_adj(undirected_foodweb,sparse=FALSE),clustering=list("row"=foodweb_SC,"col"=foodweb_SC))
-
+
modularity(undirected_foodweb,foodweb_SC)
-## [1] 0.2637944
+## [1] 0.3296616
In passing, we note that the modularity of the spectral clustering is not so bad.
With an alluvial plot it is possible to “see” how congruent the modules obtained by the Louvain algorithm are with the clusters identified by the spectral clustering method.
-make_alluvial_2(foodweb_ML.mod$membership,foodweb_SC,"Louvain","Spectral clustering")
-In ecology, one nagging question is whether we can reliably tell the level of specialization of the different species, i.e. whether they depend on a single species or can substitute one interactor species for another one.
-Blüthgen et al. (2006) proposed a metric (often noted \(d_i\) or \(d^\prime_i\) in its relative version) to work out the level of specialisation of a species based on weighted interactions, using the following equation: \[d_i = \sum_j \frac{w_{ij}}{W_i} ln\left[ \frac{w_{ij}W}{W_iW_j}\right]\] where \(w_{ij}\) is the weight of the interaction between species \(i\) and \(j\), \(W_i\) is the sum of all interactions of species \(i\) (row sum), \(W_j\) is the sum of all interactions of species \(j\) (column sum), and \(W\) is the sum of all interaction weights between all species.
-The following formula yields the relative specialization score, which is always between 0 and 1: \[d^\prime_i = \frac{d_i-d_{min}}{d_{max}-d_{min}}\] where the \(d_{min}\) and \(d_{max}\) values are obtained from theoretical minimum and maximum.
-The dfun function in the package bipartite does the computation of both \(d\) and \(d^\prime\), but the computation of \(d_{min}\) is not always accurate. One can check the relationship between specialization and degree with a simple scatter plot.
-dfun(mat_plantpol)
-## $dprime
-## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis
-## 0.4029868 0.8734263 0.4617572
-## Cornus.canadensis Cypripedium.acaule Linnaea.borealis
-## 0.5573480 0.1978600 0.5606655
-## Maianthemum.canadense Medeola.virginiana Oxalis.montana
-## 0.6348963 1.0000000 0.7139439
-## Pyrola.secunda Trientalis.borealis Trillium.undulatum
-## 0.5462431 0.7462165 0.4919476
-##
-## $d
-## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis
-## 0.9987162 1.8296061 1.6615624
-## Cornus.canadensis Cypripedium.acaule Linnaea.borealis
-## 0.7119762 1.3358969 1.6530716
-## Maianthemum.canadense Medeola.virginiana Oxalis.montana
-## 1.2600139 6.3099183 1.4272914
-## Pyrola.secunda Trientalis.borealis Trillium.undulatum
-## 3.0608135 4.1383474 2.8379140
-##
-## $dmin
-## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis
-## 0.2416664 0.2299450 0.4001940
-## Cornus.canadensis Cypripedium.acaule Linnaea.borealis
-## 0.1076680 0.6219049 0.3182885
-## Maianthemum.canadense Medeola.virginiana Oxalis.montana
-## 0.2040323 1.6655274 0.2088886
-## Pyrola.secunda Trientalis.borealis Trillium.undulatum
-## 0.8183194 0.9834566 0.8183194
-##
-## $dmax
-## Aralia.nudicaulis Chimaphila.umbellata Clintonia.borealis
-## 2.120264 2.061423 3.131864
-## Cornus.canadensis Cypripedium.acaule Linnaea.borealis
-## 1.191924 4.230477 2.699000
-## Maianthemum.canadense Medeola.virginiana Oxalis.montana
-## 1.867267 6.309918 1.915469
-## Pyrola.secunda Trientalis.borealis Trillium.undulatum
-## 4.923624 5.211306 4.923624
-plot(degree(pollination)[!V(pollination_bin)$type],dfun(mat_plantpol)$dprime,xlab="degrees",ylab="d'")
-This function was coded for bipartite networks, but you need to transpose the bi-adjacency matrix to obtain the values of \(d\) or \(d^\prime\) for the other level.
-dfun(t(mat_plantpol))
-## $dprime
-## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp.
-## 0.00000000 0.21563785 0.07436233
-## Andrena.melanochroa Andrena.miranda Andrena.nivalis
-## 0.13593241 0.04749160 0.00000000
-## Andrena.rufosignata Andrena.sigmundi Andrena.thaspii
-## 0.07436233 0.00000000 0.00000000
-## Andrena.wheeleri Andrena.wilkella Andrena.w.scripta
-## 0.18138730 0.37904305 0.19882256
-## Anthaxia.expansa Anthonomus.sp. Blera.badia
-## 0.26144023 0.00000000 0.00000000
-## Blera.confusa Blera.nigripes Bombus.perplexus
-## 0.28139346 0.00000000 0.19070143
-## Bombus.ternarius Bombus.terricola Bombus.vagans
-## 0.27712368 0.17343875 0.15129125
-## Bombylius.major Bombylius.pigmaeus Cantharis.sp.
-## 0.16064599 0.13195455 0.00000000
-## Carposcalis.confusus Carposcalis.obscura Cateres.pennatus
-## 0.38747019 0.78534318 0.18138730
-## Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
-## 0.07436233 0.00000000 0.00000000
-## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes
-## 0.00000000 0.07436233 0.22572129
-## Cheilosia.sialia Cheilosia.slossonae Cheilosia.tristis
-## 0.07436233 0.13195455 0.18138730
-## Crabro.sp. Dalopius.sp. Dialictus.cressoni
-## 0.08699553 0.00000000 0.20792957
-## Dialictus.imitatus Dialictus.sp. Eclimus.harrisi
-## 0.22937119 0.16289528 0.30481234
-## Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
-## 1.00000000 0.13195455 0.00000000
-## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos
-## 0.29446614 0.38985945 0.32822619
-## Eusphalerum.sp. Evodinus.monticola Evylaeus.divergens
-## 0.70755994 0.00000000 0.00000000
-## Evylaeus.quebecensis Fannia.ungulata Halictus.confusus
-## 0.14829973 0.38962890 0.00000000
-## Halictus.rubicundus Hoplitis.producta Hylaeus.basalis
-## 0.09710005 0.72913325 0.00000000
-## Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
-## 0.55310629 0.29446614 0.00000000
-## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma
-## 0.00000000 0.02646228 0.15763329
-## Melanostoma.sp. Nomada.cuneata Nomada.sayi
-## 0.22572129 0.13195455 0.00000000
-## Orsodacne.atra Orthoneura.pulchella Osmia.lignaria
-## 0.00000000 0.04749160 0.37904305
-## Osmia.proxima Osmia.pumila Paramyia.nitens
-## 0.10709229 0.29446614 0.89940438
-## Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
-## 0.51915999 0.29446614 0.13195455
-## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis
-## 0.13195455 0.21508697 0.23907334
-## Pieris.napi Poanes.hobomok Psithyrus.sp.
-## 0.00000000 0.37904305 0.00000000
-## Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica
-## 0.29446614 0.37904305 0.13227114
-## Sphaerophoria.bifurcata Sphaerophoria.longipilosa Sphaerophoria.sp.
-## 0.30083960 0.00000000 0.19515964
-## Sphecodes.sp. Syritta.pipiens Syritta.rectus
-## 0.07436233 0.00000000 0.00000000
-## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi
-## 0.00000000 0.13593241 0.07436233
-## Thamnotettix.confinis Trachysida.aspera Tropidia.quadrata
-## 0.13195455 0.18138730 0.10189683
-## Tychius.stephensi Vespula.arenaria Xylota.bigelowi
-## 0.13593241 0.72913325 0.28139346
-## Xylota.hinei Xylota.sp. Zeraea.americana
-## 0.04749160 0.00000000 0.08699553
-##
-## $d
-## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp.
-## 1.1919245 1.8672670 1.1919245
-## Andrena.melanochroa Andrena.miranda Andrena.nivalis
-## 1.1919245 0.7805245 0.8364486
-## Andrena.rufosignata Andrena.sigmundi Andrena.thaspii
-## 1.1919245 1.1919245 1.1919245
-## Andrena.wheeleri Andrena.wilkella Andrena.w.scripta
-## 2.1202635 3.1318644 0.9311967
-## Anthaxia.expansa Anthonomus.sp. Blera.badia
-## 1.5625142 1.1919245 1.1919245
-## Blera.confusa Blera.nigripes Bombus.perplexus
-## 1.1919245 1.1919245 1.0759162
-## Bombus.ternarius Bombus.terricola Bombus.vagans
-## 1.8487036 0.6982811 0.4146760
-## Bombylius.major Bombylius.pigmaeus Cantharis.sp.
-## 0.7984489 1.8672670 1.1919245
-## Carposcalis.confusus Carposcalis.obscura Cateres.pennatus
-## 1.9571744 5.2113060 2.1202635
-## Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
-## 1.1919245 1.1919245 1.1919245
-## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes
-## 1.1919245 1.1919245 1.9154691
-## Cheilosia.sialia Cheilosia.slossonae Cheilosia.tristis
-## 1.1919245 1.8672670 2.1202635
-## Crabro.sp. Dalopius.sp. Dialictus.cressoni
-## 1.2523152 1.1919245 0.9686997
-## Dialictus.imitatus Dialictus.sp. Eclimus.harrisi
-## 1.9329168 0.4403134 1.7598962
-## Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
-## 6.3099183 1.8672670 1.1919245
-## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos
-## 2.6990004 1.7178941 1.2370680
-## Eusphalerum.sp. Evodinus.monticola Evylaeus.divergens
-## 1.1798908 1.1919245 0.8364486
-## Evylaeus.quebecensis Fannia.ungulata Halictus.confusus
-## 0.6271943 2.6990004 1.1919245
-## Halictus.rubicundus Hoplitis.producta Hylaeus.basalis
-## 1.3006181 4.9236239 1.1919245
-## Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
-## 2.6990004 2.6990004 1.1919245
-## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma
-## 1.1919245 0.9629468 1.5899865
-## Melanostoma.sp. Nomada.cuneata Nomada.sayi
-## 1.9154691 1.8672670 1.1919245
-## Orsodacne.atra Orthoneura.pulchella Osmia.lignaria
-## 1.1919245 0.7805245 3.1318644
-## Osmia.proxima Osmia.pumila Paramyia.nitens
-## 1.0577689 2.6990004 1.9648339
-## Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
-## 1.2565624 2.6990004 1.8672670
-## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis
-## 1.8672670 1.5601276 1.0586413
-## Pieris.napi Poanes.hobomok Psithyrus.sp.
-## 1.1919245 3.1318644 1.1919245
-## Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica
-## 2.6990004 3.1318644 1.4687473
-## Sphaerophoria.bifurcata Sphaerophoria.longipilosa Sphaerophoria.sp.
-## 1.5691864 1.1919245 1.4674317
-## Sphecodes.sp. Syritta.pipiens Syritta.rectus
-## 1.1919245 1.1919245 1.1919245
-## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi
-## 1.1919245 1.1919245 1.1919245
-## Thamnotettix.confinis Trachysida.aspera Tropidia.quadrata
-## 1.8672670 2.1202635 0.8364486
-## Tychius.stephensi Vespula.arenaria Xylota.bigelowi
-## 1.1919245 4.9236239 1.1919245
-## Xylota.hinei Xylota.sp. Zeraea.americana
-## 0.7805245 1.1919245 1.2523152
-##
-## $dmin
-## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp.
-## 1.191924466 0.836448563 0.836448563
-## Andrena.melanochroa Andrena.miranda Andrena.nivalis
-## 0.559607915 0.559607915 0.836448563
-## Andrena.rufosignata Andrena.sigmundi Andrena.thaspii
-## 0.836448563 1.191924466 1.191924466
-## Andrena.wheeleri Andrena.wilkella Andrena.w.scripta
-## 1.191924466 1.191924466 0.112437627
-## Anthaxia.expansa Anthonomus.sp. Blera.badia
-## 0.372726551 1.191924466 1.191924466
-## Blera.confusa Blera.nigripes Bombus.perplexus
-## 0.089460825 1.191924466 0.221831524
-## Bombus.ternarius Bombus.terricola Bombus.vagans
-## 0.559607915 0.058989497 0.025770376
-## Bombylius.major Bombylius.pigmaeus Cantharis.sp.
-## 0.116027905 1.191924466 1.191924466
-## Carposcalis.confusus Carposcalis.obscura Cateres.pennatus
-## 0.221831524 1.191924466 1.191924466
-## Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
-## 0.836448563 1.191924466 1.191924466
-## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes
-## 1.191924466 0.836448563 0.836448563
-## Cheilosia.sialia Cheilosia.slossonae Cheilosia.tristis
-## 0.836448563 1.191924466 1.191924466
-## Crabro.sp. Dalopius.sp. Dialictus.cressoni
-## 0.836448563 1.191924466 0.112437627
-## Dialictus.imitatus Dialictus.sp. Eclimus.harrisi
-## 0.836448563 0.025452320 0.372726551
-## Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
-## 1.191924466 1.191924466 1.191924466
-## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos
-## 1.191924466 0.112437627 0.047925742
-## Eusphalerum.sp. Evodinus.monticola Evylaeus.divergens
-## 0.004890966 1.191924466 0.836448563
-## Evylaeus.quebecensis Fannia.ungulata Halictus.confusus
-## 0.070383992 0.836448563 1.191924466
-## Halictus.rubicundus Hoplitis.producta Hylaeus.basalis
-## 0.836448563 1.191924466 1.191924466
-## Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
-## 0.221831524 1.191924466 1.191924466
-## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma
-## 1.191924466 0.836448563 0.836448563
-## Melanostoma.sp. Nomada.cuneata Nomada.sayi
-## 0.836448563 1.191924466 1.191924466
-## Orsodacne.atra Orthoneura.pulchella Osmia.lignaria
-## 1.191924466 0.559607915 1.191924466
-## Osmia.proxima Osmia.pumila Paramyia.nitens
-## 0.559607915 1.191924466 0.016188829
-## Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
-## 0.024272240 1.191924466 1.191924466
-## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis
-## 1.191924466 0.559607915 0.099097400
-## Pieris.napi Poanes.hobomok Psithyrus.sp.
-## 1.191924466 1.191924466 1.191924466
-## Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica
-## 1.191924466 1.191924466 0.836448563
-## Sphaerophoria.bifurcata Sphaerophoria.longipilosa Sphaerophoria.sp.
-## 0.221831524 1.191924466 0.559607915
-## Sphecodes.sp. Syritta.pipiens Syritta.rectus
-## 0.836448563 1.191924466 1.191924466
-## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi
-## 1.191924466 0.559607915 0.836448563
-## Thamnotettix.confinis Trachysida.aspera Tropidia.quadrata
-## 1.191924466 1.191924466 0.372726551
-## Tychius.stephensi Vespula.arenaria Xylota.bigelowi
-## 0.559607915 1.191924466 0.089460825
-## Xylota.hinei Xylota.sp. Zeraea.americana
-## 0.559607915 1.191924466 0.836448563
-##
-## $dmax
-## Acmaeopsoides.rufula Agiotes.stabilis Ancistrocerus.sp.
-## 6.309918 5.616771 5.616771
-## Andrena.melanochroa Andrena.miranda Andrena.nivalis
-## 5.211306 5.211306 5.616771
-## Andrena.rufosignata Andrena.sigmundi Andrena.thaspii
-## 5.616771 6.309918 6.309918
-## Andrena.wheeleri Andrena.wilkella Andrena.w.scripta
-## 6.309918 6.309918 4.230477
-## Anthaxia.expansa Anthonomus.sp. Blera.badia
-## 4.923624 6.309918 6.309918
-## Blera.confusa Blera.nigripes Bombus.perplexus
-## 4.007333 6.309918 4.700480
-## Bombus.ternarius Bombus.terricola Bombus.vagans
-## 5.211306 3.744969 2.596346
-## Bombylius.major Bombylius.pigmaeus Cantharis.sp.
-## 4.364008 6.309918 6.309918
-## Carposcalis.confusus Carposcalis.obscura Cateres.pennatus
-## 4.700480 6.309918 6.309918
-## Celastrina.argiolus Chalcosyrphus.curvarius Chalcosyrphus.inarmatus
-## 5.616771 6.309918 6.309918
-## Chalcosyrphus.memorum Chalcosyrphus.nigra Cheilosia.pallipes
-## 6.309918 5.616771 5.616771
-## Cheilosia.sialia Cheilosia.slossonae Cheilosia.tristis
-## 5.616771 6.309918 6.309918
-## Crabro.sp. Dalopius.sp. Dialictus.cressoni
-## 5.616771 6.309918 4.230477
-## Dialictus.imitatus Dialictus.sp. Eclimus.harrisi
-## 5.616771 2.572249 4.923624
-## Ephemerella.sp. Eremomyioides.setosa Eudasyphora.cyanicolor
-## 6.309918 6.309918 6.309918
-## Eupyses.vestris Eusphalerum.convexum Eusphalerum.phothos
-## 6.309918 4.230477 3.670861
-## Eusphalerum.sp. Evodinus.monticola Evylaeus.divergens
-## 1.665527 6.309918 5.616771
-## Evylaeus.quebecensis Fannia.ungulata Halictus.confusus
-## 3.825012 5.616771 6.309918
-## Halictus.rubicundus Hoplitis.producta Hylaeus.basalis
-## 5.616771 6.309918 6.309918
-## Hylaeus.ellipticus Hylaeus.stevensi Judolia.montivagans
-## 4.700480 6.309918 6.309918
-## Lygus.refidorsus Mallota.posticata Melagyna.lasiophthalma
-## 6.309918 5.616771 5.616771
-## Melanostoma.sp. Nomada.cuneata Nomada.sayi
-## 5.616771 6.309918 6.309918
-## Orsodacne.atra Orthoneura.pulchella Osmia.lignaria
-## 6.309918 5.211306 6.309918
-## Osmia.proxima Osmia.pumila Paramyia.nitens
-## 5.211306 6.309918 2.182784
-## Parasyrphus.relictus Passaloecus.sp. Pegohylemyia.fugax
-## 2.397895 6.309918 6.309918
-## Phalaenophana.pyramusalis Phaonia.serva Pidonia.ruficolis
-## 6.309918 5.211306 4.112694
-## Pieris.napi Poanes.hobomok Psithyrus.sp.
-## 6.309918 6.309918 6.309918
-## Pyrophaena.rosarum Rhopalum.sp. Sarcophaga.nearctica
-## 6.309918 6.309918 5.616771
-## Sphaerophoria.bifurcata Sphaerophoria.longipilosa Sphaerophoria.sp.
-## 4.700480 6.309918 5.211306
-## Sphecodes.sp. Syritta.pipiens Syritta.rectus
-## 5.616771 6.309918 6.309918
-## Temnostoma.alternans Temnostoma.balyras Temnostoma.barberi
-## 6.309918 5.211306 5.616771
-## Thamnotettix.confinis Trachysida.aspera Tropidia.quadrata
-## 6.309918 6.309918 4.923624
-## Tychius.stephensi Vespula.arenaria Xylota.bigelowi
-## 5.211306 6.309918 4.007333
-## Xylota.hinei Xylota.sp. Zeraea.americana
-## 5.211306 6.309918 5.616771
-plot(degree(pollination)[V(pollination_bin)$type],dfun(t(mat_plantpol))$dprime,xlab="degrees",ylab="d'")
-In the case of unipartite directed networks / food webs, dfun can also be used.
-foodweb_spe.res<-dfun(mat_foodweb)$dprime #as resource
-foodweb_spe.con<-dfun(t(mat_foodweb))$dprime #as consumer
-interm_species_list<-intersect(names(foodweb_spe.res),names(foodweb_spe.con))
-plot(foodweb_spe.res[which(names(foodweb_spe.res)%in%interm_species_list)],foodweb_spe.con[which(names(foodweb_spe.con)%in%interm_species_list)],xlab="d' as prey",ylab="d' as consumer")
-Blüthgen et al. (2006) also introduced a network-level metric of specialization which is based on Shannon’s entropy. The metric \(H_2\) is simply the entropy of interaction weights and the relative measure \(H_2^\prime\) is its opposite, scaled between 0 and 1.
-H2fun(mat_plantpol)
-## H2 H2min H2max H2uncorr
-## 0.5780733 3.4320000 5.0600000 4.1190000
+make_alluvial_2(foodweb_SA.mod$membership,foodweb_SC,"Simulated annealing","Spectral clustering")
+The idea of nestedness is to measure the tendency for specialists to only interact with a subsample of the interactors of generalists. In other words, a network would be said “non-nested” only when specialists would interact more likely with specialists than with generalists.
Several indices have been developed over the years. Navigating their complexity is the purpose of the synthesis written by Podani and Schmera (2012).
-The package bipartite proposes some methods to do this (partly borrowed from the package vegan), in the function “nested”.
+The package bipartite proposes some methods to do this (partly borrowed from the package vegan), in the function nested.
pollination_nestdness<-nested(mat_plantpol, method = "ALL", rescale=TRUE, normalised=TRUE)
Another option is to use the various functions directly from vegan:
nestednodf(mat_plantpol)
@@ -1302,15 +815,16 @@ In the paper of J. Dunne and collaborators, they used examples based on a variety of datasets. The basic rule then is that a species go extinct when it loses all its prey items (except itself if it is cannibalistic). One can obtain different scenarios based on how removed species are chosen (intentionality: how strongly the species’ degree changes its probability of being drawn randomly as the next one to be removed).
We can first try a robustness analysis on a virtual dataset, using FWebs (or the functions in “crutch_functions.R”). We will use the “niche model” to generate a virtual food web.
+We can first try a robustness analysis on a virtual dataset, using FWebs (or the functions in crutch_functions.R). We will use the “niche model” to generate a virtual food web.
The plot yields the value of the R50 as a function of intentionality, which is a proxy for how strongly species removals target species based on their degree.
niche<-niche_matrix(0.2,200)
m<-niche$matrix
-net<-graph_from_adjacency_matrix(m,mode="directed")
+netw<-graph_from_adjacency_matrix(m,mode="directed")
+V(netw)$name<-paste0("x",as.character(1:200))
+
i_index <- seq(from = 0, to = 0.95, by =0.05)
-prob_exp<-exponent.removal(net, i_index)
-V(net)$name<-1:200
-iterate(fw_to_attack=net, prob_exp, alpha1=50, iter=10, i_index, plot = TRUE)
+prob_exp<-exponent.removal(degree(netw,mode="out"), i_index)
+netw_iterate_deg<-iterate(fw_to_attack=netw, prob_exp, alpha1=50, iter=10, i_index, plot = TRUE)
## Iteration 1
## Iteration 2
## Iteration 3
@@ -1321,31 +835,10 @@ ## Iteration 8
## Iteration 9
## Iteration 10
-## i_index meanR sdR lower.bound upper.bound
-## 1 0.00 0.505 0 0.505 0.505
-## 2 0.05 0.505 0 0.505 0.505
-## 3 0.10 0.505 0 0.505 0.505
-## 4 0.15 0.505 0 0.505 0.505
-## 5 0.20 0.505 0 0.505 0.505
-## 6 0.25 0.505 0 0.505 0.505
-## 7 0.30 0.505 0 0.505 0.505
-## 8 0.35 0.505 0 0.505 0.505
-## 9 0.40 0.505 0 0.505 0.505
-## 10 0.45 0.505 0 0.505 0.505
-## 11 0.50 0.505 0 0.505 0.505
-## 12 0.55 0.505 0 0.505 0.505
-## 13 0.60 0.505 0 0.505 0.505
-## 14 0.65 0.505 0 0.505 0.505
-## 15 0.70 0.505 0 0.505 0.505
-## 16 0.75 0.505 0 0.505 0.505
-## 17 0.80 0.505 0 0.505 0.505
-## 18 0.85 0.505 0 0.505 0.505
-## 19 0.90 0.505 0 0.505 0.505
-## 20 0.95 0.505 0 0.505 0.505
+We can also try it on the real food web data:
-prob_exp<-exponent.removal(foodweb, i_index)
-iterate(fw_to_attack=foodweb, prob_exp, alpha1=50, iter=20, i_index, plot = TRUE)
+prob_exp_FW<-exponent.removal(degree(foodweb,mode="out"), i_index)
+fw_iterate_deg<-iterate(fw_to_attack=foodweb, prob_exp_FW, alpha1=50, iter=20, i_index, plot = TRUE)
## Iteration 1
## Iteration 2
## Iteration 3
@@ -1366,34 +859,59 @@ ## Iteration 18
## Iteration 19
## Iteration 20
-## i_index meanR sdR lower.bound upper.bound
-## 1 0.00 0.47216981 0.009421541 0.46804071 0.47629891
-## 2 0.05 0.45660377 0.018211007 0.44862259 0.46458495
-## 3 0.10 0.38160377 0.029433676 0.36870413 0.39450341
-## 4 0.15 0.34622642 0.026524811 0.33460162 0.35785121
-## 5 0.20 0.27641509 0.028891573 0.26375304 0.28907715
-## 6 0.25 0.24386792 0.020134965 0.23504355 0.25269230
-## 7 0.30 0.21603774 0.014647047 0.20961850 0.22245697
-## 8 0.35 0.18915094 0.016617253 0.18186824 0.19643364
-## 9 0.40 0.16698113 0.015636969 0.16012805 0.17383421
-## 10 0.45 0.15283019 0.013892037 0.14674185 0.15891853
-## 11 0.50 0.13066038 0.013084617 0.12492590 0.13639486
-## 12 0.55 0.14481132 0.021702430 0.13529999 0.15432266
-## 13 0.60 0.41037736 0.013164919 0.40460768 0.41614703
-## 14 0.65 0.45283019 0.000000000 0.45283019 0.45283019
-## 15 0.70 0.09433962 0.000000000 0.09433962 0.09433962
-## 16 0.75 0.09433962 0.000000000 0.09433962 0.09433962
-## 17 0.80 0.09433962 0.000000000 0.09433962 0.09433962
-## 18 0.85 0.09433962 0.000000000 0.09433962 0.09433962
-## 19 0.90 0.09433962 0.000000000 0.09433962 0.09433962
-## 20 0.95 0.09433962 0.000000000 0.09433962 0.09433962
-The increase in R50 at intermediate intentionality might be due to the suppression of hubs: targeting hubs in a sufficiently regular manner can result in disconnected components, which are then quite robust against secondary extinctions.
+prob_exp<-exponent.removal(trophic_levels(netw), i_index)
+netw_iterate_TL<-iterate(fw_to_attack=netw, prob_exp, alpha1=50, iter=20, i_index, plot = TRUE)
+## Iteration 1
+## Iteration 2
+## Iteration 3
+## Iteration 4
+## Iteration 5
+## Iteration 6
+## Iteration 7
+## Iteration 8
+## Iteration 9
+## Iteration 10
+## Iteration 11
+## Iteration 12
+## Iteration 13
+## Iteration 14
+## Iteration 15
+## Iteration 16
+## Iteration 17
+## Iteration 18
+## Iteration 19
+## Iteration 20
+foodweb_TL<-as.data.frame(TrophicLevels(as_Community(foodweb)))
+prob_exp_FW<-exponent.removal(foodweb_TL$LongestTL, i_index)
+fw_iterate_TL<-iterate(fw_to_attack=foodweb, prob_exp_FW, alpha1=50, iter=20, i_index, plot = TRUE)
+## Iteration 1
+## Iteration 2
+## Iteration 3
+## Iteration 4
+## Iteration 5
+## Iteration 6
+## Iteration 7
+## Iteration 8
+## Iteration 9
+## Iteration 10
+## Iteration 11
+## Iteration 12
+## Iteration 13
+## Iteration 14
+## Iteration 15
+## Iteration 16
+## Iteration 17
+## Iteration 18
+## Iteration 19
+## Iteration 20
+Ohlmann et al. developed a measure of the “beta diversity” of nodes and links among networks that share some nodes. For nodes, this amounts to the classic beta diversity of communities. For links, two measures are possible, based on the following formula: \[L_{ij} = \pi_{ij}p_ip_j\] where - \(L_{ij}\) is the relative weight of the link between species \(i\) and \(j\), - \(p_i\) is the relative abundance of species \(i^\), - \(\pi_{ij}\) is the probability of interaction between species \(i\) and \(j\)j. The beta diversity of the \(p\)’s corresponds to the beta diversity of nodes (community diversity), while the beta diversity of either \(L_{ij}\) or \(\pi_{ij}\) provides a measure of link diversity among networks.
-The functions are implement in package “econetwork”. We test it on four networks of the same 60 species.
+The functions are implement in package econetwork. We test it on four networks of the same 60 species.
gList <- c()
for(i in 1:4){
graphLocal <- sample_gnp(60, 0.1, directed=TRUE)
@@ -1403,23 +921,23 @@ Beta diversity of networks
names(gList) <- c("A","B","C","D")
disPairwise(gList, type='P')
-## | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100%
+## | | | 0% | |======================= | 17% | |============================================== | 33% | |===================================================================== | 50% | |============================================================================================ | 67% | |=================================================================================================================== | 83% | |==========================================================================================================================================| 100%
## A B C
## B 0
## C 0 0
## D 0 0 0
disPairwise(gList, type='L')
-## | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100%
+## | | | 0% | |======================= | 17% | |============================================== | 33% | |===================================================================== | 50% | |============================================================================================ | 67% | |=================================================================================================================== | 83% | |==========================================================================================================================================| 100%
## A B C
-## B 0.8918169
-## C 0.8973647 0.9002770
-## D 0.9196674 0.8755186 0.9197787
+## B 0.8912001
+## C 0.8771519 0.9100341
+## D 0.8768809 0.8770819 0.8930309
disPairwise(gList, type='Pi')
-## | | | 0% | |============ | 17% | |======================= | 33% | |=================================== | 50% | |=============================================== | 67% | |========================================================== | 83% | |======================================================================| 100%
+## | | | 0% | |======================= | 17% | |============================================== | 33% | |===================================================================== | 50% | |============================================================================================ | 67% | |=================================================================================================================== | 83% | |==========================================================================================================================================| 100%
## A B C
-## B 0.8918169
-## C 0.8973647 0.9002770
-## D 0.9196674 0.8755186 0.9197787
+## B 0.8912001
+## C 0.8771519 0.9100341
+## D 0.8768809 0.8770819 0.8930309
As expected, the dissimilarity/distance between node sets is 0, but the distance among edge sets is greater than 0.
Before tackling models per se, one important step is to be able to convert any undirected unipartite network into a directed network that can be thought of as a food web. The main difficulties are that randomly orienting the links is likely - to cause cycles (which in principle do not exist in food webs), and - not to have a few species that feed on no one else (the “basal” level).
-The “make_food_web_from_undirected” function tries to cope with this two difficulties. It asks for an undirected graph and a number of basal species. Then it proceeds in two steps:
+The make_food_web_from_undirected function tries to cope with this two difficulties. It asks for an undirected graph and a number of basal species. Then it proceeds in two steps:
## [1] 100
-The function “config_VL” (in the source file) does that automatically from the input network or from its adjacency matrix.
+The function config_VL (in the source file) does that automatically from the input network or from its adjacency matrix.
alt.config<-config_VL(net,100)
## [1] "unipartite graph detected"
plot(alt.config[[42]])
-Here, we exemplify the use of the configuration model with a simple issue. We want to assess whether the modularity of the largest component of the food web data is significant (in the sense: not expected from the configuration model). In this example, food webs are considered in their undirected form.
-one_comp_foodweb<-as.undirected(largest_component(foodweb))
+one_comp_foodweb<-as.undirected(foodweb)
one_comp_foodweb_LE.mod<-cluster_leading_eigen(one_comp_foodweb)
one_comp_foodweb_LE.mod$mod
-## [1] 0.3374333
+## [1] 0.3630662
foodweb_configs<-config_VL(one_comp_foodweb,1000)
## [1] "unipartite graph detected"
mods_configs<-sapply(1:1000, function(x) cluster_leading_eigen(foodweb_configs[[x]])$mod)
-The function p.val (from the source file) computes the p-value based on a collection of networks (here generated with the configuration model) and their modularities. Here, we specify we want a “larger than” test.
+The function p.val (from the source file) computes the p-value based on a collection of networks (here generated with the configuration model) and their modularities. Here, we specify we want a “larger than” test.
p.val(test_val=one_comp_foodweb_LE.mod$mod,test_collection=mods_configs,method="larger",label="modularity")
-
+
+## [1] 0.000999001
+one_comp_foodweb_SA.mod<-cluster_netcarto(one_comp_foodweb)
+mods_configs_SA<-sapply(1:1000, function(x) cluster_netcarto(foodweb_configs[[x]])$mod)
+p.val(test_val=one_comp_foodweb_SA.mod$mod,test_collection=mods_configs_SA,method="larger",label="modularity")
+
## [1] 0.000999001
To randomize a directed network, we can make use of “sample_degseq” also, but we are not assured of uniform sampling anymore.
net<-sample_gnp(50,0.2, directed =FALSE)
net_directed<-make_food_web_from_undirected(net,5)
-sample.config.directed<-lapply(1:100,function(x) sample_degseq(degree(net_directed,mode="out"), degree(net_directed,mode="in"), method = "simple.no.multiple"))
+sample.config.directed<-lapply(1:100,function(x) sample_degseq(degree(net_directed,mode="out"), degree(net_directed,mode="in"), method = "fast.heur.simple"))
We can plot the initial food web and one of its configurations side by side just to check that these are different.
par(mfrow=c(1,2))
plot(net_directed,layout=layout_as_food_web3(net_directed))
plot(sample.config.directed[[1]],layout=layout_as_food_web3(sample.config.directed[[1]]))
-In the case of bipartite networks, Strona et al. proposed the “curveball” algorithm which is efficient and ensures uniformity of the sampling of equivalent bipartite networks.
-It is implemented in the package “vegan” with functions simulate and nullmodel (pay attention: there is also a nullmodel function in “bipartite”). The result is given as a “cube” of data (same matrix dimensions, but with depth for all simulated networks).
+It is implemented in the package vegan with functions simulate and nullmodel (pay attention: there is also a nullmodel function in bipartite). The result is given as a “cube” of data (same matrix dimensions, but with depth for all simulated networks).
net<-sample_bipartite(40,60,"gnp",0.1)
net<-largest_component(net)
net_mat<-as.matrix(as_biadjacency_matrix(net))
sample.bip.config<-simulate(vegan::nullmodel(net_mat,"curveball"),nsim=1000)
dim(sample.bip.config)
-## [1] 40 59 1000
-This is also implented in the “config_VL” function.
+## [1] 40 60 1000
+This is also implented in the config_VL function.
alt.config<-config_VL(net,1000)
## [1] "bipartite graph detected"
## [1] 0.7692308
+## [1] 0.3476523
net<-make_food_web_from_undirected(sample_gnp(50,0.2, "gnp",directed =TRUE),basal = 10)
## [1] "not enough nodes in the largest color to make basal species, "
## [1] "the number of basal species is set to"
-## [1] 8
+## [1] 9
V(net)$name<-sapply(1:50,function(x) paste0("sp_",x))
plot(net,layout=layout_as_food_web2(net))
-It is possible to test whether the distribution of degrees follows a binomial (the expectation), but it looks significant a bit too easily…
ks.test(degree(net),"pbinom",length(V(net))-1,mean(degree(net))/(length(V(net))-1))
-## Warning in ks.test.default(degree(net), "pbinom", length(V(net)) - 1,
-## mean(degree(net))/(length(V(net)) - : aucun ex-aequo ne devrait être présent
-## pour le test de Kolmogorov-Smirnov
+## Warning in ks.test.default(degree(net), "pbinom", length(V(net)) - 1, mean(degree(net))/(length(V(net)) - : ties should not be present for the
+## one-sample Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: degree(net)
-## D = 0.12328, p-value = 0.4329
+## D = 0.17473, p-value = 0.09443
## alternative hypothesis: two-sided
Undirected networks with PA can be obtained using the function “sample_pa”. The argument “power” controls how fat the tail of the distribution is. As above, the undirected network is generated and then turned into a food web.
+Undirected networks with PA can be obtained using the function sample_pa. The argument power controls how fat the tail of the distribution is. As above, the undirected network is generated and then turned into a food web.
net<-make_food_web_from_undirected(sample_pa(500, power = 1, directed = FALSE, out.pref=TRUE),basal = 50)
plot(net,layout=layout_as_food_web2(net))
-It is also possible to test whether the distribution of degrees follows a power law distribution (“ppldis”).
net_dist<-displ$new(degree(net))
net_dist$setXmin(estimate_xmin(displ$new(degree(net)))$xmin)
net_pars<-estimate_pars(net_dist)
ks.test(degree(as.undirected(net)),"ppldis",xmin = estimate_xmin(displ$new(degree(net)))$xmin, alpha = net_pars$pars)
-## Warning in ks.test.default(degree(as.undirected(net)), "ppldis", xmin =
-## estimate_xmin(displ$new(degree(net)))$xmin, : aucun ex-aequo ne devrait être
-## présent pour le test de Kolmogorov-Smirnov
+## Warning in ks.test.default(degree(as.undirected(net)), "ppldis", xmin = estimate_xmin(displ$new(degree(net)))$xmin, : ties should not be present
+## for the one-sample Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: degree(as.undirected(net))
-## D = 0.594, p-value < 2.2e-16
+## D = 0.596, p-value < 2.2e-16
## alternative hypothesis: two-sided
First, the cascade model of Cohen & Briand proposed that predators only eat a rather fixed number of prey species. This corresponds to predators eating prey that are are smaller than them with probability \(c/S\) (\(c\) being a fixed parameter), so that connectance decreases as \(1/S\).
net<-cascade_matrix(3,50)
sum(net)/(dim(net)[1]*(dim(net)[1]-1))
-## [1] 0.02734694
+## [1] 0.03183673
graph_cascade<-graph_from_adjacency_matrix(net)
V(graph_cascade)$name<-sapply(1:50,function(x) paste0("sp_",x))
plot(graph_cascade,layout=layout_as_food_web3(graph_cascade))
-net<-cascade_matrix(3,200)
sum(net)/(dim(net)[1]*(dim(net)[1]-1))
-## [1] 0.007361809
+## [1] 0.007035176
The second model that was developed to find invariants is the niche model of Williams and Martinez. In this model, all species are supposed to be defined by their size and to eat all species with size contained within an interval centred around a size lower than the predator’s. With the right parameter values, one can use this model to generate a food web that has a given connectance, whatever the number of species in the food web.
net<-niche_matrix(0.1,50)
sum(net$matrix)/(dim(net$matrix)[1]*(dim(net$matrix)[1]-1))
-## [1] 0.09959184
+## [1] 0.1081633
graph_niche<-graph_from_adjacency_matrix(net$matrix)
V(graph_niche)$name<-sapply(1:50,function(x) paste0("sp_",x))
plot(graph_niche,layout=layout_as_food_web3(graph_niche))
-## Warning in min(vec[!is.infinite(vec)]): aucun argument trouvé pour min ; Inf est renvoyé
+## Warning in min(vec[!is.infinite(vec)]): aucun argument trouvé pour min ; Inf est renvoyé
+## Warning in min(vec[!is.infinite(vec)]): aucun argument trouvé pour min ; Inf est renvoyé
+## Warning in min(vec[!is.infinite(vec)]): aucun argument trouvé pour min ; Inf est renvoyé
+## Warning in min(vec[!is.infinite(vec)]): aucun argument trouvé pour min ; Inf est renvoyé
+## Warning in max(vec[!is.infinite(vec)]): aucun argument pour max ; -Inf est renvoyé
+## Warning in max(vec[!is.infinite(vec)]): aucun argument pour max ; -Inf est renvoyé
+## Warning in max(vec[!is.infinite(vec)]): aucun argument pour max ; -Inf est renvoyé
+## Warning in max(vec[!is.infinite(vec)]): aucun argument pour max ; -Inf est renvoyé
+## Warning in max(vec[!is.infinite(vec)]): aucun argument pour max ; -Inf est renvoyé
+net<-niche_matrix(0.1,200)
sum(net$matrix)/(dim(net$matrix)[1]*(dim(net$matrix)[1]-1))
-## [1] 0.09396985
+## [1] 0.101005
Here, the idea is not to generate a degree distribution in general, but rather to use a degree sequence that is “typical” of the wanted degree distribution. To do that, from the number of nodes/species and the distribution, one can extract the typical degrees of the nodes using the quantiles of the distribution. Then, using the Viger-Latapy’s algorithm, it is possible to generate a random network, and then make it a food web.
Here, an example with the Poisson distribution.
-net<-generate_DM_model(50,0.1,quant_fun="qpois", lambda=5)
-plot(net,layout=layout_as_food_web3(net))
-net<-generate_DM_model(50,0.1,quant_fun="qpois", lambda=5)
+## Warning: `as.directed()` was deprecated in igraph 2.1.0.
+## i Please use `as_directed()` instead.
+## This warning is displayed once every 8 hours.
+## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
+## Warning: `subgraph.edges()` was deprecated in igraph 2.1.0.
+## i Please use `subgraph_from_edges()` instead.
+## This warning is displayed once every 8 hours.
+## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
+plot(net,layout=layout_as_food_web3(net))
+And now an example with the negative binomial distribution.
net<-generate_DM_model(50,0.1,quant_fun="qnbinom", mu = 4, size=50)
plot(net,layout=layout_as_food_web3(net))
-It is also possible to check whether the degrees follow the desired distribution.
net<-generate_DM_model(450,0.1,quant_fun="qpois", lambda=7)
hist(degree(net),breaks=0:max(degree(net)),main="")
-ks.test(degree(net),"ppois",lambda = mean(degree(net)))
-## Warning in ks.test.default(degree(net), "ppois", lambda = mean(degree(net))):
-## aucun ex-aequo ne devrait être présent pour le test de Kolmogorov-Smirnov
+## Warning in ks.test.default(degree(net), "ppois", lambda = mean(degree(net))): ties should not be present for the one-sample Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: degree(net)
-## D = 0.14551, p-value = 1.061e-08
+## D = 0.14916, p-value = 4.022e-09
## alternative hypothesis: two-sided
The EDD model assumes that each node has a latent parameter (its expected degree) which is used to assess whether edges exist or not (multiplicative model). These latent parameters are assigned randomly among nodes following a given distribution (actually, using an increasing function of a uniform variable).
-The EDD model can generate networks with more or less heterogeneity in expected degrees (the “lambda” parameter of the function Simul_EDD).
+The EDD model can generate networks with more or less heterogeneity in expected degrees (the “lambda” parameter of the function Simul_EDD).
net_EDD<-Simul_EDD(50,0.2,2)
graph_EDD<-graph_from_adjacency_matrix(net_EDD$net,mode="undirected")
graph_EDD<-largest_component(graph_EDD)
plotMyMatrix(net_EDD$net)
-foodweb_EDD<-make_food_web_from_undirected(graph_EDD,5)
plot(foodweb_EDD,layout=layout_as_food_web3(foodweb_EDD))
-Here we simply use the “sample_bipartite” function of igraph to generate a random bipartite network in which all edges between level 1 and level 2 have the same probability of occurring.
+Here we simply use the sample_bipartite function of igraph to generate a random bipartite network in which all edges between level 1 and level 2 have the same probability of occurring.
net<-sample_bipartite(25,25,"gnp",0.1)
plot(net,layout=layout_as_bipartite)
-plotweb(as_biadjacency_matrix(net))
-net_bedd<-SimulB_EDD(25, 25, 0.1, 2, 2)
graph_bedd<-graph_from_biadjacency_matrix(net_bedd$net)
plot(graph_bedd,layout=layout_as_bipartite)
-plotweb(net_bedd$net)
-plotMyMatrix(net_bedd$net)
-sample.bip.EDD<-lapply(1:1000, function(x) randomize.BEDD(net_mat))
nestedness_EDD<-sapply(1:1000, function(x) nested(sample.bip.EDD[[x]], method = "NODF2"))
p.val(net_nestedness,nestedness_EDD,method="two-sided",label="nestedness")
-## [1] 0.08591409
+## [1] 0.1238761
It is enlightening to compare the density of simulated values of nestedness according to two different null models, here the configuration model (in blue) and the BEDD model (in green).
plot(density(nestedness_configs),xlim=c(min(nestedness_configs,nestedness_EDD),max(nestedness_configs,nestedness_EDD)),xlab="",main="nestedness distributions",col="blue")
lines(density(nestedness_EDD),col="darkgreen")
-It is apparent that the BEDD allows for a wider variability in nestedness in simulated networks than the configuration model. So p-values obtained from each model have a different interpretation…
foodweb_EDD<-lapply(1:1000, function(x) randomize.EDD(one_comp_foodweb))
mods_EDD<-sapply(1:1000, function(x) cluster_leading_eigen(as.undirected(foodweb_EDD[[x]]))$mod)
p.val(one_comp_foodweb_LE.mod$mod,mods_EDD,method="larger",label="modularity")
-## [1] 0.000999001
Again, we can compare the distribution of modularity scores generated by the EDD model (green) and the configuration model (blue).
plot(density(mods_configs),xlim=c(min(mods_configs,mods_EDD),max(mods_configs,mods_EDD)),xlab="",main="modularity distributions",col="blue")
lines(density(mods_EDD),col="darkgreen")
-This time, it is not only the extent of the distribution, but also its mean and mode that are completely shifted by the change in underlying null model.