Fitting statistical models to the decline on the number of mature individuals across time "can be used to extrapolate population trends, so that a reduction of three generations can be calculated" (IUCN 2019). This function provide a comparison of five different models and returns the predictions of the model with best fit to data.

pop.decline.fit(
  x = NULL,
  models = "all",
  project.years = NULL,
  plot.fit = TRUE,
  max.count = 50,
  ...
)

Arguments

x

a data frame containing in the first column a vector of (estimated) population size and in the second column a vector of years for which the population sizes is available

models

a vector containing the names of the statistical models to be fitted to species population data

project.years

a vector containing the years for which the number of mature individuals should be predicted using the best candidate statistical model

plot.fit

logical. Should the fit of the best model be plotted against the population data?

max.count

numerical. Maximum number of attempts to fit piece-wise models. Default to 50.

...

other parameters to be passed as arguments for function ICtab.mod.select

Details

The names of the columns of the data frame x do not matter, as long as population sizes are in the first column and years in the second.

By default, the function compares the fit of six statistical models to the population trends, namely: linear, quadratic, exponential, logistic, generalized logistic and piece-wise. But, as stated in IUCN (2019), the model used to do the predictions makes an important difference. So, model fit to data should not be the only or most important criteria to choose among models. Users should preferably choose one or two of the models based on the best available information of types of threat (i.e. patterns of exploitation or habitat loss), life history and ecology of the taxon being evaluated or any other processes that may contribute to population decline. See IUCN (2019) for more details on the assumptions of each model.

The linear and exponential patterns of decline are fully described in IUCN (2019) and are easy to be described statistically through a model (see Figure 4.2, pg. 33 of IUCN 2019). But IUCN (2019) also recognizes the existence of more "complex patterns of decline". To describe more complex patterns, pop.decline.fit provides fits to logistic and piece-wise patterns of decline. Despite the options of models provided by pop.decline.fit, depending on the numbers of observations or the patterns of decline, many or none of the models may provide a good fit to data. This reinforces the role of the user in choosing the more appropriate pattern for the area or taxon considered.

For simplicity, the population size data provided is transformed into proportions using the maximum population estimate provided. Therefore, models are fitted to proportional data, but the projections are returned in proportions and in the original scale. As suggested in IUCN (2019), no model fit is performed if only two estimates of population size are provided.

Some more technical notes on model fitting and selection. Here, we use a quadratic model as an equivalent to the accelerating model described in IUCN (2019), but note that the quadratic model can generate non-realistic projections depending on the population data or on the years chosen for the projection (see example). Fitting piece-wise models can be unstable (model fitting is quite sensitive to the start parameters) and may take a while to converge; so, it should preferably be used when many years of population size data are available. For simplicity, only piece-wise models with up to 3 breaks and linear functions between breaks are provided. For time intervals > 80, the best model among the candidate models is chosen based on Akaike Information Criterion, or AIC; the corrected AIC or the AICc (Anderson and Burnham, 2004) is used for time intervals < 80.

References

D. Anderson and K. Burnham (2004). Model selection and multi-model inference. Second edition. Springer-Verlag, New York.

IUCN 2019. Guidelines for Using the IUCN Red List Categories and Criteria. Version 14. Standards and Petitions Committee. Downloadable from: http://www.iucnredlist.org/documents/RedListGuidelines.pdf.

Author

Renato A. Ferreira de Lima & Gilles Dauby

Examples

## Creating vectors with the population data and time intervals 
#(adapted from the IUCN 2019 workbook for Criterion A, available 
#at: https://www.iucnredlist.org/resources/criterion-a)
pop = c(10000, 9100, 8200, 7500, 7000)
yrs = c(1970, 1975, 1980, 1985, 1990)
pop.data <- cbind.data.frame(pop.size = pop, years = yrs)


## Fitting data with different models and settings
# All models, without and with the plot of the model fit to data
pop.decline.fit(pop.data, plot.fit = FALSE)
#> Warning: essentially perfect fit: summary may be unreliable
#> Warning: essentially perfect fit: summary may be unreliable
#> breakpoint estimate(s): 15.68258 8.715143 
#> $best.model
#> Call: segmented.lm(obj = md, seg.Z = ~ys, psi = quebras[1], control = segmented::seg.control(display = FALSE, 
#>     it.max = 100, n.boot = 50))
#> 
#> Coefficients of the linear terms:
#> (Intercept)           ys        U1.ys  
#>       1.000       -0.018        0.008  
#> 
#> Estimated Break-Point(s):
#> psi1.ys  
#>    12.5  
#> 
#> $model.selection.result
#>                   dAICc df
#> linear           274.29  3
#> quadratic        270.23  4
#> exponential      268.49  3
#> logistic         284.44  3
#> general_logistic 284.87  4
#> piecewise          0.00  5
#> 
#> $predictions
#>   pop.size years   ps ys est.prop predicted
#> 1    10000  1970 1.00  0     1.00     10000
#> 2     9100  1975 0.91  5     0.91      9100
#> 3     8200  1980 0.82 10     0.82      8200
#> 4     7500  1985 0.75 15     0.75      7500
#> 5     7000  1990 0.70 20     0.70      7000
#> 
pop.decline.fit(pop.data)
#> Warning: essentially perfect fit: summary may be unreliable
#> Warning: essentially perfect fit: summary may be unreliable
#> breakpoint estimate(s): 15.68258 8.715143 
#> Warning: essentially perfect fit: summary may be unreliable

