Appendix G — Telemetry

In some capture–recapture studies there are additional data from radiotelemetry of a sample of animals. Telemetry fixes provide an unbiased sample of animal activity, unlike detections at fixed points (traps, cameras or hair snares) or from searching circumscribed areas. Telemetry data therefore provide a direct estimate of the spatial scale of activity, which is represented in spatially explicit capture–recapture (SECR) by the parameter \sigma. Telemetry data also reduce uncertainty regarding the location of animals’ centres relative to detectors, so detection histories of telemetered animals may improve estimates of other parameters. These are potential benefits – we do not consider whether they are realised in practice.

Previous examples are Sollmann et al. (2013), Whittington et al. (2018), Linden et al. (2018). Combining data types has been considered generally by Gopalaswamy et al. (2012), Chandler et al. (2021), Ruprecht et al. (2021), Margenau et al. (2022) and others.

This chapter explains and demonstrates the use of telemetry data in the R package secr, particularly the use of the ‘telemetry’ detector type.

Warning

Telemetry is used in secr to augment SECR analyses, particularly the estimation of population density. secr is not intended for the detailed analysis of telemetry data per se. There is no provision in the data structure for recording the time of each fix, except as each relates to a discrete sampling occasion. Nor is there provision for associating behavioural or environmental covariates with each fix.

G.1 Example

We start with a concrete example based on a simulated dataset.

Show simulation code
# Code to simulate capthist objects (trCH, teCH)

# detectors
te <- make.telemetry()
tr <- make.grid(detector = "multi", nx = 8, ny = 8)

# spatial population
set.seed(123)
pop4 <- sim.popn(tr, D = 5, buffer = 100, seed = 567)

# select 12 telemetered individuals from larger population
pop4C <- subset(pop4, sample.int(nrow(pop4), 12))

# renumber = FALSE (keep original animalID) needed for matching
trCH <- sim.capthist(tr,  popn = pop4, renumber = FALSE, 
    detectfn = "HHN", detectpar = list(lambda0 = 0.1, 
    sigma = 25), seed = 123)
session(trCH) <- 'Trapping'
teCH <- sim.capthist(te, popn = pop4C, renumber = FALSE, 
    detectfn = "HHN", detectpar = list(lambda0 = 1, sigma = 25),
    noccasions = 10, seed = 345)
session(teCH) <- 'Telemetry'

The first step is to combine the capthist objects trCH (trapping data) and teCH (telemetry fixes).

combinedCH <- addTelemetry(trCH, teCH)

Generating plots is straightforward. By default, plot.capthist displays the captures and ignores telemetry fixes. The plot type “telemetry” displays the fixes and distinguishes those of animals that also appear in the (unplotted) capture data of the combined object.

par(mfrow = c(1,2), mar = c(2,2,3,2))
plot(traps(trCH), border = 150, bty = 'o') # base plot
plot(combinedCH, title = 'Trapping', tracks = TRUE, rad = 4, add = TRUE)
plot(traps(trCH), border = 150, bty = 'o') # base plot
plot(combinedCH, title = 'Telemetry', type = 'telemetry', 
     tracks = TRUE, add = TRUE)
Figure G.1: Simulated trapping and telemetry data. The 5-day trapping study (left) yielded 29 recaptures. Telemetry data were obtained on 10 occasions for each of 12 animals (right). Points for animals that were both trapped and telemetered are ringed in black. Colours distinguish individuals.

Next we fit trapping-only and joint trapping-and-telemetry models:

mask <- make.mask(traps(trCH), buffer = 100, type = 'trapbuffer', 
    nx = 32)
args <- list(mask = mask, detectfn = 'HHN', trace = FALSE)
fits <- list.secr.fit(list(trCH, combinedCH), constant = args, 
    names = c('tr','combined'))
collate(fits)[1,,,]
, , D

         estimate SE.estimate    lcl    ucl
tr         5.9057      1.3312 3.8175 9.1363
combined   5.7070      1.2801 3.6967 8.8104

, , lambda0

         estimate SE.estimate      lcl     ucl
tr       0.118276    0.029911 0.072604 0.19268
combined 0.073111    0.015752 0.048157 0.11100

, , sigma

         estimate SE.estimate    lcl    ucl
