| Dataset | Species | Sensor | Individuals | Fixes | From | To |
|---|---|---|---|---|---|---|
| African buffalo | Syncerus caffer | gps | 6 | 28,410 | 2005-02 | 2006-12 |
| Parti-coloured bat | Vespertilio murinus | radio-transmitter | 17 | 1,740 | 2002-06 | 2003-06 |
| Turkey vulture | Cathartes aura | gps | 1 | 35,256 | 2007-06 | 2013-03 |
Datasets
Three tracks, four rasters, two package datasets, and some animals we made up
All three datasets come from Movebank, the public repository for animal tracking data, and are redistributed here under their original licences for teaching. They live in the data/ folder of the course repository, gzipped — R reads .csv.gz directly, no need to decompress.
They were chosen because they fail in different ways. Real tracking data is never clean, and each of these teaches a different lesson about that.
Overview
1. African buffalo, Kruger National Park
data/buffalo_kruger.csv.gz
Six GPS-collared buffalo (Syncerus caffer) in Kruger National Park, South Africa, 2005–2006. Collars reported roughly hourly. This is our workhorse dataset: several individuals, a long series, a confined landscape with strong environmental gradients (rivers, vegetation).
The raw file contains 3,747 rows that duplicate an existing individual + timestamp combination — about 13% of the file. These come from the tag transmitting the same fix more than once. If you compute step lengths without removing them you get a large number of zero-length steps in zero elapsed time, and your speed distribution acquires an infinite tail.
We fix this properly in Session 3.
Used in: Sessions 1, 2, 3, 4, 5, 6 and 8.
Source: Getz WM, Fortmann-Roe S, Cross PC, Lyons AJ, Ryan SJ, Wilmers CC. Movebank study Kruger African Buffalo, GPS tracking, South Africa.
2. Parti-coloured bat, Switzerland
data/bat_safi.csv.gz
Seventeen bats (Vespertilio murinus) tracked by VHF radio-telemetry near Bern, Switzerland, 2002–2003. Only 1,740 fixes in total.
This is what tracking looked like before GPS, and what it still looks like for any animal too small to carry a satellite tag. Fixes arrive when a human with an antenna managed to get a bearing — so intervals are wildly irregular, nights are dense and days are empty, and individuals have between a handful and a few hundred locations.
Most of the methods in this course assume regular sampling. Applying them here without thinking produces confident nonsense — which is exactly why we use this dataset to practise saying “no, not with these data”.
Used in: Session 3 (as a cautionary counter-example).
Source: Safi K, et al. Movebank study Parti-colored bat Safi Switzerland.
3. Turkey vulture “Leo”
data/vulture_leo.csv.gz
A single turkey vulture (Cathartes aura) called Leo, tracked by GPS for almost six years (2007–2013) between Canada and Venezuela — over 60° of latitude.
Leo is not doing one thing. He has breeding-ground residency, autumn migration, wintering residency, and spring migration, repeated over six annual cycles. A single home range estimate over the whole track is meaningless — it would describe a “range” covering two continents.
This is the dataset for Session 4: a trajectory that demands segmentation before any other analysis makes sense. It also crosses many UTM zones, which makes it a good test of whether you have understood projections.
Used in: Session 4.
Source: Bildstein K, Barber D, Bechard MJ. Movebank study Turkey Vulture Acopian Center USA GPS.
4. Environmental rasters for Kruger
All cropped to the buffalo range and stored in data/:
| File | What | Resolution | Source |
|---|---|---|---|
kruger_ndvi_2005.tif |
NDVI, two 16-day composites: 2 Feb 2005 (wet) and 14 Sep 2005 (dry) | 250 m | MODIS MOD13Q1, via MODISTools
|
kruger_elevation.tif |
Elevation | ~900 m | SRTM, via geodata
|
kruger_landcover.tif |
Fractional cover of trees, grassland, shrubs, cropland | ~900 m | ESA WorldCover, via geodata
|
kruger_prec_monthly.tif |
Long-term mean precipitation, one layer per month | ~4.6 km | WorldClim 2.1, via geodata
|
Used in: Sessions 2 and 3. The precipitation climatology is not used in the practicals; it is there for projects that need a seasonal covariate.
MODIS stores NDVI as integers multiplied by 10,000, with −3,000 as the fill value. MODISTools::mt_to_terra() already rescales to NDVI units; applying the 0.0001 factor a second time gives values ten thousand times too small. It happened while this file was being built. Always summary() a new covariate and check that NDVI lies between −1 and 1.
5. Fishers in New York (from amt)
Four fishers (Pekania pennanti) tracked by GPS every 2–15 minutes in New York State (LaPoint et al. 2013), shipped with the amt package together with land use (GlobCover, 300 m), elevation and human population density.
library(amt)
data(amt_fisher)
covariates <- get_amt_fisher_covars()Used in: Session 7.
6. Mongolian gazelles (from ctmm)
Thirty-six gazelles (Procapra gutturosa) tracked for about a year, shipped with ctmm. They are nomadic: the textbook case of an animal whose variogram does not level off, so a home range is not a meaningful summary.
Used in: Session 6.
7. Simulated animals
R/simulators.R contains the random-walk simulators you build in Session 5: correlated and biased walks, a central-place walker whose true home range is known (truth_animal(), truth_area()), and an animal that selects habitat with a known coefficient (simulate_ssf()).
data/hr_ground_truth.csv holds the results of R/hr_ground_truth.R: twenty simulated animals, each with five home-range estimates and the true area.
Used in: Sessions 1, 5, 6 and 7.
Movebank column conventions
Movebank exports share a vocabulary. When R reads the CSV, hyphens in the header become dots, so location-long becomes location.long.
| Column | Meaning |
|---|---|
event.id |
Unique id of this record |
timestamp |
Fix time, UTC, YYYY-MM-DD HH:MM:SS.sss
|
location.long, location.lat
|
Longitude / latitude, decimal degrees, WGS84 (EPSG:4326) |
individual.local.identifier |
The animal’s name or code — your grouping variable |
tag.local.identifier |
The device — not the same as the animal |
individual.taxon.canonical.name |
Species |
sensor.type |
gps, radio-transmitter, argos-doppler-shift, … |
visible |
false = flagged as bad by the data owner |
manually.marked.outlier |
true = flagged by hand as an outlier |
study.local.timestamp, study.timezone
|
Local time, if you need day/night |
Always keep timestamp in UTC for computation and convert to local time only for interpretation. Mixing the two is the single most common source of silent errors in movement analysis.
Never assume individual == tag. Tags get redeployed on different animals, and animals get recollared. Group by the individual.
Loading a dataset
library(dplyr)
buffalo <- read.csv("data/buffalo_kruger.csv.gz") |>
transmute(
id = individual.local.identifier,
t = as.POSIXct(timestamp, tz = "UTC"),
x = location.long,
y = location.lat
) |>
filter(!is.na(x), !is.na(y)) |>
distinct(id, t, .keep_all = TRUE) |> # the duplicate fix described above
arrange(id, t)
glimpse(buffalo)Using your own data
You are welcome to use your own tracking data for the final project. Bring it in the same shape — one row per fix, with id, t, x, y — and tell me the CRS of the coordinates if they are not longitude/latitude. Talk to me before Session 5 so we can check the analysis you have in mind is feasible.