library(funrar)
In addition to single index functions funrar
proposes
several functions to help you compute functional rarity indices. The aim
of this vignette is to provide detailed examples of how to use each of
them.
In this vignette we will use the dataset aravo
(you can
learn more about it through
help("aravo", package = "ade4")
) from the ade4
package as for the “Getting Started” vignette:
data("aravo", package = "ade4")
# Extract the traits of all species of `aravo`
= aravo$traits
traits
head(traits)
#> Height Spread Angle Area Thick SLA N_mass Seed
#> Agro.rupe 6 10 80 60.0 0.12 8.1 218.70 0.08
#> Alop.alpi 5 20 20 190.9 0.20 15.1 203.85 0.21
#> Anth.nipp 15 5 50 280.0 0.08 18.0 219.60 0.54
#> Heli.sede 0 30 80 600.0 0.20 10.6 233.20 1.72
#> Aven.vers 12 30 60 420.0 0.14 12.5 156.25 1.17
#> Care.rosa 30 20 80 180.0 0.40 6.5 208.65 1.68
distinctiveness_global()
While functional distinctiveness has been envisioned initially at
local scale, that’s what the distinctiveness()
function
computes, it can be useful to compute it at regional scales. This
functions provides exactly that based on a provided functional
dissimilarity matrix.
Using the aravo
dataset we can compute the global
distinctiveness of all species across the dataset in the following
way:
# Compute a Euclidean distance matrix (because all traits are quantitative)
= compute_dist_matrix(traits, metric = "euclidean")
dist_matrix
# Compute global distinctiveness
= distinctiveness_global(dist_matrix)
global_di
head(global_di)
#> species global_di
#> 1 Agro.rupe 248.7796
#> 2 Alop.alpi 231.9763
#> 3 Anth.nipp 248.7366
#> 4 Heli.sede 444.0815
#> 5 Aven.vers 330.0033
#> 6 Care.rosa 233.4236
The global distinctiveness is available in column
global_di
. You can rename this column using the second
argument of distinctiveness_global()
:
= distinctiveness_global(dist_matrix, di_name = "aravo_di")
aravo_di
head(aravo_di)
#> species aravo_di
#> 1 Agro.rupe 248.7796
#> 2 Alop.alpi 231.9763
#> 3 Anth.nipp 248.7366
#> 4 Heli.sede 444.0815
#> 5 Aven.vers 330.0033
#> 6 Care.rosa 233.4236
NB: distinctiveness_global()
assumes
that all species in the provided trait dataset are present at
global/regional scale. It also assumes only a presence-absence
matrix.
Distinctiveness is generally computed through a dissimilarity matrix that itself comes from aggregating differences across multiple traits. Sometimes it can be useful to compare it to distinctiveness computed on each trait separately. This way, it is possible that some species appear distinct on certain traits and not others. The two functions below let you do exactly that for distinctiveness and uniqueness.
distinctiveness_dimensions()
The function distinctiveness_dimensions()
computes
species local distinctiveness values from a site-species matrix and a
trait data.frame. It will return a data frame with distinctiveness
computed from all traits taken together and each trait taken
separately.
Let’s do this with the traits from the aravo
dataset.
The first argument of distinctiveness_dimensions()
is
supposed to be site-species matrix while the second should be a traits
table:
= distinctiveness_dimensions(as.matrix(aravo$spe), traits, metric = "euclidean")
di_dim
str(di_dim, max.level = 1)
#> List of 9
#> $ di_Height: num [1:75, 1:82] NA NA 5.6 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_Spread: num [1:75, 1:82] NA NA 9.35 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_Angle : num [1:75, 1:82] NA NA 31.5 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_Area : num [1:75, 1:82] NA NA 218 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_Thick : num [1:75, 1:82] NA NA 0.16 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_SLA : num [1:75, 1:82] NA NA 4.44 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_N_mass: num [1:75, 1:82] NA NA 39.5 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_Seed : num [1:75, 1:82] NA NA 0.755 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
#> $ di_all : num [1:75, 1:82] NA NA 240 NA NA ...
#> ..- attr(*, "dimnames")=List of 2
We see that it returns a list of 9 local distinctiveness matrices:
one for each trait and one for all traits taken together (named
di_all
).
uniqueness_dimensions()
The function uniqueness_dimensions()
computes species
regional uniqueness values from a site-species matrix and a trait
data.frame. It will return a data frame with uniqueness computed from
all traits taken together and each trait taken separately.
Let’s do this with the traits from the aravo
dataset.
The first argument of uniqueness_dimensions()
is supposed
to be site-species matrix while the second should be a traits table:
= uniqueness_dimensions(as.matrix(aravo$spe), traits, metric = "euclidean")
ui_dim
str(ui_dim, max.level = 1)
#> 'data.frame': 82 obs. of 10 variables:
#> $ species : chr "Agro.rupe" "Alch.glau" "Alch.pent" "Alch.vulg" ...
#> $ Ui_Height: num 1 0 0 0 0 0 0 0 0 0 ...
#> $ Ui_Spread: num 0 0 0 0 0 0 0 0 0 0 ...
#> $ Ui_Angle : num 0 0 0 0 0 0 0 0 0 0 ...
#> $ Ui_Area : num 0 9.8 2.4 170.7 7.9 ...
#> $ Ui_Thick : num 0 0 0 0 0 0 0 0 0 0 ...
#> $ Ui_SLA : num 0 0.1 0.5 0.5 0.1 ...
#> $ Ui_N_mass: num 0.3 0.34 2.52 8.41 0.52 ...
#> $ Ui_Seed : num 0 0 0 0 0 ...
#> $ Ui_all : num 14.1 23.1 56.9 180 28.7 ...
We see that it returns a data frame with 10 columns: one for species
names, one for each trait separately, and one for all traits taken
together (named Ui_all
).
make_relative()
This function, probably largest source of citations of
funrar
, transforms a matrix of absolute abundances to
relative abundances. It takes an abundance matrix and returns the same
matrix with relative abundances.
We can check that with aravo
site-species matrix:
= as.matrix(aravo$spe)
aravo_site_sp
# There are clearly abundances and not only presence-absence in this table
1:5, 1:5]
aravo_site_sp[#> Agro.rupe Alop.alpi Anth.nipp Heli.sede Aven.vers
#> AR07 0 0 0 0 0
#> AR71 0 0 0 0 0
#> AR26 3 0 1 0 1
#> AR54 0 0 0 2 0
#> AR60 0 0 0 0 0
# Compute total abundance per site
= rowSums(aravo_site_sp)
site_abundance
head(site_abundance)
#> AR07 AR71 AR26 AR54 AR60 AR70
#> 15 23 37 23 13 32
# Compute a relative abundance matrix
= make_relative(aravo_site_sp)
relative_site_sp
1:5, 1:5]
relative_site_sp[#> Agro.rupe Alop.alpi Anth.nipp Heli.sede Aven.vers
#> AR07 0.00000000 0 0.00000000 0.00000000 0.00000000
#> AR71 0.00000000 0 0.00000000 0.00000000 0.00000000
#> AR26 0.08108108 0 0.02702703 0.00000000 0.02702703
#> AR54 0.00000000 0 0.00000000 0.08695652 0.00000000
#> AR60 0.00000000 0 0.00000000 0.00000000 0.00000000
= rowSums(relative_site_sp)
rel_site_abundance
head(rel_site_abundance)
#> AR07 AR71 AR26 AR54 AR60 AR70
#> 1 1 1 1 1 1
We see, through rel_site_abundance
, that
make_relative()
transformed the abundances in each site so
that they all sum to one. It divides the abundance of each species by
the total abundance of the site.