tr         22.027      2.4031 17.798 27.262
combined   26.498      1.1295 24.375 28.806

Here, telemetry data greatly improves the precision of the estimated scale of movement \sigma, but the effect on estimates of the other two parameters is small.

G.2 Standalone telemetry data

Telemetry data are stored in modified secr capthist objects. A capthist object may comprise telemetry fixes only (‘standalone telemetry’) or telemetry fixes in association with capture–recapture data (composite telemetry and capture–recapture). This section describes standalone telemetry data. A composite capthist is formed by combining a telemetry-only object and a standard capthist object with addTelemetry, as described in Section G.3.

G.2.1 The ‘traps’ object for telemetry data

Telemetry data differ from all other SECR data in that the detection process does not constrain where animals are detected (telemetry provides a spatially unbiased sample of each animal’s activity). That is clearly not the case for area-search and point detectors, which inevitably constrain where animals are detected. Nevertheless, for compatibility with the rest of secr, we associate telemetry data with a notional detector located at a point. The ‘traps’ object for telemetry data comprises the coordinates of this point plus the usual attributes of a ‘traps’ object in secr (detector type, usage, etc.). Remember that the point is only a ‘notional’ detector - it is never visited.

The function make.telemetry generates a suitable object:

te <- make.telemetry()
summary(te)
Object class       traps 
Detector type      telemetry 
Telemetry type     independent 
str(te)
Classes 'traps' and 'data.frame':   1 obs. of  2 variables:
 $ x: num 0
 $ y: num 0
 - attr(*, "detector")= chr "telemetry"
 - attr(*, "telemetrytype")= chr "independent"

The attribute telemetrytype is always ‘independent’ for standalone telemetry data; other possible values for composite data are described later.

G.2.2 Detector type

Every ‘traps’ object has an associated detector type (attribute detector, commonly ‘multi’ or ‘proximity’). This may be a vector with a different value for each occasion. The detector type for telemetry data is ‘telemetry’. In a standalone telemetry capthist, all elements of detector are ‘telemetry’.

G.2.3 But where are the data?

As for any other detector type, the body of a telemetry capthist is a 3-D array whose elements are the number of detections for each combination of animal, occasion and detector. Coordinates are stored separately in the ‘telemetryxy’ attribute. Use one of these functions to reveal the telemetry component of a capthist object CH:

  1. str(CH)
  2. summary(CH)
  3. plot(CH, type = 'telemetry')
  4. telemetryxy(CH)

The attribute ‘telemetryxy’ is a list with one component for each animal. The fixes of each animal are sorted in chronological order.

G.2.4 Data input

Data for a telemetry-only object should be read with function read.telemetry, a simplified version of read.capthist. The input format for telemetry fixes follows the ‘XY’ format for captures, with one line per fix (see secr-datainput.pdf).

The first few lines of a text file containing telemetry data collected on 5 occasions might look like this –

1  10 1  -83.3  -20.04
1  10 2  -57.91  -4.77
1  10 3 -112.96  -7.51
1  10 4  -77.71 -75.79
1  10 5  -85.81 -42.45
1 101 1  143.06 170.48
1 101 2   99.22 145.49
etc.

The first column is a session code, the next an animal identifier (‘10’, ‘101’), the third an occasion number (1..noccasions) and the last two are the x and y coordinates. GPS coordinates should be projected (i.e. not latitude and longitude), and in metres if possible.

A file named ‘telemetrydemo.txt’ may be read with

CHt <- read.telemetry(file = "data/telemetrydemo.txt")
No errors found :-)
head(CHt)
Session =  1 
, , 1

   1 2 3 4 5
4  1 1 1 1 1
9  1 1 1 1 1
10 1 1 1 1 1
11 1 1 1 1 1
12 1 1 1 1 1
14 1 1 1 1 1
telemetryxy(CHt)[['10']]  # coordinates of first animal
        x      y
1  -83.30 -20.04
2  -57.91  -4.77
3 -112.96  -7.51
4  -77.71 -75.79
5  -85.81 -42.45

Input may be from a text file (named in argument ‘file’) or dataframe (argument ‘data’). The body of the resulting capthist object merely tallies the number of detections per animal per session and occasion. The fixes for one session are stored separately in an attribute that is a list of dataframes, one per animal. Use telemetryxy(CHt) to retrieve this list.

