View source: R/randPointsRespectingSelfOther2.r
| randPointsRespectingSelfOther2 | R Documentation |
This function randomizes the location of two sets of geographic points with respect to one another retaining (more or less) the same distribution of pairwise distances between points with and between sets (plus or minus a user-defined tolerance).
randPointsRespectingSelfOther2( x1, x2, rast, tol1 = NULL, tol2 = NULL, tol12 = NULL, distFunct = NULL, restrict = TRUE, keepData = FALSE, verbose = FALSE, ... )
x1 |
Matrix, data frame, SpatialPoints, or SpatialPointsDataFrame object. If this is a matrix or data frame, the first two columns must represent longitude and latitude (in that order). If |
x2 |
As |
rast |
Raster, RasterStack, or RasterBrick used to locate presences randomly. If this is a RasterStack or a RasterBrick then the first layer will be used (i.e., so cells with |
tol1 |
Numeric >0, maximum root-mean-square distance allowed between the set of observed pairwise distances between points in |
tol2 |
As |
tol12 |
As |
distFunct |
Either a function or |
restrict |
Logical, if |
keepData |
Logical, if |
verbose |
Logical, if |
... |
Arguments to pass to |
A list with two elements, each representing object of the same classes as x1 and x2 but with coordinates randomized.
randPointsRespectingSelf, randPointsRespectingSelfOther1, randPointsBatch, randPointsBatchSampled, randPointsBatchExtract, randPointsBatchNicheOverlap
library(dismo)
library(raster)
data(lemurs, package='enmSdm')
longLat <- c('decimalLongitude', 'decimalLatitude')
mad <- raster::getData('GADM', country='MDG', level=0)
elev <- raster::getData('alt', country='MDG', mask=TRUE, res=2.5)
# plot data as-is
plot(mad)
species <- sort(unique(lemurs$species))
for (i in seq_along(species)) {
thisLemur <- lemurs[lemurs$species == species[i], longLat]
points(thisLemur, pch=i, col=i)
}
legend('bottomleft', legend=species, pch=seq_along(species), col=seq_along(species))
# geographically thin presences of each species
thinLemurs <- data.frame()
for (i in seq_along(species)) {
thisLemur <- lemurs[lemurs$species == species[i], ]
thinned <- geoThin(thisLemur, minDist=10000, longLat=longLat)
thinLemurs <- rbind(thinLemurs, thinned)
}
# plot geographically thinned data
plot(mad)
for (i in seq_along(species)) {
thisLemur <- thinLemurs[thinLemurs$species == species[i], longLat]
points(thisLemur, pch=i, col=i)
}
legend('bottomleft', legend=species, pch=seq_along(species), col=seq_along(species))
# randomize one species with respect to itself
x <- thinLemurs[thinLemurs$species == 'Eulemur fulvus', longLat]
set.seed(123)
x1rand <- randPointsRespectingSelf(x=x, rast=elev, tol=24000, verbose=TRUE)
# plot observed and randomized occurrences
plot(mad)
points(x, pch=16)
points(x1rand, col='red')
# randomize two species with respect to selves and others
species1 <- species[1]
species2 <- species[3]
x1 <- thinLemurs[thinLemurs$species == species1, longLat]
x2 <- thinLemurs[thinLemurs$species == species2, longLat]
set.seed(123)
tol1 <- tol2 <- tol12 <- 16000
x12rand <- randPointsRespectingSelfOther2(x1=x1, x2=x2, rast=elev,
tol1=tol1, tol2=tol2, tol12=tol12, verbose=TRUE)
# plot geographically thinned data
plot(mad)
points(x1, pch=21, bg='cornflowerblue')
points(x2, pch=24, bg='cornflowerblue')
points(x12rand$x1rand, pch=1, col='red')
points(x12rand$x2rand, pch=2, col='red')
legend('bottomleft', legend=c(species1, species2,
legend=paste('rand', species1), paste('rand', species2)),
pch=c(21, 24, 1, 2), col=c('black', 'black', 'red', 'red'),
pt.bg=c('cornflowerblue', 'cornflowerblue', NA, NA))
### batch mode
## Not run:
# download climate data
clim <- raster::getData('worldclim', var='bio', res=2.5)
# lemur data
data(lemurs, package='enmSdm')
longLat <- c('decimalLongitude', 'decimalLatitude')
# geographically thin presences of each species
thinLemurs <- data.frame()
for (i in seq_along(species)) {
thisLemur <- lemurs[lemurs$species == species[i], ]
thinned <- geoThin(thisLemur, minDist=10000, longLat=longLat)
thinLemurs <- rbind(thinLemurs, thinned)
}
# randomize two species with respect to selves and others
species1 <- species[1]
species2 <- species[3]
x1 <- thinLemurs[thinLemurs$species == species1, longLat]
x2 <- thinLemurs[thinLemurs$species == species2, longLat]
# create null distributions
set.seed(123)
tol1 <- tol2 <- tol12 <- 24000
iterations <- 100 # for analysis set this to 100 or more
# for testing use a small number!
x12rand <- randPointsBatch('randPointsRespectingSelfOther2', x1=x1, x2=x2,
rast=clim[[1]], tol1=tol1, tol2=tol2, tol12=tol12, iterations=iterations,
verbose=TRUE)
# get environment that was sampled to use as background
bg <- randPointsBatchSampled(x12rand)
bgEnv <- raster::extract(clim, bg)
# create PCA of environmental space
vars <- paste0('bio', 1:19)
bgPca <- princomp(bgEnv[ , vars], cor=TRUE)
x1env <- raster::extract(clim, x1)
x2env <- raster::extract(clim, x2)
nas1 <- omnibus::naRows(x1env)
nas2 <- omnibus::naRows(x2env)
if (length(nas1) > 0) x1env <- x1env[-nas1, ]
if (length(nas2) > 0) x2env <- x2env[-nas2, ]
# observed niche overlap
obsOverlap <- enmSdm::nicheOverlap(
x1=x1env,
x2=x2env,
env=bgPca,
vars=vars,
bins=100,
cor=TRUE
)
# extract climate at randomized sites
x12rand <- randPointsBatchExtract(x12rand, clim, verbose=TRUE)
# null niche overlap
nullOverlap <- randPointsBatchNicheOverlap(
rands=x12rand,
env=bgPca,
vars=vars,
bins=100,
cor=TRUE
)
hist(nullOverlap$d, 20, main='Niche Overlap',
xlab='Schoener\'s D', xlim=c(0, 1))
abline(v=obsOverlap[['d']], col='blue', lwd=3)
legend('topright', legend='Observed', lwd=3, col='blue')
## End(Not run)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.