Introduction to Cormack-Jolly-Seber mark-recapture models in R

James E Paterson

Photograph of White-throated Dipper by Mark Medcalf (licensed under CC BY 2.0)

Mark-recapture studies are useful for estimating population size and survival in wildlife populations, but can be overwhelming because of the massive amount of literature on their development and application.

Let’s dip our toes into some capture-recapture models using the famous dipper data set and the marked package in R.

The syntax (and approach) is almost identical using RMark to access the widely used MARK program. The code from this tutorial is available on my GitHub page for mark-recapture workshops

Let’s get started!

What are Cormack-Jolly-Seber mark-recapture models for?

You went to a study site and sampled a wildlife population. You identified animals through marks, tags, patterns, or some other characteristic. Later, you went back and sampled the population again. Some of the animals in this sample will be recaptures of the previous sampling event, and some will be new. You want to estimate the probability of animals surviving between capture events.

There are two challenges with these data.

First, some animals died, some animals were born (or hatched or similar), some left the study area (emmigrated) and some moved into the study area (immigrated) between sampling events (open population).

Second, the probability of finding, catching, or detecting an animal in a capture event is less than one. Thus, some animals are alive and in the study area during a capture event, but aren’t detected.

How do we turn this information into estimates of survival?

Cormack-Jolly-Seber models are mark-recapture models used to estimate two parameters:

  • detection probability (\(p_t\), the probability of encountering a live animal at time t)
  • apparent survival (\(\Phi_t\), the probability of an animal surviving and remaining in the study area between time t and t + 1).

“Apparent” survival confounds surviving and remaining in the study area. For the rest of the post, I use “survival” when describing apparent survival for simplicity. But, be warned!

##        ch    sex
## 1 0000001 Female
## 2 0000001 Female
## 3 0000001 Female
## 4 0000001 Female
## 5 0000001 Female
## 6 0000001 Female

The capture histories are stored in a dataframe where:

  • each row represents one individual
  • the capture histories (0 for undetected, 1 for detected) are stored in a field named “ch”
  • grouping variables or individual covariates can be added (e.g. “sex” in this data set)

Now we’re ready to build a basic CJS model.