The summary of a telemetry-only capthist is quirky:

summary(CHt)
Object class       capthist 
Detector type      telemetry (5) 
Telemetry type     independent 

Counts by occasion 
                   1  2  3  4  5 Total
n                 79 79 79 79 79   395
u                 79  0  0  0  0    79
f                  0  0  0  0 79    79
M(t+1)            79 79 79 79 79    79
losses             0  0  0  0  0     0
detections        79 79 79 79 79   395
detectors visited  0  0  0  0  0     0
detectors used     0  0  0  0  0     0

Empty histories :  79 
79 telemetered animals, 0 detected
5-5 locations per animal, mean =  5, sd = 0 

Individual covariates
       V6      
 Min.   :1.00  
 1st Qu.:1.00  
 Median :2.00  
 Mean   :1.52  
 3rd Qu.:2.00  
 Max.   :2.00  

Even though each fix is counted as a ‘detection’ in the body of the final capthist object, none of the telemetered animals is considered to have been ‘detected’ in a conventional SECR sense. The telemetry-only capthist object includes a trivial traps object with a single point. The telemetry type of the traps for a telemetry-only capthist defaults to ‘independent’.

G.3 Combining telemetry and capture–recapture

For the purpose of density estimation and modelling, standalone telemetry data are added to an existing spatial capture–recapture (capthist) data object with the function addTelemetry. The relationship between the telemetry and capture–recapture samples is determined by the type argument (default ‘concurrent’). We first explain the possible telemetry types.

G.3.1 Types of telemetry data

secr distinguishes three types of telemetry data – independent, dependent and concurrent – that differ in how they relate to other SECR samples (capture–recapture data). Each type corresponds to a particular probability model.

Figure G.2: Schematic relationship of capture–recapture data to three types of telemetry data. Vertical overlap indicates individuals that appear in both datasets.
  1. Independent telemetry

Independent telemetry data have no particular relationship to spatial capture–recapture data except that they may be modelled using a shared value of the spatial-scale parameter \sigma, and possibly other spatial parameters. Telemetered animals do not have detection histories.

  1. Dependent telemetry

Dependent telemetry data relate to a sample of animals detected during the capture–recapture study: an animal must be caught in that study to become telemetered, and no animal is telemetered and not otherwise detected (i.e. no detection history is all-zero).

  1. Concurrent telemetry

Concurrent telemetry data are obtained for a sample of animals from the same regional population as the capture–recapture study. Telemetered animals appear stochastically in the capture–recapture sample with probability related to their location. Detection histories of some animals may be all-zero, and these are modelled. Whether the capture–recapture phase precedes or follows telemetry is not material.

G.3.2 What exactly does addTelemetry do?

The addTelemetry function forms a composite capthist object. Its usage follows -

addTelemetry (detectionCH, telemetryCH, type = c("concurrent", "dependent", 
    "independent"), collapsetelemetry = TRUE, verify = TRUE) 

Capture–recapture data in the argument ‘detectionCH’ form the basis for addTelemetry. The base capthist is modified in these ways –

  • For all telemetry types addTelemetry extends the capture–recapture ‘traps’ object by adding a single (notional) detector location (duplicating the first).
  • By default, the ‘detector’ attribute is extended by a single sampling occasion with type ‘telemetry’; all telemetry data are associated with this occasion, regardless of how many occasions there were in the telemetry input. If collapsetelemetry = FALSE distinct telemetry occasions are retained.
  • The ‘usage’ attribute is set to zero for the notional telemetry detector on capture occasions and for capture detectors on telemetry occasions. Other usage data from ‘detectionCH’ is retained.
  • All-zero detection histories are generated for the ‘concurrent’ data type.
  • The coordinates of telemetry fixes are transferred from telemetryCH as the attribute ‘telemetryxy’ of the output.
  • If the data are independent then the labels of telemetered animals are prefixed by ‘T’ to reduce the chance of identity conflicts with animals in ‘detectionCH’.
  • By default, addtelemetry calls verify.capthist to check its output.

G.3.3 Composite data, different sessions

