amt
Several different indices have been proposed for measuring home-range overlap. These are reviewed by Fieberg & Kochanny (2005). There are two general approaches used to calculate home-range overlap: 1) calculate the percentage overlap at a given isopleth level (this works for geometric and probabilistic home ranges) or 2) calculate an index of similarity between the two utilization distributions (UD; this only works for probabilistic estimators)1.
amt
amt
currently implements all methods to calculate
overlaps that were reviewed by Fieberg and Kochany (2005). These
are:
hr
: That is the proportion of the home range of
instance \(i\) that overlaps with the
home range of instance \(j\). This
measure does not rely on a UD and is directional (i.e., \(HR_{i,j} \ne HR_{j,i}\)) and bound between
0 (no overlap) and 1 (complete overlap)phr
: Is the probability of instance \(j\) being located in the home range of
instance \(i\). phr
is
also directional and bounded between 0 (no overlap) and 1 (complete
overlap)vi
: The volumetric intersection between two UDs.ba
: The Bhattacharyya’s affinity between two UDs.udoi
: A UD overlap index.hd
: Hellinger’s distance between two UDs.These overlap indices can be calculated with the function
hr_overlap
. The type of overlap measure an be controlled
with the argument type
.
All of these estimators can be calculated for a given home-range
level (i.e., using conditional UDs). Whether or not a conditional
overlap is desired or not, can be controlled with the argument
conditional
. For hr
, the argument
conditional
has no effect and the isopleths used for
home-range estimation will always be used for the overlap
calculation.
The function hr_overlap()
can also be provided with a
list of home-range estimates in situations when overlap between many
different instances are required. Currently, there are three options for
calculating overlap among multiple instances: which = "all"
calculates overlap for each pair of home ranges,
which = "one_to_all"
calculates overlap between the first
element in the list and all others, and
which = "consecutive"
will calculate overlap between
consecutive elements in the list.
First we need to load the required packages:
We will use tracking data from Fishers from New York State, USA.
Create a template raster for the KDE
And estimate home-ranges for both fishers
hr_leroy <- hr_kde(leroy, trast = trast, levels = c(0.5, 0.9))
hr_lupe <- hr_kde(lupe, trast = trast, levels = c(0.5, 0.9))
hr
and phr
are directional, this means the
order matters. For all other overlap measures the order does not
matter.
## # A tibble: 2 × 2
## levels overlap
## <dbl> <dbl>
## 1 0.9 0.309
## 2 0.5 0.191
## # A tibble: 2 × 2
## levels overlap
## <dbl> <dbl>
## 1 0.9 0.986
## 2 0.5 0.574
By default conditional = FALSE
and the full UD is
used.
## # A tibble: 1 × 2
## levels overlap
## <dbl> <dbl>
## 1 1 1.00
## # A tibble: 1 × 2
## levels overlap
## <dbl> <dbl>
## 1 1 0.759
If we set conditional = TRUE
, the overlap is measured at
home-range levels that were specified during estimation.
## # A tibble: 2 × 2
## levels overlap
## <dbl> <dbl>
## 1 0.5 0.580
## 2 0.9 0.992
## # A tibble: 2 × 2
## levels overlap
## <dbl> <dbl>
## 1 0.5 0.221
## 2 0.9 0.401
Note, for the remaining overlap measures the order does not matter.
Below we show this for the volumnic intersection
(type = "vi"
) as an example.
## # A tibble: 1 × 2
## levels overlap
## <dbl> <dbl>
## 1 1 0.439
## # A tibble: 1 × 2
## levels overlap
## <dbl> <dbl>
## 1 1 0.439
Lets calculate daily ranges for Lupe and then and then see how different ranges overlap with each other.
We have to use the same template raster in order to make ranges comparable.
Then we add a new column with day and calculate for each day a
KDE
home range.
dat <- lupe |>
mutate(week = lubridate::floor_date(t_, "week")) |>
nest(data = -week) |>
mutate(kde = map(data, hr_kde, trast = trast, levels = c(0.5, 0.95, 0.99)))
Now we can use the list column with the home-range estimates to
calculate overlap between the different home-ranges. By default
which = "consecutive"
, this means for each list entry (=
home-range estimate) the overlap to the next entry will be
calculated.
## # A tibble: 3 × 4
## from to levels overlap
## <int> <int> <dbl> <dbl>
## 1 1 2 1 0.0431
## 2 2 3 1 0.551
## 3 3 4 1 0.612
This works as well, if we set conditional = TRUE
:
## # A tibble: 9 × 4
## from to levels overlap
## <int> <int> <dbl> <dbl>
## 1 1 2 0.5 0
## 2 1 2 0.95 0.0264
## 3 1 2 0.99 0.0357
## 4 2 3 0.5 0.264
## 5 2 3 0.95 0.528
## 6 2 3 0.99 0.547
## 7 3 4 0.5 0.318
## 8 3 4 0.95 0.592
## 9 3 4 0.99 0.608
Sometimes it can be useful to provide meaningful labels. We can do
this with the labels
argument.
## # A tibble: 3 × 4
## from to levels overlap
## <chr> <chr> <dbl> <dbl>
## 1 2010-12-12 2010-12-19 1 0.0431
## 2 2010-12-19 2010-12-26 1 0.551
## 3 2010-12-26 2011-01-02 1 0.612
Different options exist for the argument which
. For
example, which = "one_to_all"
calculates the overlap
between the first and all other home ranges.
The function hr_overlap_feature
allows to calculate
percentage overlap (\(HR\) index)
between a home. To illustrate this feature, we will use again the data
from lupe
and calculate the intersection with an arbitrary
polygon.
poly <- amt::bbox(lupe, buffer = -500, sf = TRUE)
poly1 <- amt::bbox(lupe, sf = TRUE)
hr <- hr_mcp(lupe)
ggplot() + geom_sf(data = hr_isopleths(hr)) +
geom_sf(data = poly, fill = NA, col = "red") +
geom_sf(data = poly1, fill = NA, col = "blue")
## # A tibble: 1 × 3
## from to overlap
## <dbl> <int> <dbl>
## 1 0.95 1 0.828
## # A tibble: 1 × 3
## from to overlap
## <dbl> <int> <dbl>
## 1 0.95 1 1.00
## # A tibble: 1 × 3
## from to overlap
## <int> <dbl> <dbl>
## 1 1 0.95 0.854
## # A tibble: 1 × 3
## from to overlap
## <int> <dbl> <dbl>
## 1 1 0.95 0.542
The same work with several home-range levels:
hr <- hr_mcp(lupe, levels = c(0.5, 0.9, 0.95))
hr_overlap_feature(hr, poly, direction = "hr_with_feature")
## # A tibble: 3 × 3
## from to overlap
## <dbl> <int> <dbl>
## 1 0.5 1 0.828
## 2 0.9 1 0.860
## 3 0.95 1 0.990
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.3.2 (2023-10-31)
## os macOS Sonoma 14.4
## system aarch64, darwin20
## ui X11
## language (EN)
## collate C
## ctype en_US.UTF-8
## tz Europe/Berlin
## date 2024-04-01
## pandoc 3.1.11.1 @ /usr/local/bin/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date (UTC) lib source
## amt * 0.2.2.0 2024-04-01 [1] local
## backports 1.4.1 2021-12-13 [3] CRAN (R 4.3.0)
## bslib 0.6.1 2023-11-28 [3] CRAN (R 4.3.1)
## cachem 1.0.8 2023-05-01 [3] CRAN (R 4.3.0)
## checkmate 2.3.1 2023-12-04 [3] CRAN (R 4.3.1)
## class 7.3-22 2023-05-03 [3] CRAN (R 4.3.2)
## classInt 0.4-10 2023-09-05 [3] CRAN (R 4.3.0)
## cli 3.6.2 2023-12-11 [3] CRAN (R 4.3.1)
## codetools 0.2-19 2023-02-01 [3] CRAN (R 4.3.2)
## colorspace 2.1-0 2023-01-23 [3] CRAN (R 4.3.0)
## data.table 1.15.2 2024-02-29 [3] CRAN (R 4.3.1)
## DBI 1.2.2 2024-02-16 [3] CRAN (R 4.3.1)
## digest 0.6.35 2024-03-11 [3] CRAN (R 4.3.1)
## dplyr * 1.1.4 2023-11-17 [3] CRAN (R 4.3.1)
## e1071 1.7-14 2023-12-06 [3] CRAN (R 4.3.1)
## evaluate 0.23 2023-11-01 [3] CRAN (R 4.3.1)
## fansi 1.0.6 2023-12-08 [3] CRAN (R 4.3.1)
## farver 2.1.1 2022-07-06 [3] CRAN (R 4.3.0)
## fastmap 1.1.1 2023-02-24 [3] CRAN (R 4.3.0)
## generics 0.1.3 2022-07-05 [3] CRAN (R 4.3.0)
## ggforce 0.4.1 2022-10-04 [3] CRAN (R 4.3.0)
## ggplot2 * 3.4.4 2023-10-12 [3] CRAN (R 4.3.1)
## ggraph * 2.1.0 2022-10-09 [3] CRAN (R 4.3.0)
## ggrepel 0.9.5 2024-01-10 [3] CRAN (R 4.3.1)
## glue 1.7.0 2024-01-09 [3] CRAN (R 4.3.1)
## graphlayouts 1.1.0 2024-01-19 [3] CRAN (R 4.3.1)
## gridExtra 2.3 2017-09-09 [3] CRAN (R 4.3.0)
## gtable 0.3.4 2023-08-21 [3] CRAN (R 4.3.0)
## highr 0.10 2022-12-22 [3] CRAN (R 4.3.0)
## htmltools 0.5.7 2023-11-03 [3] CRAN (R 4.3.1)
## igraph 2.0.1.1 2024-01-30 [3] CRAN (R 4.3.1)
## jquerylib 0.1.4 2021-04-26 [3] CRAN (R 4.3.0)
## jsonlite 1.8.8 2023-12-04 [3] CRAN (R 4.3.1)
## KernSmooth 2.23-22 2023-07-10 [3] CRAN (R 4.3.2)
## knitr 1.45 2023-10-30 [3] CRAN (R 4.3.1)
## labeling 0.4.3 2023-08-29 [3] CRAN (R 4.3.0)
## lattice 0.22-5 2023-10-24 [3] CRAN (R 4.3.1)
## lifecycle 1.0.4 2023-11-07 [3] CRAN (R 4.3.1)
## lubridate 1.9.3 2023-09-27 [3] CRAN (R 4.3.1)
## magrittr 2.0.3 2022-03-30 [3] CRAN (R 4.3.0)
## MASS 7.3-60.0.1 2024-01-13 [3] CRAN (R 4.3.1)
## Matrix 1.6-5 2024-01-11 [3] CRAN (R 4.3.2)
## munsell 0.5.0 2018-06-12 [3] CRAN (R 4.3.0)
## pillar 1.9.0 2023-03-22 [3] CRAN (R 4.3.0)
## pkgconfig 2.0.3 2019-09-22 [3] CRAN (R 4.3.0)
## polyclip 1.10-6 2023-09-27 [3] CRAN (R 4.3.1)
## proxy 0.4-27 2022-06-09 [3] CRAN (R 4.3.0)
## purrr 1.0.2 2023-08-10 [3] CRAN (R 4.3.0)
## R6 2.5.1 2021-08-19 [3] CRAN (R 4.3.0)
## rbibutils 2.2.16 2023-10-25 [3] CRAN (R 4.3.1)
## Rcpp 1.0.12 2024-01-09 [3] CRAN (R 4.3.1)
## Rdpack 2.6 2023-11-08 [3] CRAN (R 4.3.1)
## rlang 1.1.3 2024-01-10 [3] CRAN (R 4.3.1)
## rmarkdown 2.25 2023-09-18 [3] CRAN (R 4.3.1)
## rstudioapi 0.15.0 2023-07-07 [3] CRAN (R 4.3.0)
## sass 0.4.8 2023-12-06 [3] CRAN (R 4.3.1)
## scales 1.3.0 2023-11-28 [3] CRAN (R 4.3.1)
## sessioninfo 1.2.2 2021-12-06 [3] CRAN (R 4.3.0)
## sf 1.0-16 2024-03-24 [3] CRAN (R 4.3.1)
## survival 3.5-7 2023-08-14 [3] CRAN (R 4.3.2)
## terra 1.7-71 2024-01-31 [3] CRAN (R 4.3.1)
## tibble 3.2.1 2023-03-20 [3] CRAN (R 4.3.0)
## tidygraph * 1.3.1 2024-01-30 [3] CRAN (R 4.3.1)
## tidyr 1.3.1 2024-01-24 [3] CRAN (R 4.3.1)
## tidyselect 1.2.1 2024-03-11 [3] CRAN (R 4.3.1)
## timechange 0.3.0 2024-01-18 [3] CRAN (R 4.3.1)
## tweenr 2.0.2 2022-09-06 [3] CRAN (R 4.3.0)
## units 0.8-5 2023-11-28 [3] CRAN (R 4.3.1)
## utf8 1.2.4 2023-10-22 [3] CRAN (R 4.3.1)
## vctrs 0.6.5 2023-12-01 [3] CRAN (R 4.3.1)
## viridis 0.6.4 2023-07-22 [3] CRAN (R 4.3.0)
## viridisLite 0.4.2 2023-05-02 [3] CRAN (R 4.3.0)
## withr 3.0.0 2024-01-16 [3] CRAN (R 4.3.1)
## xfun 0.41 2023-11-01 [3] CRAN (R 4.3.1)
## yaml 2.3.8 2023-12-11 [3] CRAN (R 4.3.1)
##
## [1] /private/var/folders/ln/h3zng0fs2pq7mhn_hzn0d8x00000gn/T/Rtmphl5CVm/Rinst6cb5562535ee
## [2] /private/var/folders/ln/h3zng0fs2pq7mhn_hzn0d8x00000gn/T/RtmpgKr8k0/temp_libpath6a0129d1adcf
## [3] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library
##
## ──────────────────────────────────────────────────────────────────────────────
For a discussion of geometric vs. probabilistic estimators see here: https://www.biorxiv.org/content/10.1101/2020.08.19.256859v2↩︎