context("lrren")
##################
# lrren testthat #
##################
# Generate testing data
## Environmental Covariates
library(envi)
library(sf)
library(spatstat.data)
library(spatstat.geom)
library(spatstat.random)
library(terra)
set.seed(1234)
# -------------- #
# Prepare inputs #
# -------------- #
# Using the `bei` and `bei.extra` data from {spatstat.data}
elev <- spatstat.data::bei.extra$elev
grad <- spatstat.data::bei.extra$grad
elev$v <- scale(elev)
grad$v <- scale(grad)
elev_raster <- terra::rast(elev)
grad_raster <- terra::rast(grad)
## Presence Locations
presence <- spatstat.data::bei
spatstat.geom::marks(presence) <- data.frame("presence" = rep(1, presence$n),
"lon" = presence$x,
"lat" = presence$y)
spatstat.geom::marks(presence)$elev <- elev[presence]
spatstat.geom::marks(presence)$grad <- grad[presence]
# (Pseudo-)Absence Locations
set.seed(1234) # for reproducibility
absence <- spatstat.random::rpoispp(0.008, win = elev)
spatstat.geom::marks(absence) <- data.frame("presence" = rep(0, absence$n),
"lon" = absence$x,
"lat" = absence$y)
spatstat.geom::marks(absence)$elev <- elev[absence]
spatstat.geom::marks(absence)$grad <- grad[absence]
# Combine
obs_locs <- spatstat.geom::superimpose(presence, absence, check = FALSE)
obs_locs <- spatstat.geom::marks(obs_locs)
obs_locs$id <- seq(1, nrow(obs_locs), 1)
obs_locs <- obs_locs[ , c(6, 2, 3, 1, 4, 5)]
# Prediction Data
predict_xy <- terra::crds(elev_raster)
predict_locs <- as.data.frame(predict_xy)
colnames(predict_locs) <- c("lon", "lat")
predict_locs$elev <- terra::extract(elev_raster, predict_xy)[ , 1]
predict_locs$grad <- terra::extract(grad_raster, predict_xy)[ , 1]
# Test custom window
custom_chull <- grDevices::chull(x = obs_locs[ , 5], y = obs_locs[ , 6])
custom_chull_pts <- obs_locs[c(custom_chull, custom_chull[1]), 5:6]
custom_poly <- sf::st_polygon(list(as.matrix(custom_chull_pts)))
custom_owin <- spatstat.geom::owin(poly = list(x = rev(sf::st_coordinates(custom_poly)[ , 1]),
y = rev(sf::st_coordinates(custom_poly)[ , 2])))
test_that("lrren throws error with invalid arguments", {
# Predict without predict_locs
expect_error(
lrren(obs_locs = obs_locs,
predict = TRUE,
predict_locs = NULL,
conserve = TRUE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
# Fewer than 1 fold
expect_error(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = TRUE,
kfold = 0,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
# poly_buffer not of class 'owin'
expect_error(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = custom_poly,
verbose = FALSE)
)
# If conserve = FALSE, predict_locs must be specified
expect_error(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = FALSE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = custom_poly,
verbose = FALSE)
)
}
)
test_that("lrren throws warning for points lying outside the specified window", {
# Only estimates ecological niche
## No poly_buffer
expect_warning(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = 0,
obs_window = NULL,
verbose = FALSE)
)
}
)
test_that("lrren produces progress messages", {
expect_message(
lrren(obs_locs = obs_locs,
predict = TRUE,
predict_locs = predict_locs,
conserve = TRUE,
cv = TRUE,
kfold = 10,
balance = TRUE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = TRUE)
)
}
)
test_that("lrren works", {
# Only estimates ecological niche
## Conserved estimation
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
# Only estimates ecological niche
## Unconserved estimation
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = predict_locs,
conserve = FALSE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
# Only estimates ecological niche
## Large poly_buffer
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = predict_locs,
conserve = FALSE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = 1,
obs_window = NULL,
verbose = FALSE)
)
# Only estimates ecological niche
## Custom obs_window
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = custom_owin,
verbose = FALSE)
)
# Only estimates ecological niche
## p-value correction
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = predict_locs,
conserve = FALSE,
p_correct = "Bonferroni",
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
# Estimate and cross-validation
## Unbalanced sampling
## Not parallel
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = TRUE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
# Estimate and cross-validation
## Balanced sampling
## Not parallel
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = TRUE,
kfold = 10,
balance = TRUE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
# Estimate and predict
expect_named(
lrren(obs_locs = obs_locs,
predict = TRUE,
predict_locs = predict_locs,
conserve = TRUE,
cv = FALSE,
kfold = 10,
balance = FALSE,
parallel = FALSE,
n_core = NULL,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
}
)
test_that("parallel processing with future package functions properly", {
# Estimate and cross-validation
## Unbalanced sampling
## Parallel (n = 2 cores)
expect_named(
lrren(obs_locs = obs_locs,
predict = FALSE,
predict_locs = NULL,
conserve = TRUE,
cv = TRUE,
kfold = 10,
balance = TRUE,
parallel = TRUE,
n_core = 2,
poly_buffer = NULL,
obs_window = NULL,
verbose = FALSE)
)
}
)
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.