We use addTelemetry to combine telemetry data and capture–recapture data from the same session, or possibly for each of several sessions when the detectionCH and telemetryCH are parallel (equal-length) multi-session objects. It is also feasible to concatenate telemetry and capture–recapture data as separate sessions of a multi-session object with MS.capthist. The effect is similar to a single-session composite capthist with telemetrytype ‘independent’, because secr treats sessions as independent (i.e. individual histories do not span session boundaries). See the next section for an example.

G.4 Model fitting

G.4.1 Standalone telemetry data

We can estimate \sigma for a half-normal circular home-range model directly:

RPSV (CHt, CC = TRUE)
[1] 24.868

Note the CC argument (named for Calhoun & Casby (1958)) that is required to scale the result correctly.

More laboriously:

fit0 <- secr.fit(CHt, buffer = 300, detectfn = 'HHN', 
                 trace = FALSE)
predict(fit0)
      link estimate SE.estimate    lcl    ucl
sigma  log   24.867     0.69957 23.533 26.277

The detection function (argument detectfn) must be either hazard half-normal (14, ‘HHN’) or hazard exponential (16, ‘HEX’)1. The default detection function for a dataset with any telemetry component is ‘HHN’. For telemetry-only data the likelihood is conditional on the number of observations, so the argument CL is set internally to TRUE. A large buffer value here brings \hat \sigma from secr.fit closer to \hat \sigma from RPSV. See below for more on the buffer argument.

See Technical notes for potential numerical problems.

G.4.2 Composite telemetry and capture–recapture data

Fitting a model to composite data should raise no further problems: secr.fit receives all the information it requires in the composite capthist input. The likelihood is a straightforward extension of the usual SECR likelihood, with some subtle differences in the case of dependent or concurrent telemetry.

The use of detection functions expressed in terms of the hazard provides a more natural link between the model for the activity distribution and the model for detection probability. When a hazard function is used secr.fit automatically flips the default model for the first detection parameter from ‘g0 ~ 1’ to ‘lambda0 ~ 1’.

Our introductory example fitted a model to single-session composite data. We can compare the results when the telemetry and trapping data are in separate sessions:

msCH <- MS.capthist(trCH, teCH)
fit.ms <- secr.fit(msCH, mask=mask, detectfn = 'HHN', 
                   trace = FALSE)
predict(fit.ms)
$`session = trCH`
        link estimate SE.estimate       lcl     ucl
D        log  5.68802    1.251718  3.714104  8.7110
lambda0  log  0.10628    0.021189  0.072182  0.1565
sigma    log 23.63780    1.043956 21.678653 25.7740

$`session = teCH`
      link estimate SE.estimate    lcl    ucl
sigma  log   23.638       1.044 21.679 25.774

Note: If the order of teCH and trCH had been reversed in msCH we would need to use details=list(autoini=2) to base parameter starting values on the trapping data, or provide start values manually.

G.4.3 Habitat mask for telemetry data

The centres of both detected and telemetry-only animals are assumed to lie on the habitat mask. Ensure the mask is large enough to encompass telemetry-only animals. A conservative approach is to buffer around the individual telemetry centroids. Using teCH from before:

centroids <- data.frame(t(sapply(telemetryxy(teCH), 
    apply, 2, mean)))
mask1 <- make.mask(centroids, buffer = 100, type = 'trapbuffer')

For composite telemetry and capture–recapture, buffering should include the detector sites:

tmpxy <- rbind(centroids, data.frame(traps(trCH))) 
mask2 <- make.mask(tmpxy, buffer = 100, type = 'trapbuffer')
par(mfrow = c(1,2))
plot(mask1)
plot(teCH, add = TRUE, title = 'Telemetry only')
plot(mask2)
plot(traps(trCH), add = TRUE)
plot(teCH, add = TRUE, title = 'Telemetry and detector sites')
Figure G.3: Habitat masks prepared by buffering around telemetry sites (left) or both telemetry and detector sites (right).

The mask generated automatically by secr.fit buffers around both detector sites and telemetry fixes, as shown here. The ‘buffer’ argument in make.mask can be problematic when used with a standalone telemetry traps object because the notional detector location is an arbitrary point - it is better to use the centroid coordinates as input.

G.5 Simulation

Simulation of joint capture–recapture and telemetry data is a 2-step operation in secr, with the steps depending on the type of telemetry sampling. Here is an example of each type.

