| Title: | Analysis of Recruitment Networks |
|---|---|
| Description: | Analyze recruitment networks and patterns of plant-plant interactions. |
| Authors: | Alicia Montesinos-Navarro [aut, cph] (ORCID: <https://orcid.org/0000-0003-4656-0321>), José Luis Garrido [aut, cph] (ORCID: <https://orcid.org/0000-0002-6859-4234>), Miguel Verdú [aut, cph] (ORCID: <https://orcid.org/0000-0002-9778-7692>), Julio M. Alcántara [aut, cph] (ORCID: <https://orcid.org/0000-0002-8003-7844>), Verónica Cruz-Alonso [ctb] (ORCID: <https://orcid.org/0000-0002-0642-036X>), Francisco Rodriguez-Sanchez [aut, cre, cph] (ORCID: <https://orcid.org/0000-0002-7981-1599>) |
| Maintainer: | Francisco Rodriguez-Sanchez <[email protected]> |
| License: | GPL (>= 3) |
| Version: | 0.0.0.9000 |
| Built: | 2026-05-23 09:44:27 UTC |
| Source: | https://github.com/EcologyR/RecruitNetP |
Uses plot accumulation curves to assess whether the estimates of the number
of nodes, links, and link density (a.k.a. connectance) are stable (see Pulgar
et al. 2017 for other descriptors). The function accum_curve plots
accumulation curves for parameters that can be obtained with package
igraph (Csardi & Nepusz, 2006).
NOTE: This function is intended for data sets organised in multiple plots of the same community or locality.
accum_curve( int_data, property = c("vcount", "ecount", "edge_density"), k = 100 )accum_curve( int_data, property = c("vcount", "ecount", "edge_density"), k = 100 )
int_data |
data frame containing interaction data. |
property |
property: indicates the network property, obtained from igraph functions, which accuracy is being evaluated. Only three options are currently available:
|
k |
An integer number specifying the number of random repetitions of subsets of n plots. In each of the k repetitions, a subset of n randomly chosen plots is combined to build a partial network for which the indicated property is estimated. High values provide more confident estimates of the accuracy, but the function may take long time if k >> 100. |
The function returns a list of two objects:
A plot representing the mean and 95% Confidence interval (i.e. 1.96 times the standard error) of the estimate of the property selected when an increasing number of randomly selected plots are considered.
A data frame with the cumulative values of the property for each repetition of k plots. Provided so you can prepare your own customized accumulation plot.
accum_links <- accum_curve(Amoladeras_int, property="ecount", k=10) head(accum_links$Data) accum_links$Plotaccum_links <- accum_curve(Amoladeras_int, property="ecount", k=10) head(accum_links$Data) accum_links$Plot
Amoladeras cover data
Amoladeras_coverAmoladeras_cover
An object of class data.frame with 282 rows and 4 columns.
Amoladeras interaction data
Amoladeras_intAmoladeras_int
An object of class data.frame with 824 rows and 4 columns.
Calculates different metrics to characterize the interaction strength
for each pairwise interaction, based on the number of recruits found under
the canopy species and in the "Open" ground. Several indices have been proposed
to assess how much recruitment is affected by the canopy species relative
to the species performance in the absence of canopy plants (i.e. in open),
each of them with its own particularities. In the context of recruitment
interactions, the most frequently used index is the Relative Interaction Index
(RII; Armas et al., 2004), and some studies have recently used the
additive and commutative symmetry intensity indices (NIntA and NIntC)
y Diaz-Sierra et al. (2017). However, these indices are not well suited for
comparisons of interaction strength between pairs of species within a local
community, so the Normalized Neighbour Suitability index (Ns; Mingo, 2014)
should be preferred (Alcantara et al. 2025). The function associndex
calculates all the four indices besides providing the density of recruits
under the canopy and in the open, and the data used to calculate it
(relative cover and number of recruits in each microhabitat).
**IMPORTANT NOTE: Data on recruitment in Open is required to calculate
these indices.
Input: The canopy-recruit interactions data set and the canopy cover
data set
associndex( int_data, cover_data, expand = c("yes", "no"), rm_sp_no_cover = c("allsp", "onlycanopy"), threshold_density = NULL )associndex( int_data, cover_data, expand = c("yes", "no"), rm_sp_no_cover = c("allsp", "onlycanopy"), threshold_density = NULL )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
expand |
Expands the data frame to include the non-detected interactions between every pair of species that occur in the study site, assigning values of 0 to the variables Fcr and Dcr. Explanation of its options:
|
rm_sp_no_cover |
rm_sp_no_cover: Defines the filtering behavior, specifying which species should be removed based on the availability of cover data and the type of interaction of interest. Explanation of its options:
|
threshold_density |
threshold_density: indicates a threshold to retain only those interactions in which the observed density is below the threshold (i.e. Dcr < thr & Dro < thr). This is required to avoid the use of interactions based on very few recruits which may have occurred by chance under a very scarce canopy species. These cases will result in a large overestimation of Dcr, likely being spurious outlayers. If no threshold value is provided or it is set to NULL, the function estimates a threshold value based on recruitment density outliers according to a Weibull distribution: a value is an outlier if it is above the limit where less than 1 observation is expected. Explanation of its options:
|
a data frame with the following information for each canopy-recruit interaction with the following information:
Canopy: canopy species.
Recruit: recruit species.
Fcr: frequency of recruitment, as the number of recruits found under that canopy species.
Ac: Area occupied by the canopy species in the study site, in m^2^ (or m when relative cover is measured with transects).
Fro: frequency of recruitment, as the number of recruits in Open interspaces. - Ao: Area occupied by open interspaces in the study site in m^2^ (or m when relative cover is measured with transects).
Dcr: Density of recruits under a canopy species: $Fcr/Ac$.
Dro: Density of recruits in open interspaces: $Fro/Ao$.
max_Recr: maximum recruitment density of a species in the study site (i.e., under any canopy species or "Open").
Ns: Normalized Neighbour Suitability index: $(Dcr - Dro) / maxRecr$.
NintC: Commutative symmetry intensity index: $2*(Dcr - Dro)/((Dcr + Dro)+abs(Dcr-Dro))$
NintA: Additive symmetry intensity index: $2*(Dcr - Dro)/((Dro) + abs(Dcr-Dro))$
RII: Relative Interaction Index: $(Dcr - Dro)/(Dcr + Dro)$
associndex (Amoladeras_int, Amoladeras_cover, expand = "yes", rm_sp_no_cover = "allsp", threshold_density=NULL) associndex (Amoladeras_int, Amoladeras_cover, expand = "yes", rm_sp_no_cover = "onlycanopy", threshold_density=NULL) associndex (Amoladeras_int, Amoladeras_cover, expand = "no", rm_sp_no_cover = "allsp", threshold_density=NULL) associndex (Amoladeras_int, Amoladeras_cover, expand = "yes", rm_sp_no_cover = "onlycanopy", threshold_density=NULL)associndex (Amoladeras_int, Amoladeras_cover, expand = "yes", rm_sp_no_cover = "allsp", threshold_density=NULL) associndex (Amoladeras_int, Amoladeras_cover, expand = "yes", rm_sp_no_cover = "onlycanopy", threshold_density=NULL) associndex (Amoladeras_int, Amoladeras_cover, expand = "no", rm_sp_no_cover = "allsp", threshold_density=NULL) associndex (Amoladeras_int, Amoladeras_cover, expand = "yes", rm_sp_no_cover = "onlycanopy", threshold_density=NULL)
Tests whether a canopy species has a depressing, enhancing or neutral effect on recruitment in general (i.e., at the community level) compared to the "Open", independently considering all the recruit species together.
canopy_service_test(int_data, cover_data)canopy_service_test(int_data, cover_data)
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
Data frame with the same variables provided by the function
int_significance() but without distinguishing between recruit species.
canopy_service_test(Amoladeras_int, Amoladeras_cover)canopy_service_test(Amoladeras_int, Amoladeras_cover)
The canopy cover data set contains the abundance of each canopy species in each plot. The minimum columns required are:
Plot. As in the interactions data set.
Canopy. As in the interactions data set.
Cover. Cover of the canopy species (and "Open" interspaces), measured as % of the total area sampled where a recruit would be ascribed to the interaction with the canopy plant (or to be recruiting in "Open", away from established plants). For example, following Alcantara et al. (2019), in plants with branches less than 1.5m above ground (e.g. small shrubs and treelets), it would be the area of projection of their canopy on the ground, while in tall trees it can be the area extending 0.5m around the trunk's base or large surfacing roots.
Sampled_distance_or_area. Total area of each plot or distance of each transect (in m^2^ or m, respectively).
check_cover(cover_data = NULL)check_cover(cover_data = NULL)
cover_data |
data frame with the abundance of each canopy species in each plot. |
The function will return error(s) if problems are detected. Otherwise an OK message.
check_cover(Amoladeras_cover)check_cover(Amoladeras_cover)
A canopy-recruit interactions data set must contain, at least, the raw data of the observed frequency of each canopy-recruit pair in each sampling unit (e.g. plot, quadrat, transect). For standardization, the columns in this data set must be named:
Plot. Plot ID. Uniquely identifies each of the sampling units over which the interactions have been surveyed. Include this column even if you only surveyed one plot.
Canopy. Name of the canopy species. If your survey included any type of open interspaces (e.g., canopy gaps, open ground, spaces away from a canopy plant), include these as a single node named "Open" (note the capital "O"). If you use full scientific names (e.g. latin binomials), concatenate the epithets with a lower dash (e.g. Olea_europaea).
Recruit. Name of the recruit species. If you use full scientific names, concatenate the epithets with a lower dash (e.g. Olea_europaea).
Frequency. Frequency of the canopy-recruit interaction in the study plot, indicated as number of individuals of the recruit species found under individuals of the canopy species.
check_interactions(int_data = NULL)check_interactions(int_data = NULL)
int_data |
data frame containing interaction data. |
The function will return error(s) if problems are detected. Otherwise an OK message.
int_data <- load_interactions() check_interactions(int_data)int_data <- load_interactions() check_interactions(int_data)
this function is to be used with datasets containing multiple study sites
comm_subset(data = NULL, site = NULL)comm_subset(data = NULL, site = NULL)
data |
a dataframe. Must contain a column named Study_site |
site |
A character string indicating the name of the study site |
a dataframe
data<-load_interactions() comm_subset(data, site="Amoladeras")data<-load_interactions() comm_subset(data, site="Amoladeras")
Combine interactions and cover data sets from a study site into a single data frame. For study sites where data has been collected in several plots, this function collapses the information into a single value per pairwise interaction. You can choose whether or not the output contains all possible pairs of interacting species (including those that were not observed, which are assigned weight = 0) and whether or not to remove species lacking information on canopy cover.
comm_to_RN( int_data, cover_data, expand = c("yes", "no"), rm_sp_no_cover = c("allsp", "onlycanopy") )comm_to_RN( int_data, cover_data, expand = c("yes", "no"), rm_sp_no_cover = c("allsp", "onlycanopy") )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
expand |
Indicates whether to expand the dataframe to include the non-detected interactions between every pair of species that occurs in the study site, assigning values of 0 to their frequency. It can take two possible values:
|
rm_sp_no_cover |
Defines the filtering behavior, specifying which species should be removed based on the availability of cover data. It can take two options:
|
Data frame with the following information for each pair of species:
Canopy. Name of the canopy species, including "Open" interspaces. If you use full scientific names, concatenate the epithets with a lower dash (e.g. Olea_europaea).
Recruit. Name of the recruit species. If you use full scientific names, concatenate the epithets with a lower dash (e.g. Olea_europaea).
Ac: Area (in m^2^), (or m when relative cover is measured with transects) occupied by the canopy species (or "Open" interspaces) in the total area sampled in the study site.
Ar. Area (in m^2^), (or m when relative cover is measured with transects) occupied by the recruit species (observed as adults), in the total area sampled in the study site.
Fcr: frequency of recruitment, in number of recruits by canopy-recruit pair.
Icr: incidence of the interaction, as number of plots where it was observed.
Pcr: presence/absence (1/0) of the interaction in the study site. This provides the "unweighted" version of the adjacency matrix.
df <- comm_to_RN(Amoladeras_int, Amoladeras_cover, expand="yes", rm_sp_no_cover="allsp") head(df)df <- comm_to_RN(Amoladeras_int, Amoladeras_cover, expand="yes", rm_sp_no_cover="allsp") head(df)
Download latest version of the RecruitNet database (Verdú et al. 2023, doi:10.1002/ecy.3923).
download_RN(path = getwd(), destfile = "RN.zip", unzip = TRUE)download_RN(path = getwd(), destfile = "RN.zip", unzip = TRUE)
path |
character. Path to folder where the RecruitNet database should be saved. |
destfile |
character. Name of the zip file to be saved. |
unzip |
Logical. Uncompress the zip file? Default is TRUE. |
A zip file or two CSV files, depending if unzip is TRUE.
provides summary information of the frequency of species of each functional role and the classification of species in each role.
funtopol_rec(int_data, cover_data)funtopol_rec(int_data, cover_data)
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
A list with two elements, one with descriptors of the networks and another with the role of each species.
The first element of the list provides the following information:
Num. nodes: Total number of nodes in the network.
Num. edges: Total number of links in the network.
Connectance: Proportion of links observed relative to all the possible links (C). In the case of recruitment networks, we use the formula $C = L /(N^2 - N)$ since the node "Open" does not act as a recruit (i.e. Open is represented by a row of zeroes in the adjacency matrix).
Num. non-trivial SCCs: Number of SCCs formed by more than one node in the network.
Num. core species: Number of species in the core SCC.
Prop. core species: Proportion of species in the core relative to the total number of species in the network.
Num. satellite species: Number of satellite species in the network.
Prop. satellite species: Proportion of satellite species relative to the total number of species in the network.
Num. disturbance-dependent transients: Number of disturbance-dependent transient species in the network.
Prop. disturbance-dependent transients: Proportion of disturbance-dependent transient species relative to the total number of species in the network.
Num. strict transients: Number of strict transient species in the network.
Prop. strict transients: Proportion of strict transient species relative to the total number of species in the network.
Qualitative Persistence: The sum of the proportion of core and satellite species. The second element of the list, provides the role for each plant species in the network, whose interpretations differ in each plant-plant interaction type. Each node (i.e. species) can be:
Part of the core core. In the case of general recruitment networks, the direction of the links represents that the space occupied by canopy species (predecessor node) will be replaced by the species recruiting under its canopy (successor node). In this case, all species in the core must recruit, at least, under the canopy of another core species, and allow the recruitment of at least another core species.
A satellite species: these are non-core species that can be reached from some core species, following the direction of the arrows. In general recruitment networks, these are species that recruit under the canopy of some core species but that do not show recruitment of any core species under their canopy.
A disturbance-dependent transient species: these are species that can be reached from the "Open" node but not from core or satellite species (i.e. for example, pioneer species that only recruit away from established plants).
A strict transient species: a species that cannot be reached from any other node. In the case of general recruitment networks strict transients are those species that do not recruit in the studied local assemblage (e.g., a pioneer species in a mature forest patch or a relict species at it distribution limit).
funtopol_rec(Amoladeras_int,Amoladeras_cover)funtopol_rec(Amoladeras_int,Amoladeras_cover)
conducts statistical tests for each pairwise interaction, indicating whether the effect of the canopy species on recruitment is enhancing (i.e. positive), depressing (i.e. negative), neutral, or whether it could not be tested due to low sample size. IMPORTANT NOTE: Data on recruitment in Open is required for the tests. To assess whether recruitment is affected by a given canopy species compared to the "Open" it is used an exact binomial test or a chi square test (if the number of recruits is large enough so that the expected frequencies are larger than 5). The tests address the null hypothesis that recruitment is as frequent under a given canopy species as it is in open interspaces. Thus, we use these tests as a goodness-of-fit tests. The logic is that, if recruitment were neutral regarding the microhabitat, we would observe that the number of recruits under canopy would be exactly proportional to the relative cover of each microhabitat. If the null hypothesis is rejected, we would conclude that recruitment is affected (enhanced or depressed) by the canopy species compared with the prospects of recruitment when seeds are dispersed away from established plants. When the exact binomial test is applied to canopy-recruit pairs with very low number of recruits, it may be impossible to reject the null hypothesis even if all the recruits occurred in the less likely microhabitat. In such cases, one might conclude that the interaction has a neutral effect when it is actually not possible to reach a conclusion. We classify these cases as "not testable".
int_significance(int_data, cover_data, int_type = c("rec", "fac", "comp"))int_significance(int_data, cover_data, int_type = c("rec", "fac", "comp"))
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
int_type |
Indicates the type of plant-plant interaction that will be analyzed: general recruitment, recruitment enhancement (i.e. facilitation) or recruitment depression (i.e. competition). Explanation of its options:
|
a data frame with the following information for each recruit-canopy interaction with the following information:
Canopy: Canopy species
Recruit: Recruit species
Fcr: frequency of recruitment, as the number of recruits found under that canopy species.
Ac: Area (in m^2^), (or m when relative cover is measured with transects) occupied by the canopy species in the study site.
Fro: frequency of recruitment in open interspaces.
Ao: Area (in m^2^), (or m when relative cover is measured with transects) occupied by the open interspaces in the study site.
testability: Testability indicates the smallest p-value that a binomial test will estimate based in a given number of recruits. If this p-value is above the reference p-value (typically 0.05), then you have too few cases (number of recruits) to ever reject the null hypothesis, and the interaction is not testable.
Significance: p-value of the chi square or binomial test assessing the null hypothesis that Fcr and Fro are equal to the expected frequencies based on the relative cover of each of the two microhabitats: $Ac/(Ac+Ao)$ and $1-(Ac/(Ac+Ao))$
Test_type: Indicates whether, depending on the sample size, a chi square or binomial test has been conducted.
Effect_int: Indicates, for each interaction, whether the analysis classifies it as "Enhancing", "Depressing", "Neutral" or "Not Testable".
int_signif_rec <- int_significance(Amoladeras_int, Amoladeras_cover, int_type = "rec") head(int_signif_rec) int_signif_fac <- int_significance(Amoladeras_int, Amoladeras_cover, int_type = "fac") head(int_signif_fac) int_signif_comp <- int_significance(Amoladeras_int, Amoladeras_cover, int_type = "comp") head(int_signif_comp)int_signif_rec <- int_significance(Amoladeras_int, Amoladeras_cover, int_type = "rec") head(int_signif_rec) int_signif_fac <- int_significance(Amoladeras_int, Amoladeras_cover, int_type = "fac") head(int_signif_fac) int_signif_comp <- int_significance(Amoladeras_int, Amoladeras_cover, int_type = "comp") head(int_signif_comp)
Estimates the completeness and coverage of the sampled interactions,
providing the probability of detecting a new canopy-recruit pair if we
increased our sampling effort in one unit (i.e., locating one more recruit
or surveying one more plot). This function uses iNEXT::iNEXT()
(Hsieh et al. 2016).
link_completeness(int_data = NULL, type = c("incidence", "abundance"))link_completeness(int_data = NULL, type = c("incidence", "abundance"))
int_data |
data frame containing interaction data. |
type |
indicates whether the completeness and coverage will be calculated based on the number of individual recruits under each canopy species (i.e., abundance) or on the presence/absence of canopy-recruit pairs across plots (i.e., incidence). If the survey was based in multiple independent plots, it is good practice to use the "incidence" approach. The "abundance" approach can be used more generally, but it assumes that each recruit represents an independent canopy-recruit interaction event, so it may easily overestimate coverage when recruits of the same species tend to occur aggregated under the same canopy plant (as it occurs frequently). Explanation of its options:
|
A data frame indicating the number of links observed (Lobs), the number of links estimated (Lest), the completeness of the sampling of links as the proportion of canopy-recruit pairs observed from those expected in the study site (Completeness of links: Lobs/Lest) and the probability that if one more recruit (or plot) had been sampled, it would have corresponded to (or contained) an already detected canopy-recruit species interaction (Coverage of links).
link_completeness(Amoladeras_int, type="abundance") link_completeness(Amoladeras_int, type="incidence")link_completeness(Amoladeras_int, type="abundance") link_completeness(Amoladeras_int, type="incidence")
Load canopy cover data from RecruitNet database
load_cover(path = getwd())load_cover(path = getwd())
path |
Path to folder containing the 'CanopyCover.csv' file. If the file is not present, the latest version of the RecruitNet database (Verdú et al. 2023, doi:10.1002/ecy.3923) will be downloaded automatically. |
a data frame containing canopy cover data
cover_data <- load_cover()cover_data <- load_cover()
Load interaction data from RecruitNet database
load_interactions(path = getwd())load_interactions(path = getwd())
path |
Path to folder containing the 'RecruitNet.csv' file. If the file is not present, the latest version of the RecruitNet database (Verdú et al. 2023, doi:10.1002/ecy.3923) will be downloaded automatically. |
a data frame containing interaction data
int_data <- load_interactions()int_data <- load_interactions()
Calculate width of canopy service and recruitment niches
node_degrees(int_data, cover_data, int_type = c("rec", "fac", "comp"))node_degrees(int_data, cover_data, int_type = c("rec", "fac", "comp"))
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
int_type |
Indicates the type of plant-plant interaction that will be presented in the output matrix: general recruitment, recruitment enhancement (i.e. facilitation) or recruitment depression (i.e. competition). It may take three possible values:
|
The output depends on the type of interaction considered. For the recruitment networks it returns a single data frame with the following information:
Node: plant species (either as canopy or recruit)
Ac: Area of the canopy species (and "Open" interspaces), measured as the distance (m, in transects) or area (m^2^, in plots) used to estimate canopy cover in the study site.
canopy_service_width: the number of species that recruit under a given canopy species (i.e., the canopy species' out-degree); this can be interpreted as the width of its canopy service.
canopy_contribution: number of recruits of any species associated with the canopy species. When the degrees are weighted by the frequency of recruitment (Fcr), then it can be interpreted as the contribution of the canopy species to the multispecific sapling bank.
effective_canopy_service: The weighted degrees are transformed to the effective number of partners, accounting for the dominance of certain interactions in the recruit bank. The effective canopy service is estimated as e^H, where H is Shannon's index of diversity calculated for a canopy species from Fcr.
recruitment_niche_width: number of canopy species that allow its recruitment (the recruit species' in-degree); this can be interpreted as the width of its recruitment niche.
recruit_bank_abundance: number of recruits of a species in the study site. When the degrees are weighted by the frequency of recruitment (Fcr), then it can be interpreted as species abundance in the recruit bank.
effective_recruitment_niche: The weighted degrees are transformed to the effective number of partners, accounting for the dominance of certain interactions in the recruit bank. The effective recruitment niche width is estimated as $e^H$, where H is Shannon's index of diversity calculated for a recruit species from Fcr.
For facilitation or recruitment depressing interactions, the output consists in two data frames, one for the canopy species and another for the recruit species. The data frame with information for the canopy species provides the following information:
Nurse (or Canopy) sp: Canopy species.
Ac: Area of the canopy species (and "Open" interspaces), measured as the distance (m, in transects) or area (m^2^, in plots) used to estimate canopy cover in the study site.
N enhanced (or depressed) recruit sp: number of species whose recruitment is enhanced (or depressed) under its canopy, this can be interpreted as the width of its enhancing of (depressing) effect.
The data frame with information for the recruit species contains the following information:
Facilitated (or recruit) sp: Recruit species.
N_ind: number of recruits of the facilitated (or depressed) species in the study site.
N enhancing (or depressing) canopy sp: number of canopy species that enhance its recruitment (i.e. nurse species) or depress it (i.e. competing species). These can be interpreted as the width of its niche of nurses or competitors.
out <- node_degrees(Amoladeras_int, Amoladeras_cover, int_type="rec") head(out)out <- node_degrees(Amoladeras_int, Amoladeras_cover, int_type="rec") head(out)
calculates eigenvector centrality and the two measures of extended niche.
node_topol(int_data, cover_data, int_type = c("rec", "fac", "comp"))node_topol(int_data, cover_data, int_type = c("rec", "fac", "comp"))
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
int_type |
Indicates the type of plant-plant interaction that will be presented in the output: general recruitment, recruitment enhancement (i.e. facilitation) or recruitment depression (i.e. competition).
|
data frame
a data frame with estimates of the implications of each plant species in indirect interactions with the rest of species, both as canopy and recruit. Specifically, the estimates provided are the following: For recruitment networks:
Eigenvector centrality: provides the dominant eigenvector of the adjacency matrix of the interactions network. Its entries are interpreted as the centrality of each node. A node is more influential if it is connected to other influential nodes. In the case of recruitment networks, it has been associated with the persistence of species (Alcantara and Rey 2012; Alcantara et al. 2017): species with 0 eigenvector centrality have the lowest probability of persisting in the local community.
Extended canopy service: The extended canopy service of a species is defined as the number of other species whose recruitment it enables, directly or indirectly. It reflects an expansion of the species' out-degree in the interaction network, capturing its broader influence on the recruitment dynamics within the community. Using the logic of replacement dynamics, through a temporal series of replacements, a spatial patch will be dominated successively by plants of different species. The legacies of each species on the soil may remain for long time, so the occupation of a patch by one species can affect the recruitment of many others. From a functional perspective, it can be interpreted in terms of how easily disturbances associated with one species may pervade to the rest of species directly or indirectly; for example, a pest decimating the population of one species would affect many or few other species depending on the size of its extended canopy service.
Extended recruitment niche: The number of species in the community whose presence may allow eventually (directly and indirectly) the recruitment of the focal species. It represents an extension of the species' in-degree, capturing its dependence on the broader network for successful recruitment. From a functional perspective, a species with a large extended recruitment niche will be more susceptible to pests affecting any species of the community, but at the same time it may benefit from the increase in abundance of any species in its neighborhood. For facilitation networks:
Eigenvector centrality: Provides the dominant eigenvector of the adjacency matrix of the interactions network, and its entries are interpreted as the centralities of the nodes. It provides a relative value (i.e., proportionality) indicating for each nurse plant, the extent to which it tends to facilitate—directly or indirectly—those species that in turn facilitate many others. The centrality of a species is proportional to the sum of the centralities of the species it facilitates.
Extended nurse service: The number of species that a given species facilitates, either directly or indirectly (i.e., the number of nodes that can be reached from a given node).
Extended facilitated niche: The number of nurse species that either directly promote the recruitment of a given species or indirectly facilitate the recruitment of its own nurse plants (i.e. the number of nodes that can reach this node). A high value indicates that this species recruits under nurse plants that themselves recruit under other nurse plants. This metric can reflect how sensitive a species is to the loss of nurse plants, especially when the ratio between the number of nurse species (i.e., degree) and the extended recruitment niche is low. For competition networks:
Eigenvector centrality: Provides a relative value (i.e., proportionality) indicating for each canopy species, the extent to which it tends to depress the recruitment of those species that, in turn, depresses many others when they act as canopy. The centrality of a species is proportional to the sum of the centralities of the species it negatively affects.
Extended competitor effect: The number of species whose recruitment is depressed by a given canopy species, either directly or indirectly depressing its depressors (i.e., the number of nodes that can be reached from a given node). The odd or even number of links in the chain can lead to different outcomes, with even-numbered chains potentially canceling out some effects, while odd-numbered chains can amplify them.
Extended competitors niche: A high value indicates that the recruitment of this species is depressed by species whose recruitment is depressed by other recruitment-depressing canopy species. It represents the number of recruitment-depressing canopy species that either directly depress its recruitment, or indirectly affect the recruitment of its depressor canopy species (i.e., the number of nodes that can reach this node). The odd or even number of links in the chain can lead to different outcomes, with even-numbered chains potentially canceling out some effects, while odd-numbered chains can amplify them. This metric can reflect the extent to which a species can escape its depressors due to the presence of other species that suppress the recruitment of its depressors, especially when the ratio between the number of depressing canopy species (i.e., degree) and the extended depressed niche is low.
summary_node_topol_rec <- node_topol(Amoladeras_int,Amoladeras_cover, int_type="rec") head(summary_node_topol_rec) summary_node_topol_fac <- node_topol(Amoladeras_int,Amoladeras_cover, int_type="fac") head(summary_node_topol_fac) summary_node_topol_comp <- node_topol(Amoladeras_int,Amoladeras_cover, int_type="comp") head(summary_node_topol_comp)summary_node_topol_rec <- node_topol(Amoladeras_int,Amoladeras_cover, int_type="rec") head(summary_node_topol_rec) summary_node_topol_fac <- node_topol(Amoladeras_int,Amoladeras_cover, int_type="fac") head(summary_node_topol_fac) summary_node_topol_comp <- node_topol(Amoladeras_int,Amoladeras_cover, int_type="comp") head(summary_node_topol_comp)
tests whether the presence of vegetation (i.e any canopy species) compared to the
"Open", enhances, depresses or has a neutral effect on the recruitment of a given
recruit species. Input:The canopy-recruit interactions dataset and the canopy
cover dataset (details as explained in int_significance() documentation).
recruitment_niche_test(int_data, cover_data)recruitment_niche_test(int_data, cover_data)
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
The same variables provided by the function int_significance()
but without distinguishing between canopy species.
recruitment_niche_test (Amoladeras_int, Amoladeras_cover)recruitment_niche_test (Amoladeras_int, Amoladeras_cover)
Remove the species from the interaction database that do not have cover data. For rec interaction type the function removes any species without cover data from the interactions database, and for comp or fac, it removes only canopy species without cover data keeping recruit species without cover data.
remove_no_cover( int_data, cover_data, rm_sp_no_cover = c("allsp", "onlycanopy") )remove_no_cover( int_data, cover_data, rm_sp_no_cover = c("allsp", "onlycanopy") )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
rm_sp_no_cover |
Options:
|
a data frame
remove_no_cover (Amoladeras_int, Amoladeras_cover, rm_sp_no_cover = "allsp") remove_no_cover (Amoladeras_int, Amoladeras_cover, rm_sp_no_cover = "onlycanopy")remove_no_cover (Amoladeras_int, Amoladeras_cover, rm_sp_no_cover = "allsp") remove_no_cover (Amoladeras_int, Amoladeras_cover, rm_sp_no_cover = "onlycanopy")
Calculates basic descriptors of the interactions network, such as its size described by the number of nodes and links, and its complexity, which is proportional to network connectance.
RN_dims(int_data, cover_data, int_type = c("rec", "fac", "comp"))RN_dims(int_data, cover_data, int_type = c("rec", "fac", "comp"))
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
int_type |
Indicates the type of plant-plant interaction that will be analyzed: general recruitment, recruitment enhancement (i.e. facilitation) or recruitment depression (i.e. competition). Explanation of its options:
|
A table with the following information:
Num nodes: Number of nodes in the network (N). In the case of facilitation and competition the nodes are provided for each guild
Num. links: Number of links in the network (L).
Connectance: Proportion of links observed from all the possible links (C). In the case of general recruitment networks, we use the formula $C = L / (N^2 - N)$ since the node "Open" does not act as a recruit (i.e. Open is represented by a row of zeroes in the adjacency matrix). For facilitation and recruitment depressing networks, connectance is calculated as $C = L /(N_c N_r)$, where N_c and N_r are the number of canopy and recruit species, respectively.
int_type**: Indicates the type of plant-plant interaction that will be presented in the output (recruitment patterns, recruitment enhancement (i.e. facilitation) or recruitment depression (i.e. competition))
rec: Estimates the number of nodes, links and connectance of the network based on all plant-plant interactions that contribute to recruitment. "Open" is considered an additional canopy species category.
fac: Estimates the number of nodes, links and connectance of the network based on only those pairwise interactions that significantly enhance recruitment. Not every interaction detected in the field has to be present in the matrix. Non-detected interactions are not considered and "Open" is not included as a canopy species category.
comp: Estimates the number of nodes, links and connectance of the network based on only those pairwise interactions that depress recruitment. Not every interaction detected in the field has to be present in the matrix. However, in this case non-detected interactions are considered. "Open" is not included as a canopy species category.
RN_dims(Amoladeras_int, Amoladeras_cover, int_type="rec") RN_dims(Amoladeras_int, Amoladeras_cover, int_type="fac") RN_dims(Amoladeras_int, Amoladeras_cover, int_type="comp")RN_dims(Amoladeras_int, Amoladeras_cover, int_type="rec") RN_dims(Amoladeras_int, Amoladeras_cover, int_type="fac") RN_dims(Amoladeras_int, Amoladeras_cover, int_type="comp")
Visualize a heatmap of the interactions matrix.
RN_heatmap( int_data, cover_data, int_type = c("rec", "fac", "comp"), weight = c("Pcr", "Fcr", "Dcr", "Dro", "Ns", "NintC", "NintA", "RII") )RN_heatmap( int_data, cover_data, int_type = c("rec", "fac", "comp"), weight = c("Pcr", "Fcr", "Dcr", "Dro", "Ns", "NintC", "NintA", "RII") )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
int_type |
#' Indicates the type of plant-plant interaction that will be presented in the output matrix: general recruitment, recruitment enhancement (i.e. facilitation) or recruitment depression (i.e. competition). It may take three possible values:
|
weight |
Specifies the metric used to represent interaction strength (i.e., the weight) assigned to each pair of species in the matrix. See function associndex for further details. The possible options are:
|
Heatmap plot of the weighted network.
RN_heatmap(Amoladeras_int, Amoladeras_cover, int_type="fac", weight ="Ns")RN_heatmap(Amoladeras_int, Amoladeras_cover, int_type="fac", weight ="Ns")
converts the community data collected in the field, where each row represents a single canopy-recruit interaction, into a matrix format, with recruit species as rows and canopy species as columns. For general recruitment networks, the matrix should be square including all species observed at the study site. This means that the same set of species appears in both rows and columns, with "Open" areas treated as an additional category in both the Canopy and Recruit variables. In contrast, for recruitment enhancement (i.e. facilitation) or depression (i.e. competition), the matrix can be non-square. In this case, rows represent the species whose recruitment is enhanced or suppressed, while columns represent the canopy species that influence this recruitment. These two groups may not include the same species.
RN_to_matrix( int_data, cover_data, int_type = c("rec", "fac", "comp"), weight = c("Fcr", "Dcr", "Dro", "Ns", "NintC", "NintA", "RII") )RN_to_matrix( int_data, cover_data, int_type = c("rec", "fac", "comp"), weight = c("Fcr", "Dcr", "Dro", "Ns", "NintC", "NintA", "RII") )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
int_type |
Indicates the type of plant-plant interaction that will be analyzed: general recruitment, recruitment enhancement (i.e. facilitation) or recruitment depression (i.e. competition). Explanation of its options:
|
weight |
Specifies the metric used to represent interaction strength
(i.e., the weight) assigned to each pair of species in the matrix. Explanation of its
options (more mathematical information in the description of the function
|
A matrix with recruit species in rows and canopy species in columns, with cells describing the measure selected to describe the interaction strength (i.e. weight) between each pair of species.
RN_to_matrix(Amoladeras_int, Amoladeras_cover, int_type="rec", weight="Dcr")RN_to_matrix(Amoladeras_int, Amoladeras_cover, int_type="rec", weight="Dcr")
Test data
test_datatest_data
An object of class list of length 2.
provides summary and node-based information of number of species involved in intransitive loops of recruitment depression or simple indirect recruitment depression linear paths from (or to) any given species.
topol_depre(int_data, cover_data, direction = c("in", "out"))topol_depre(int_data, cover_data, direction = c("in", "out"))
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
direction |
direction of teh links, in or out |
A list with two elements, one with the information of intransitive loops of recruitment depression and another with information of the simple indirect recruitment depression linear paths beginning of ending in each species.
The first element of the list loops provides the following information within two levels:
summary: A data frame with as many rows as SCC are present in the recruitment depression network (with more than one species, as autodepression is not considered) and in columns, an scc identifier scc_id and the number of species involved in that SCC n_nodos
nodes: a list with as many elements as SCCs found, each of them including a vector with the name of the species involved in that SCC The second element of the list simple, provides the following information within two levels:
summary: A data frame with as many rows as distinct simple linear indirect recruitment depression paths (i.e. their overlap in species composition is less than 75%) that begin ("from") or end ("to") in any species, including the linear versions of the SCCs. In columns, the species in which that distinct linear path begin or end nodo, and numeric index that identifies the paths within species path_index and the number of species involved in that path n_nodes_in_path which includes the focal species, independently of whether there is autodepression.
nodes: a list with as many elements as species in the recruitment depression network (either as depresor or depressed), each of them including as many elements as distinct paths begin or ends in it, and in each of them, a vector with the name of the species involved in that simple indirect recruitment depression linear paths. All arguments (options)**:
direction = c("in","out") Argument 1.
direction: Indicates the direction in which the indirect recruitment depression is assessed. Explanation of its options:
in: Estimates the paths based on the incoming links to each node, representing the set of canopy species that affect the recruitment of a given species through depressive effects, either directly (by depressing its recruitment) or indirectly (by depressing the recruitment of other canopy species connected to it through recruitment depression interactions). Link direction is considered for both reciprocal and simple paths.
out: Estimates the paths based on the outgoing links from each nodes, representing the set of species that canopy species affect through depressive effects, either directly or indirectly (i.e. through other intermediate species). The direction of the links is applied to both reciprocal and simple paths
topol_depre(test_data$com,test_data$cov, direction="out") topol_depre(test_data$com,test_data$cov, direction="in")topol_depre(test_data$com,test_data$cov, direction="out") topol_depre(test_data$com,test_data$cov, direction="in")
provides summary and node-based information of number of species involved in loops of reciprocal facilitation or simple indirect facilitation linear paths from (or to) any given species.
topol_fac(int_data, cover_data, direction = c("in", "out"))topol_fac(int_data, cover_data, direction = c("in", "out"))
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
direction |
the direction of the link |
A list with two elements, one with the information of reciprocal facilitation loops and another with information of the simple linear indirect facilitation paths beginning of ending in each species.
The first element of the list loops provides the following information within two levels:
summary: A data frame with as many rows as SCC are present in the facilitation network (with more than one species, as autofacilitation is not considered) and in columns, an scc identifier scc_id and the number of species involved in that SCC n_nodos
nodes: a list with as many elements as SCCs found, each of them including a vector with the name of the species involved in that SCC The second element of the list simple, provides the following information within two levels:
summary: A data frame with as many rows as distinct simple linear indirect facilitation paths (i.e. their overlap in species composition is less than 75%) that begin ("from") or end ("to") in any species, including the linear versions of the SCCs. In columns, the species in which that distinct linear path begin or end nodo, and numeric index that identifies the paths within species path_index and the number of species involved in that path n_nodes_in_path which includes the focal species, independently of whether there is autofacilitation.
nodes: a list with as many elements as species in the facilitation network (either as nurse or facilitated), each of them including as many elements as distinct paths begin or ends in it, and in each of them, a vector with the name of the species involved in that simple indirect facilitation linear path. All arguments (options):
direction = c("in","out") Argument 1.
direction: Indicates the direction in which the indirect facilitation is assessed. Explanation of its options:
in: Estimates the paths based on the incoming links to each node, representing the set of nurse species from which a recruit species benefits, either directly (by enhancing its recruitment) or indirectly (by facilitating other nurse species that enhance its recruitment). Link direction is considered for both reciprocal and simple paths.
out: Estimates the paths based on the outgoing links from each nodes, representing the set of species that a nurse species benefits, either directly or indirectly (i.e. through other intermediate species). The direction of the links is applied to both reciprocal and simple paths
topol_fac(test_data$com,test_data$cov, direction="out") topol_fac(test_data$com,test_data$cov, direction="in")topol_fac(test_data$com,test_data$cov, direction="out") topol_fac(test_data$com,test_data$cov, direction="in")
visualize the functional topology of general recruitment networks
visu_funtopol_rec(int_data, cover_data)visu_funtopol_rec(int_data, cover_data)
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
a plot with teh different species role
visu_funtopol_rec(Amoladeras_int,Amoladeras_cover)visu_funtopol_rec(Amoladeras_int,Amoladeras_cover)
Plant-plant interaction network visualization as a graph. On one hand, it is
the visualization of the nodes and interactions, which can be visualized in two
formats, either as a graph conducted with this function or as an adjacency matrix,
with the function RN_heatmap. And on the other hand, three functions, one for
each interaction type network, to visualize the functional topology of general
recruitment networks visu_funtopol_rec and the structural topology of the
recruitment enhancement visu_topol_fac and depression visu_topol_depre
networks respectively.
visu_net( int_data, cover_data, int_type = c("rec", "fac", "comp"), weight = c("Pcr", "Fcr", "Dcr", "Dro", "Ns", "NintC", "NintA", "RII"), mode = c("uni", "bi"), scale_w = 1 )visu_net( int_data, cover_data, int_type = c("rec", "fac", "comp"), weight = c("Pcr", "Fcr", "Dcr", "Dro", "Ns", "NintC", "NintA", "RII"), mode = c("uni", "bi"), scale_w = 1 )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
int_type |
Indicates the type of plant-plant interaction that will be
analyzed: general recruitment, recruitment enhancement (i.e. facilitation)
or recruitment depression (i.e. competition). See detailed options in
|
weight |
specifies the metric used to represent interaction strength (i.e., the weight) assigned to each pair of species in the matrix. Explanation of its options (more mathematical information in the description of the function associndex):
|
mode |
to be used only for recruitment enhancement("fac") and recruitment depression ("comp") networks. Indicates whether the network should be plotted as a unipartite or a bipartite network. In bipartite networks, canopy species are shown in the upper row and recruits in the lower row of the graph. For general recruitment networks, the network should be considered as unipartite, and it will result in an error if this argument is given the option "bi". |
scale_w |
is an argument to proportionally increase or decrease the thickness of the links. In some networks, high values can result in the overlapping of links that difficult the visualization. |
a graph representing a network of plant-plant interactions.
# Unipartite network representation of a general recruitment network. Link width # corresponds to the scaled frequency of recruitment (*Fcr*): visu_net(mysite_com, mysite_cov, int_type="rec", weight="Fcr", mode="uni", scale_w=0.01) # Unipartite representation of a facilitation network. Link width corresponds to the # scaled *Ns* index: visu_net(mysite_com, mysite_cov, int_type="fac", weight="Ns", mode="uni", scale_w=5) # Bipartite representation of a facilitation network. Link width corresponds to the # scaled *Ns* index. Canopy species are shown in the upper row and recruits in the lower # row of the graph: visu_net(mysite_com, mysite_cov, int_type="fac", weight="Ns", mode="bi", scale_w=5) # Unipartite representation of a recruitment depression (*competition*) network. Link # width corresponds to the scaled *RII* index: visu_net(mysite_com, mysite_cov, int_type="comp", weight="RII", mode="uni", scale_w=5) # Bipartite representation of a recruitment depression (*competition*) network. Link # width corresponds to the scaled *RII* index. Canopy species are shown in the upper row # and recruits in the lower row of the graph: visu_net(mysite_com, mysite_cov, int_type="comp", weight="RII", mode="bi", scale_w=5)# Unipartite network representation of a general recruitment network. Link width # corresponds to the scaled frequency of recruitment (*Fcr*): visu_net(mysite_com, mysite_cov, int_type="rec", weight="Fcr", mode="uni", scale_w=0.01) # Unipartite representation of a facilitation network. Link width corresponds to the # scaled *Ns* index: visu_net(mysite_com, mysite_cov, int_type="fac", weight="Ns", mode="uni", scale_w=5) # Bipartite representation of a facilitation network. Link width corresponds to the # scaled *Ns* index. Canopy species are shown in the upper row and recruits in the lower # row of the graph: visu_net(mysite_com, mysite_cov, int_type="fac", weight="Ns", mode="bi", scale_w=5) # Unipartite representation of a recruitment depression (*competition*) network. Link # width corresponds to the scaled *RII* index: visu_net(mysite_com, mysite_cov, int_type="comp", weight="RII", mode="uni", scale_w=5) # Bipartite representation of a recruitment depression (*competition*) network. Link # width corresponds to the scaled *RII* index. Canopy species are shown in the upper row # and recruits in the lower row of the graph: visu_net(mysite_com, mysite_cov, int_type="comp", weight="RII", mode="bi", scale_w=5)
with nodes in different SCC identified by different colors (in grey if they do not belong to any SCC). It may be frequent that in recruitment enhancement (i.e. facilitation) or depression (i.e.competition) networks, there is not any SCC as they tend to have smaller dimensions that general recruitment networks.
visu_topol_depre( int_data, cover_data, layout_fun = igraph::layout_with_fr, vertex_size = 20, edge_arrow_size = 0.4 )visu_topol_depre( int_data, cover_data, layout_fun = igraph::layout_with_fr, vertex_size = 20, edge_arrow_size = 0.4 )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
layout_fun |
type of igraph layout (see |
vertex_size |
numeric |
edge_arrow_size |
numeric |
a plot
visu_topol_depre(test_data$com,test_data$cov)visu_topol_depre(test_data$com,test_data$cov)
with nodes in different SCC identified by different colors (in grey if they do not belong to any SCC). It may be frequent that in recruitment enhancement (i.e. facilitation) or depression (i.e.competition) networks, there is not any SCC as they tend to have smaller dimensions that general recruitment networks.
visu_topol_fac( int_data, cover_data, layout_fun = igraph::layout_with_fr, vertex_size = 20, edge_arrow_size = 0.4 )visu_topol_fac( int_data, cover_data, layout_fun = igraph::layout_with_fr, vertex_size = 20, edge_arrow_size = 0.4 )
int_data |
data frame containing interaction data. |
cover_data |
data frame with the abundance of each canopy species in each plot. |
layout_fun |
type of igraph layout (see |
vertex_size |
numeric |
edge_arrow_size |
numeric |
a plot
visu_topol_fac(test_data$com,test_data$cov)visu_topol_fac(test_data$com,test_data$cov)