#> $best.model
#> Call: segmented.lm(obj = md, seg.Z = ~ys, psi = quebras[1], control = segmented::seg.control(display = FALSE, 
#>     it.max = 100, n.boot = 50))
#> 
#> Coefficients of the linear terms:
#> (Intercept)           ys        U1.ys  
#>       1.000       -0.018        0.008  
#> 
#> Estimated Break-Point(s):
#> psi1.ys  
#>    12.5  
#> 
#> $model.selection.result
#>                   dAICc df
#> linear           274.29  3
#> quadratic        270.23  4
#> exponential      268.49  3
#> logistic         284.44  3
#> general_logistic 284.87  4
#> piecewise          0.00  5
#> 
#> $predictions
#>   pop.size years   ps ys est.prop predicted
#> 1    10000  1970 1.00  0     1.00     10000
#> 2     9100  1975 0.91  5     0.91      9100
#> 3     8200  1980 0.82 10     0.82      8200
#> 4     7500  1985 0.75 15     0.75      7500
#> 5     7000  1990 0.70 20     0.70      7000
#> 

# Different model combinations
pop.decline.fit(pop.data, models = c("exponential","quadratic"))

#> $best.model
#> Nonlinear regression model
#>   model: ps ~ a * exp(b * ys)
#>    data: stats::na.omit(DATA)
#>        a        b 
#>  0.99601 -0.01836 
#>  residual sum-of-squares: 0.0002386
#> 
#> Number of iterations to convergence: 5 
#> Achieved convergence tolerance: 1.724e-07
#> 
#> $model.selection.result
#>             dAICc df
#> exponential  0.00  3
#> quadratic    1.74  4
#> 
#> $predictions
#>   pop.size years   ps ys  est.prop predicted
#> 1    10000  1970 1.00  0 0.9960084    9960.1
#> 2     9100  1975 0.91  5 0.9086518    9086.5
#> 3     8200  1980 0.82 10 0.8289569    8289.6
#> 4     7500  1985 0.75 15 0.7562518    7562.5
#> 5     7000  1990 0.70 20 0.6899234    6899.2
#> 
pop.decline.fit(pop.data, models = c("quadratic", "exponential"))
#> $best.model
#> Nonlinear regression model
#>   model: ps ~ a * exp(b * ys)
#>    data: stats::na.omit(DATA)
#>        a        b 
#>  0.99601 -0.01836 
#>  residual sum-of-squares: 0.0002386
#> 
#> Number of iterations to convergence: 5 
#> Achieved convergence tolerance: 1.724e-07
#> 
#> $model.selection.result
#>             dAICc df
#> quadratic    1.74  4
#> exponential  0.00  3
#> 
#> $predictions
#>   pop.size years   ps ys  est.prop predicted
#> 1    10000  1970 1.00  0 0.9960084    9960.1
#> 2     9100  1975 0.91  5 0.9086518    9086.5
#> 3     8200  1980 0.82 10 0.8289569    8289.6
#> 4     7500  1985 0.75 15 0.7562518    7562.5
#> 5     7000  1990 0.70 20 0.6899234    6899.2
#> 

# Projecting/interpolating population size estimates
pop.decline.fit(pop.data, models = "exponential", project.years = c(1960, 2005))

#> $best.model
#> Nonlinear regression model
#>   model: ps ~ a * exp(b * ys)
#>    data: stats::na.omit(DATA)
#>        a        b 
#>  1.19672 -0.01836 
#>  residual sum-of-squares: 0.0002386
#> 
#> Number of iterations to convergence: 6 
#> Achieved convergence tolerance: 6.131e-07
#> 
#> $predictions
#>   pop.size years   ps ys  est.prop predicted
#> 1       NA  1960   NA  0 1.1967243   11967.2
#> 2    10000  1970 1.00 10 0.9960084    9960.1
#> 3     9100  1975 0.91 15 0.9086518    9086.5
#> 4     8200  1980 0.82 20 0.8289569    8289.6
#> 5     7500  1985 0.75 25 0.7562518    7562.5
#> 6     7000  1990 0.70 30 0.6899234    6899.2
#> 7       NA  2005   NA 45 0.5238467    5238.5
#>