We choose to fix the number of observations per animal at 25 using the exactN argument of sim.capthist. The same effect can be achieved by increasing the number of occasions to 25 and setting exactN = 1.

G.5.1 Independent telemetry

For independent data there is no specified connection between the populations sampled, so we separately generate telemetry and capture–recapture datasets and stick them together.

# detectors
te <- make.telemetry()
tr <- make.grid(nx = 8, ny = 8, detector = "proximity")
pop1 <- sim.popn(tr, D = 10, buffer = 200)
pop2 <- sim.popn(core = tr, buffer = 200, Nbuffer = 20, 
                 Ndist = 'fixed')
trCH <- sim.capthist(tr,  popn = pop1, detectfn = "HHN", 
    detectpar = list(lambda0 = 0.1, sigma = 25))
teCH <- sim.capthist(te,  popn = pop2, detectfn = "HHN", 
    detectpar = list(sigma = 25), noccasions = 1, exactN = 25)
CHI <- addTelemetry(trCH, teCH, type = 'independent')
No errors found :-)
session(CHI) <- 'Independent'
summary(CHI)
Object class       capthist 
Detector type      proximity (5), telemetry 
Telemetry type     independent 
Detector number    64 
Average spacing    20 m 
x-range            0 140 m 
y-range            0 140 m 

Usage range by occasion
    1 2 3 4 5 6
min 0 0 0 0 0 0
max 1 1 1 1 1 1

Counts by occasion 
                   1  2  3  4  5   6 Total
n                 24 16 19 22 17  20   118
u                 24  9  7  5  1  20    66
f                 35 14 13  4  0   0    66
M(t+1)            24 33 40 45 46  66    66
losses             0  0  0  0  0   0     0
detections        29 19 30 26 19 500   623
detectors visited 23 16 23 23 18   0   103
detectors used    64 64 64 64 64   0   320

Empty histories :  20 
20 telemetered animals, 0 detected
25-25 locations per animal, mean =  25, sd = 0 

Individual covariates
 sex   
 F:34  
 M:32  

G.5.2 Dependent telemetry

For dependent data the telemetry sample is drawn from animals caught during the capture–recapture phase. This example uses the previously constructed ‘traps’ objects (tr and te). The original numbering of animals must be conserved (renumber = FALSE).

pop3 <- sim.popn(tr, D = 10, buffer = 200)
trCH <- sim.capthist(tr,  popn = pop3, detectfn = "HHN", 
    detectpar = list(lambda0 = 0.1, sigma = 25), renumber = 
    FALSE, savepopn = TRUE)

## select trapped animals from saved popn
pop3D <- subset(attr(trCH, 'popn'), rownames(trCH))
## sample 12 detected animals for telemetry
pop3Dt <- subset(pop3D, sample.int(nrow(pop3D), 12))  
## simulate telemetry
teCHD <- sim.capthist(te, popn = pop3Dt, renumber = FALSE, 
    detectfn = "HHN", detectpar = list(sigma = 25), 
    noccasions = 1, exactN = 25)
CHD <- addTelemetry(trCH, teCHD, type = 'dependent')
No errors found :-)
session(CHD) <- 'Dependent'
summary(CHD)
Object class       capthist 
Detector type      proximity (5), telemetry 
Telemetry type     dependent 
Detector number    64 
Average spacing    20 m 
x-range            0 140 m 
y-range            0 140 m 

Usage range by occasion
    1 2 3 4 5 6
min 0 0 0 0 0 0
max 1 1 1 1 1 1

Counts by occasion 
                   1  2  3  4  5   6 Total
n                 20 22 22 10 26  12   112
u                 20 12  8  1  4   0    45
f                 12 14  9  5  5   0    45
M(t+1)            20 32 40 41 45  45    45
losses             0  0  0  0  0   0     0
detections        33 31 29 11 36 300   440
detectors visited 25 25 26 10 26   0   112
detectors used    64 64 64 64 64   0   320
12 telemetered animals, 12 detected
25-25 locations per animal, mean =  25, sd = 0 

Individual covariates
 sex   
 F:20  
 M:25  

G.5.3 Concurrent telemetry

