ibis.iSDM
ibis.iSDM copied to clipboard
Convenience function to support a PCA based Niche overview as graphical plot
The idea (by Piero) is as follows:
- Take the environmental covariates from a
BiodiversityDistributionobject and do a PCA on them - Plot the first and second PC axis in environmental space as points (sample like 10000 from them)
- Then overlay in a different colour all datasets, such as points or ranges to assess where data falls in.
This would allow a visual assessment of the extent to which the data falls within the whole environmental space. It should not replace the existing functionalities of partial_density() here but instead looks at all covariates.
- [x] Implement the function, either within the class definition or as external helper function (in plot.r)
- [x] Make sure it works and add a unit test
I have worked on this using the ecospat packages. Here is my approach. x and y are the point and range maps. envir is the stack of predictors.
Source:
- https://doi.org/10.1111/j.1466-8238.2011.00698.x
- http://www.unil.ch/ecospat/home/menuguid/ecospat-resources/tools.html
- https://doi.org/10.1111/j.1558-5646.2010.01204.x
library(ecospat)
library(ade4)
library(terra)
compare_niches <- function(x, y, envir) {
# extract values for first object
values_x <- terra::extract(x = envir, y = x, ID = FALSE)
values_x <- values_x[complete.cases(values_x), ]
# extract values for second object
values_y <- terra::extract(x = envir, y = y, ID = FALSE)
values_y <- values_y[complete.cases(values_y), ]
# extract environmental values
values_envir <- terra::as.data.frame(x = envir)
# Calibrating the PCA in the whole study area, including both x and
# y ranges (same as PCAenv in Broenniman et al. 2012)
pca_env <- ade4::dudi.pca(values_envir, center = TRUE, scale = TRUE, scannf = FALSE,
nf = 2)
# predict the global envir scores on the PCA axes
scores_bkg<- pca_env$li
# scores for the two species
scores_x <- ade4::suprow(pca_env, values_x)$lisup
scores_y <- ade4::suprow(pca_env, values_y)$lisup
# calculation of occurence density
suppressMessages(density_x <- ecospat::ecospat.grid.clim.dyn(glob = scores_bkg, glob1 = scores_bkg,
sp = scores_x, R = 100))
suppressMessages(density_y <- ecospat::ecospat.grid.clim.dyn(glob = scores_bkg, glob1 = scores_bkg,
sp = scores_y, R = 100))
# calculate overlap
ecospat::ecospat.niche.overlap(density_x, density_y, cor = TRUE)
}
Sounds good. I think it would be neat if there is a wrapper function for ibis.iSDM objects. So specifically by providing a BiodiversityDistribution-class object to the function and it then extracts the covariates and any datasets (both ranges and points) to construct the plot.
If at all possible without extra dependencies, e.g. ecospat, the better (PCA can be created with base R)
Sounds all reasonable 👍
The function above is not exactly Piero's idea, but similar, and based on the first paper listed under the Sources. So in terms of a BiodiversityDistribution-class would this extract the biodiversity data and the range? Or what would should it be possible to provide two BiodiversityDistribution-class objects? Or both ?
Sounds all reasonable 👍
The function above is not exactly Piero's idea, but similar, and based on the first paper listed under the Sources. So in terms of a
BiodiversityDistribution-classwould this extract the biodiversity data and the range? Or what would should it be possible to provide twoBiodiversityDistribution-classobjects? Or both ?
We made a sketch in the coffee room today :D But yeah, extract all specified biodiversity data in the object. Can talk tmr or so about it.
I am on leave until next week, but happy to chat during lunch next week (or anytime)