ct_select_model: Model selection for Distance Sampling detection functions

View source: R/CTDS.R

ct_select_modelR Documentation

Model selection for Distance Sampling detection functions

Description

Implements a two-step model selection procedure for distance sampling detection functions following the approach of Howe et al (2019).

Usage

ct_select_model(models, chat = NULL, k = 2)

Arguments

models

A list of fitted detection function models (objects returned by Distance::ds() or ct_fit_ds()).

chat

Optional numeric value of overdispersion (\hat{c}). If not provided, it is estimated from the most parameterised model in each key function set.

k

Numeric. The penalty term used in QAIC (default is 2).

Details

Step 1: Within each key function family (e.g., half-normal, hazard-rate), models are compared using the quasi-Akaike Information Criterion (QAIC). Overdispersion (\hat{c}) is estimated if not provided. The best model per key function family is identified as the one with the lowest QAIC.

Step 2: The best models from each key function family are compared using overall goodness-of-fit statistics based on chi-squared divided by degrees of freedom (\chi^2 / df). The model with the lowest \chi^2 / df is selected as the final detection function model.

Value

A named list with the following elements:

  • QAIC: A tibble summarizing QAIC results for each model within key function families.

  • ⁠Best QAIC models⁠: A subset of models, one per key function, that minimize QAIC.

  • Chiq2: A tibble comparing the best models by chi-squared goodness-of-fit criteria.

  • ⁠Final model⁠: The selected detection function model with the lowest chi-squared/df.

References

Howe, E. J., Buckland, S. T., Després-Einspenner, M., & Kühl, H. S. (2019). Model selection with overdispersed distance sampling data. Methods in Ecology and Evolution, 10(1), 38-47. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.1111/2041-210X.13082")}

See Also

ct_QAIC(), ct_chi2_select()

Examples


library(Distance)
library(dplyr)

data("duiker")
duiker_data <- duikers$DaytimeDistances %>%
  dplyr::slice_sample(prop = .3) # sample 30% of rows
truncation <- list(left = 2, right = 15) # Keep only distance between 2-15 m

# fit hazard-rate key models
w3_hr0 <- ds(duiker_data, transect = "point", key = "hr", adjustment = NULL,
             truncation = truncation)
w3_hr1 <- ds(duiker_data, transect = "point", key = "hr", adjustment = "cos",
             order = 2, truncation = truncation)
w3_hr2 <- ds(duiker_data, transect = "point", key = "hr", adjustment = "cos",
             order = c(2, 4), truncation = truncation)
# fit half-normal key models
w3_hn0 <- ds(duiker_data, transect = "point", key = "hn", adjustment = NULL,
             truncation = truncation)
w3_hn1 <- ds(duiker_data, transect = "point", key = "hn", adjustment = "cos",
             order = 2, truncation = truncation)
w3_hn2 <- ds(duiker_data, transect = "point", key = "hn", adjustment = "cos",
             order = c(2, 4), truncation = truncation)
# fit uniform key models
w3_u0 <- ds(duiker_data, transect = "point", key = "unif", adjustment = NULL,
            truncation = truncation)
w3_u1 <- ds(duiker_data, transect = "point", key = "unif", adjustment = "cos",
            order = 2, truncation = truncation)
w3_u2 <- ds(duiker_data, transect = "point", key = "unif", adjustment = "cos",
            order = c(2, 4), truncation = truncation)

# Create model list
model_list <- list(w3_hn0, w3_hn1, w3_hn2,
                   w3_hr0, w3_hr1, w3_hr2,
                   w3_u0, w3_u1, w3_u2)

# Compute model QAICs
ct_QAIC(list(w3_hr0, w3_hr1, w3_hr2)) # All key functions must be the same
ct_QAIC(list(w3_hn0, w3_hn1, w3_hn2)) # All key functions must be the same

# Compute Chi-squared Goodness-of-fit
ct_chi2_select(list(w3_hn0, w3_hr0, w3_u0)) # All key functions must be different
ct_chi2_select(list(w3_hn2, w3_hr1, w3_u0)) # All key functions must be different

# Two-step model selection
ct_select_model(model_list)



ct documentation built on Oct. 22, 2026, 1:07 a.m.