For concurrent telemetry a sample of animals is taken from the regional population without reference to whether or not each animal was detected in the capture–recapture phase. The original numbering of animals must be conserved (renumber = FALSE), as for dependent telemetry.

set.seed(567) 
pop4 <- sim.popn(tr, D = 10, buffer = 200)
# select 15 individuals at random from larger population
pop4C <- subset(pop4, sample.int(nrow(pop4), 15))
# original animalID (renumber = FALSE) are needed for matching
trCH <- sim.capthist(tr,  popn = pop4, renumber = FALSE, 
    detectfn = "HHN", detectpar = list(lambda0 = 0.1, 
    sigma = 25))
teCHC <- sim.capthist(te, popn = pop4C, renumber = FALSE, 
    detectfn = "HHN", detectpar = list(sigma = 25), noccasions =
    1, exactN = 25)
CHC <- addTelemetry(trCH, teCHC, type = 'concurrent')
No errors found :-)
session(CHC) <- 'Concurrent'
summary(CHC)
Object class       capthist 
Detector type      proximity (5), telemetry 
Telemetry type     concurrent 
Detector number    64 
Average spacing    20 m 
x-range            0 140 m 
y-range            0 140 m 

Usage range by occasion
    1 2 3 4 5 6
min 0 0 0 0 0 0
max 1 1 1 1 1 1

Counts by occasion 
                   1  2  3  4  5   6 Total
n                 16 17 21 17 16  15   102
u                 16 12  7  5  3  11    54
f                 28 11  9  5  1   0    54
M(t+1)            16 28 35 40 43  54    54
losses             0  0  0  0  0   0     0
detections        25 26 27 26 24 375   503
detectors visited 23 20 22 22 19   0   106
detectors used    64 64 64 64 64   0   320

Empty histories :  11 
15 telemetered animals, 4 detected
25-25 locations per animal, mean =  25, sd = 0 

Individual covariates
 sex   
 F:24  
 M:30  

G.5.4 Plotting to compare simulated data

par(mfrow = c(1,3), mar = c(2,2,4,2), xpd = TRUE)
plot(traps(CHI), border = 200, gridlines = FALSE, bty = 'o')
plot(CHI, type = 'telemetry', tracks = TRUE, add = TRUE)

plot(traps(CHD), border = 200, gridlines = FALSE, bty = 'o')
plot(CHD, type = 'telemetry', tracks = TRUE, add = TRUE)

plot(traps(CHC), border = 200, gridlines = FALSE, bty = 'o')
plot(CHC, type = 'telemetry', tracks = TRUE, add = TRUE)
Figure G.4: Simulated telemetry data in relation to a capture–recapture grid (red crosses). Independently telemetered individuals are not recognised if they are caught on the grid. Dependent telemetry is restricted to animals caught on the grid. Individuals telemetered concurrently may or may not be caught, but are recognised when they are.

G.6 Technical notes

G.6.1 Assumption of common \sigma

Joint analysis of telemetry and capture–recapture data usually relies on the assumption that the same value of the parameter \sigma applies in both sampling processes. This does not hold when

  • telemetry fixes have large measurement error that inflates \sigma, or

  • the tendency of an animal to interact with a detector after encountering it varies systematically with distance from the home-range centre, or

  • activity is not stationary and the telemetry and capture–recapture data relate to different time intervals.

The assumption may be avoided altogether by modelling distinct values of \sigma on trapping and telemetry occasions. This is readily achieved using the automatic predictor tt in the formula for sigma, as in secr.fit(CH, detectfn = 'HHN', model = sigma~tt, ...). The model then has one level of sigma for non-telemetry occasions (tt = ‘nontelemetry’) and another for telemetry occasions (tt = ‘telemetry’). However, this sacrifices much of the benefit from a joint analysis when the telemetry data are dependent or concurrent, and all benefit for independent telemetry data.

G.6.2 Numerical problems

Fitting joint telemetry and SECR models can be difficult - the usual computations in secr may fail to return a likelihood. The problem is often due to a near-zero value in a component of the telemetry likelihood. This occurs particularly in large datasets. The problem may be fixed by scaling the offending values by an arbitrary large number given in the details argument ‘telemetryscale’. The required magnitude for ‘telemetryscale’ may be found by experimentation (try 1e3, 1e6, 1e9, 1e12 etc.). This ad hoc solution must be applied consistently if models are to be compared by AIC.

