Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
2 tasks
Martin-Jung opened this issue Jan 24, 2024 · 5 comments
Open
2 tasks
Labels
Quality of life Quality of life improvement

Comments

@Martin-Jung
Copy link
Collaborator

Martin-Jung commented Jan 24, 2024

The idea (by Piero) is as follows:

  • Take the environmental covariates from a BiodiversityDistribution object 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.


  • Implement the function, either within the class definition or as external helper function (in plot.r)
  • Make sure it works and add a unit test
@Martin-Jung Martin-Jung added the Quality of life Quality of life improvement label Jan 24, 2024
@mhesselbarth
Copy link
Collaborator

mhesselbarth commented Jan 24, 2024

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
Copy link
Collaborator Author

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
Copy link
Collaborator

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
Copy link
Collaborator Author

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
Copy link
Collaborator

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Quality of life Quality of life improvement
Projects
None yet
Development

No branches or pull requests

2 participants