Quantifies projected climatic change relative to the climatic niche represented by a species' current distribution. A weighted current reference defines the niche centre and empirical radial boundary. Present and projected conditions at each location give local climatic displacement, signed change in niche distance, a derived non-radial reconfiguration term, and exceedance beyond the niche boundary. Occurrence records, range maps, and binary or continuous species distribution model outputs can define reference weights. Matrix and spatial workflows return location-level values, weighted summaries, maps and climatic-variable contributions.
Current-to-future climatic distance shows how much climate changes at a site,
but not where projected conditions fall within the climatic niche represented
by a species' current distribution. climniche calculates both the local
displacement and the niche position reached.
Website: https://bohao0813.github.io/climniche/
Install the CRAN release:
install.packages("climniche")
Install the development version from GitHub:
install.packages("remotes")
remotes::install_github("Bohao0813/climniche")
Non-negative location weights define the current climatic niche reference. These weights may come from occurrence records, range maps, binary SDMs or continuous suitability maps. At each site, projected climate is compared with both the local current climate and the shared niche centre and empirical radial boundary. Field names use snake case in R objects; figures and reports use the formal names below.
climate_change_amount): distance between current
and future conditions at the same site under the fitted climatic metric.niche_distance_change): signed change in distance
from the current climatic niche reference centre.climate_reconfiguration): non-radial component
of Climatic Displacement that is not captured by Niche Distance Shift. It is
derived from those two quantities.niche_boundary_exceedance): positive excess of
future niche distance beyond the empirical radial boundary of the current
climatic niche reference.Climatic Displacement, Niche Distance Shift and Climatic Reconfiguration obey the fitted geometric identity $D_i^2 = R_i^2 + C_i^2$. Climatic Reconfiguration is therefore not an independent exposure dimension. Niche Boundary Exceedance is a future boundary-relative state rather than a change in boundary status. Locations with similar Climatic Displacement can therefore be distinguished by where their projected climates fall within or beyond the current niche.
Every input interface follows the same four steps.
fit_climniche() accepts numeric matrices and data frames.
fit_climniche_raster() accepts RasterLayer, RasterStack and RasterBrick
objects, whereas fit_climniche_terra() accepts SpatRaster objects. A fitted
reference can also be created with fit_climniche_reference() and reused with
project_climniche().
library(climniche)
sim <- simulate_climniche()
fit <- fit_climniche(
current = sim[["current"]],
future = sim[["future_away"]],
occupied = sim[["occupied"]],
sensitivity = sim[["sensitivity"]]
)
climniche_summary(fit)
climniche_report(fit, species = "example species")
plot_climniche_summary_figure(fit)
fit_climniche_raster() and fit_climniche_terra() accept binary reference
rasters and continuous SDM suitability rasters. Continuous values remain
weights; occupied_threshold only sets values at or below the cutoff to zero.
The supplied numerical scale is used as a relative weighting scale, not as an
occurrence probability. domain limits the cells evaluated, while
study_region adds an optional boundary to maps.
fit_climniche_series() holds the fitted current niche reference, climatic
weighting matrix and empirical radial boundary fixed across ordered
projections. For spatial series, future missing cells do not alter this
reference; comparisons use cells available in every projection.
future <- lapply(c(0.25, 0.50, 0.75, 1), function(fraction) {
sim[["current"]] + fraction *
(sim[["future_away"]] - sim[["current"]])
})
series <- fit_climniche_series(
current = sim[["current"]],
future = future,
time = c(2030, 2050, 2070, 2090),
occupied = sim[["occupied"]],
sensitivity = sim[["sensitivity"]]
)
climniche_range_summary(series)
departure <- climniche_departure(series)
plot_climniche_time(series)
Range summaries separate the Weighted Niche Boundary Exceedance Fraction from
Conditional Relative Niche Boundary Exceedance. Their product is Range Mean
Relative Niche Boundary Exceedance. These are weighted summaries of Niche
Boundary Exceedance, not additional cell-level exposure metrics.
Optional aggregation and raster cell area weights remain separate from the
reference weights used to estimate the current climatic niche reference.
climniche_departure() records the first supplied projection beyond the niche
boundary and the fraction of supplied projections in which exceedance occurs.
Persistent onset can be requested separately with persistence.
climniche_priority() compares one climatic quantity with an ecological or
management criterion using two-objective Pareto screening. The example below
compares larger positive Niche Distance Shift with smaller Climatic
Displacement in separate screens.
positive_shift <- climniche_priority(
fit,
exposure = "niche_distance_change",
exposure_direction = "maximize"
)
low_displacement <- climniche_priority(
fit,
exposure = "climate_change_amount",
positive_only = FALSE,
exposure_direction = "minimize"
)
Each result retains the decision plane, Pareto fronts and spatial Pareto depth.
Supply an external ecological or management layer through criterion when the
second objective is intended to represent evidence independent of the
reference weighting surface.
climniche_dominant_contribution() identifies the climate variable with the
largest absolute contribution to squared niche distance change at each cell. Its
dominance share measures how much of the total absolute contribution is
assigned to that variable. These terms decompose the squared-distance change
underlying Niche Distance Shift; they are not SDM variable importance.
contribution <- climniche_dominant_contribution(fit)
summary(contribution)
For a spatial fit, plot_climniche_dominant_contribution() maps the dominant
variable and its share within the selected reference cells.
The European anchovy example demonstrates the fitted geometry and radial boundary comparison in the Mediterranean Sea. The exposure through time example follows range-level exposure and persistent Niche Boundary Exceedance from 2030 to 2090. The ecological screening example contrasts larger positive Niche Distance Shift with lower Climatic Displacement. The climatic contribution example maps the fitted climate variables that account for squared niche distance change.
Contributions are welcome. Please make a pull request or contact bohao.he@polimi.it.