This blog post is from a series of posts on gorilla and biodiversity research in Rwanda. I have introduced the people, the place, and a little on the beasties there. Now we’ll talk some R-code for doing home range estimation.
Home range estimation is a pretty deep and also abstract concept. Heuristically, it is the process looking at where an animal or group of animals move in the world. If one were to create a home range map for me, it’d be a pretty simple bimodal map of home and work.
Where it gets funky, is what does one do with the unusual places that an animal travels. So, for my home range, I am mostly at work, home, church on Sundays, yoga, and the grocery store. But I did spend 2 weeks in Rwanda, one week in Tanzania, one week in Belgium and the Netherlands, one week in Seattle, one in Raleigh, etc. etc.. Should these places be part of my home range?
All this to say usually home ranges are calculated with some means to not include the less common places. I would be happy if East Africa were part of my home range, but I think it’s arguable that it is not yet so.
Also, depending on the approach we use, travel between places may or may not be considered part of the home range. Back to my home range: ideally even if we concluded that 2 weeks living in Rwanda expanded my home range to include Musanze, the flight there and back probably shouldn’t be included in my home range. For our work today, we are not going to be excluding travel from our home range calculations, but understand that it can be relevant to some home range calculations.
For our home range calculation today, the following assumptions will be made:
- We won’t be explicitly excluding travel from our home range calculations.
- We’ll use simple techniques to exclude ephemeral portions of the home range
For basic home range analysis, we’ll use R’s adehabitat home range (adehabitatHR) package.
# Load the adehabitatHR library # Load appropriate libraries for loading and manipulating data library(sp) # Spatial data objects in R library(rgdal) # Geospatial Data Abstraction Library library(adehabitatHR) # Adehabitat HomeRange library(readr) # File read capacity library(rgeos) # Geometric calculation to be used later library(maptools) # more spatial stuff
Now that we have every library we need loaded (and maybe then some) let’s load the data.
# We need to add a data filter here... . # For now, we assign just the columns we need for HR calculation loc_int_totf <- loc_int_tot[,c('X','Y', 'id')]
We’ll want to explicitly turn these data into geospatial data.
# Use sp library to assign coordinates and projection coordinates(loc_int_totf) <- c("X", "Y") # Our projection is UTM Zone 35S # proj4string acquired at spatialreference.org proj4string(loc_int_totf) <- CRS("+proj=utm +zone=35 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs")
Now we are ready to do some home range calculations. We’ll use the kernelUD function to convert our data into a surface representing our home range estimate. The total of all the pixels in this surface (as represented by a raster) will total to 1, or 100 of the home range.
# Estimating the utilization distribution using "reference" bandwidth kud <- kernelUD(loc_int_totf) # Display the utilization distribution image(kud)
Recall that the total of all the pixel values here is 1. This means that this image represents 100 percent of the calculated range of the Golden Monkeys. If we want to calculate the 70% homerange (what we estimate the golden monkeys spend 70% of their time in) we would do so as follows:
# Estimate the homerange from the utilization distribution homerange <- getverticeshr(kud, 70) plot(homerange)
Now it would be useful to convert this to a data frame so that we can further manipulate and understand the data. For example, what is the home range size for any given percentile?
# Calculate home range sizes as.data.frame(homerange) # Calculate home range sizes for every 5% from 50-95% ii <- kernel.area(kud, percent=seq(1, 99, by=1)) plot(ii)
Finally, it would be nice to be able to get these data out of R and display alongside other GIS data. We’ll use writeOGR as part of RGDAL to do so.
# Write out data writeOGR(homerange, getwd(), "homerange", driver="ESRI Shapefile")
That’s it for today. This bit of R will serve as the core code for a range of different analyses. Stay tuned!