Conventionally, researchers have calculated population range estimates by taking the union of individual home-range coverage areas as the population coverage areas. Statistically, this is far from ideal and researchers know this, because they look at saturation curves of how the estimates depend on the sample size.
For a while now, ctmm has had the mean() function, which calculates the average of the individual home-range distributions, which is an improvement over merging the individual coverage areas, but this still isn't extrapolating out to the unknown population. Here is an example where the difference is very noticeable:
On the left is the mean of the (n=3 sample) individual distributions and on the right is the output of the new pkde() hierarchical kernel density estimation function, which places kernels of density on every sampled time, with a bandwidth optimized for population-range estimation, and accounting for autocorrelation and irregular sampling + a bias correction.
# code to reproduce the above plot
devtools::install_github("ctmm-initiative/ctmm")
library(ctmm)
data(buffalo)
DATA <- buffalo[4:6] # three northern buffalo
FITS <- list()
for(i in 1:length(DATA))
{
GUESS <- ctmm.guess(DATA[[i]],interactive=FALSE)
# using ctmm.fit here for speed, but you should almost always use ctmm.select
FITS[[i]] <- ctmm.fit(DATA[[i]],GUESS,trace=2)
}
dt <- 2 %#% 'min' # from dt.plot
UDS <- akde(DATA,FITS,weights=TRUE,dt=dt,trace=TRUE)
MEAN <- mean(UDS) # distribution of the sample
PKDE <- pkde(DATA,UDS) # distribution of the population
EXT <- extent(list(MEAN,PKDE))
COL <- c('red','yellow','green')
par(mfrow=c(1,2))
plot(DATA,MEAN,col=COL,ext=EXT); title('mean()')
plot(DATA,PKDE,col=COL,ext=EXT); title('pkde()')
summary(MEAN)
summary(PKDE) # twice as large