Skip to main content
No replies
Joined: 09/11/2019

Trying to find out if there is a way or function that can be used to set up borders for animals? I know that, by and large, animals that can't swim shouldn't have UDs set over water. It used to be that it was achievable for calculating the KUD using adeHabitat package. I don't want to regress to KUD data calculation just so that I could account for the land-water/ocean interface, as I understand the superiority of dynamic brownian bridge movement models over KUDs. And if there isn't a way, is a function possibly going to be created some time soon? Thanks for your help, Anne

Joined: 06/07/2012

Hi Anne,

I've never used the KUD from adehabitatHR, but I just went through the example, and it seems that what the function does is that it calculates the average distance moved by the animal within 6h, and sets all pixels within this width on the other side of the barrier to 0.

So, you can do something similar (but without this 6h distance) by using a polygon, or a raster to mask you resulting dbbmm or ud. For example:


## calculating dBBMM
leroy_p <- spTransform(leroy, CRSobj="+proj=aeqd +ellps=WGS84", center=TRUE)
dbbmm <- brownian.bridge.dyn(object=leroy_p, location.error=20, raster=100, ext=.45)
## calculating corresponding UD
ud <- getVolumeUD(dbbmm)
plot(ud, col=(terrain.colors(100)))

## creating polygon that will represent the area where the animal biologically cannot be found
polyg <- SpatialPolygons(list(Polygons(list(Polygon(matrix(c(c(-6749.8498, -3676.0562,  -525.4177,  1703.0827,  3163.1347,  6774.8423,  6736.4198, -6826.6946,-6749.8498), c(6259.439, 1341.369, -1309.778, -3115.632, -3538.279, -4844.641, -6688.917, -7265.253,6259.439)), byrow=F, ncol=2))),ID="water")),proj4string=CRS(projection(dbbmm)))
## creating a raster and  masking the raster with the polygon. The are of the polygon will contain NAs
maskRaster <- raster(dbbmm)
maskRaster[] <- 1
maskRaster <- mask(maskRaster,polyg, inverse=T)

## masking the dbbmm with a polygon or with a raster
dbbmmMsk <- mask(dbbmm, maskRaster)

## to calculate the UD the raster of the dBBMM has to sum up to 1, but by setting a series of cells to NA, this is not anymore the case, and we have to normalize it
cellStats(dbbmmMsk, sum)
dbbmmMskN <- dbbmmMsk/(cellStats(dbbmmMsk, sum))
cellStats(dbbmmMskN, sum)
dbbmmMskud <- as(dbbmmMskN,".UD") # converting it to class .UD

udMsk <- getVolumeUD(dbbmmMskud)
contour(udMsk, levels=c(.5,.95), add=T)

## probably one could also just mask the UD. In most cases it probably does not make a big difference
udMsk2 <- mask(ud, maskRaster)
contour(udMsk2, levels=c(.5,.95), add=T)


Hope this helps.