Datasets

Three tracks, four rasters, two package datasets, and some animals we made up

Modified

September 30, 2026

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

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

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).

ImportantThe lesson this dataset teaches: duplicates

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.

ImportantThe lesson this dataset teaches: small, irregular, hand-collected data

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.

ImportantThe lesson this dataset teaches: one animal, many behaviours

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.

WarningA real scale-factor trap

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.

library(ctmm)
data(gazelle)

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
TipTwo habits worth forming now

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.