te <- make.telemetry()
teCH2 <- sim.capthist(te, popn = list(D = 2, buffer = 200), 
    detectfn = "HHN", exactN = 100, detectpar = list(sigma = 25),
    noccasions = 1)
mask <- make.mask(traps(teCH2), buffer = 300, type = 
    'trapbuffer')
# fails
fit1 <- secr.fit(teCH2, mask = mask, detectfn = 'HHN', CL = TRUE, 
    trace = FALSE, details = list(telemetryscale = 1)) 
predict(fit1)
      link estimate SE.estimate lcl ucl
sigma  log       NA          NA  NA  NA
# succeeds
fit1000 <- secr.fit(teCH2, mask = mask, detectfn = 'HHN', 
    CL = TRUE, trace = FALSE, details = list(telemetryscale = 
    1e3)) 
predict(fit1000)
      link estimate SE.estimate    lcl    ucl
sigma  log   25.044     0.20636 24.643 25.452

Numerical problems may also be caused by inappropriate starting values, poor model specification, or an unknown bug. It may help to use the longer-tailed detection function ‘HEX’ instead of ‘HHN’.

G.6.3 Learned response

Learned responses (b, bk) are not expected in telemetry data. However, they may make sense for the ‘SECR’ occasions of a composite dataset (combined stationary detectors and telemetry). There is no way to avoid a global learned response (b) from propagating to the telemetry occasions (i.e. modelling different telemetry sigmas for animals detected or not detected in the pre-telemetry phase). A site-specific learned response, however, cannot propagate to the telemetry phase if there is a single telemetry ‘occasion’ because (i) no animal is detected at the notional telemetry detector in the pre-telemetry phase, and (ii) there is no opportunity for learning within the telemetry phase if all detections are on one occasion.

G.7 Limitations

Some important functions of secr have yet to be updated to work with telemetry data. These are listed in Section G.8. Other limitations are described here.

G.7.2 Incompatible with mark–resight

Telemetry data may not be combined with mark-resight except possibly in distinct sessions (this has not been tested).

G.7.3 Incompatible with hybrid heterogeneity model

The secr.fit code for hybrid heterogeneity models (hcov) has yet to be updated.

G.7.4 Non-Euclidean distance

Non-Euclidean distance methods cannot be used with telemetry data at present (a very large distance matrix would be required).

G.8 Telemetry-related functions.

Table G.1: Functions specifically for telemetry data.
Function Purpose
addTelemetry combine capture-recapture and telemetry data in new capthist
make.telemetry build a traps object for standalone telemetry data
read.telemetry input telemetry fixes from text file or dataframe
telemetered determine which animals in a capthist object have telemetry data
telemetrytype extract or replace the ‘telemetrytype’ attribute of a traps object
telemetryxy extract or replace telemetry coordinates from capthist
xy2CH make a standalone telemetry capthist from a composite capthist
Table G.2: Telemetry-ready general functions. Functions marked with an asterisk (*) use the telemetry coordinates if the capthist is telemetry-only, otherwise the detection sites.
Function Purpose
derived Horvitz-Thompson-like density estimate
join combine sessions of multi-session capthist object
make.capthist build capthist object
moves sequential movements*
MS.capthist form multi-session capthist from separate sessions
plot.capthist plotting (type = ‘telemetry’)
rbind.capthist concatenate rows of capthist
RPSV, MMDM, ARL, dbar indices of home-range size*
secr.fit model fitting
sim.capthist generate capthist data
subset.capthist select subset of animals, occasions or detectors
summary.capthist summary
verify.capthist perform integrity checks
verify.traps perform integrity checks
Table G.3: General functions not ready for telemetry.
Function Purpose
reduce.capthist change detector type or collapse occasions
sim.secr parametric bootstrap fitted model
simulate simulate from fitted model
secr.test another parametric boostrap
fxTotal
fxiContour

  1. This constraint arises from the need internally to normalise the probability density function for each telemetry fix. The normalising constant for these functions is 1/(2\pi \sigma^2), whereas for most other possible values of detectfn it is hard to compute or the function does not correspond to a probability density.↩︎