iiasa / ibis.iSDM

Modelling framework for creating Integrated SDMS
https://iiasa.github.io/ibis.iSDM/
Creative Commons Attribution 4.0 International
20 stars 2 forks source link

Convenience function to support a PCA based Niche overview as graphical plot #87

Open Martin-Jung opened 5 months ago

Martin-Jung commented 5 months ago

The idea (by Piero) is as follows:

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.


mhesselbarth commented 5 months ago

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:

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)

}
Martin-Jung commented 5 months ago

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)

mhesselbarth commented 5 months ago

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 ?

Martin-Jung commented 5 months ago

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 ?

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.

mhesselbarth commented 5 months ago

I am on leave until next week, but happy to chat during lunch next week (or anytime)