# MLZ: Mean Length-based Z Estimators

#### Quang C. Huynh

#### 2017-03-03

## 1. Introduction

MLZ is a package that facilitates data preparation and estimation of mortality with statistical diagnostics using the mean length-based mortality estimator and several extensions.

## 2. Outline of package

In this section, a step-by-step guide to using the mean length (ML) estimator of Gedamke and Hoenig (2006) is provided. This guide outlines the main features of the package.

Work in the package can be divided into three general steps, with supporting diagnostic tools:

1. Data preparation
2. Mortality estimation
3. Model selection procedure

### 2.1 Data preparation

MLZ uses the S4 class system. Data and life history parameters, i.e., von Bertalanffy Linf and K, are stored in a single object of class `MLZ_data` with pre-defined slots. Slots in the S4 class can be accessed with `@`.

    library(MLZ)
    class?MLZ_data
    data(Goosefish)
    Goosefish@vbLinf

Length data are imported as either a data frame of individual records or as a matrix (years x length bins):

    data(SilkSnapper)
    new.dataset <- new("MLZ_data", Year = 1983:2013, Len_df = SilkSnapper, length.units = "mm")

The `bin_length` function can be used to convert individual lengths into a length frequency matrix with specified length bins.

    bin_length(SilkSnapper)

The `plot` function can be used to visualize the data to aid in the selection of \(L_c\).

    plot(new.dataset, type = "comp")

    ## Warning: The dot-dot notation (`..ncount..`) was deprecated in ggplot2 3.4.0.
    ## ℹ Please use `after_stat(ncount)` instead.
    ## ℹ The deprecated feature was likely used in the MLZ package.
    ##   Please report the issue to the authors.
    ## This warning is displayed once every 8 hours.
    ## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
    ## generated.

Once Lc is identified, `calc_ML()` can be used to mean lengths from records larger than Lc.

    new.dataset@Lc <- 310
    new.dataset <- calc_ML(new.dataset)

    new.dataset@MeanLength
    new.dataset@ss

A `summary` method function is also available for class `MLZ_data`.

    summary(new.dataset)

### 2.2 Mortality estimation

Once mean lengths > Lc are calculated, mortality can be estimated using the `ML` function:

    est <- ML(Goosefish, ncp = 2)

The function returns an object of class `MLZ_model` which includes predicted values of the data, parameter estimates with correlation matrix and gradient vector. `summary` and `plot` method functions are also available for `MLZ_model` objects.

    plot(est)

    summary(est)

    ## $Stock
    ## [1] "Goosefish: Northern Management Region"
    ##
    ## $Model
    ## [1] "ML"
    ##
    ## $Estimates
    ##          Estimate Std. Error
    ## Z[1]        0.141      0.005
    ## Z[2]        0.310      0.037
    ## Z[3]        0.551      0.046
    ## yearZ[1] 1978.316      0.832
    ## yearZ[2] 1987.767      1.222
    ## sigma      24.342      0.000

With `i = 1, 2, ... I` change points, `Z[i]` is the estimated mortality rate in successive time periods. `yearZ[i]` indicates the time when mortality changed from `Z[i]` to `Z[i+1]`.

The analysis can be repeated by considering alternative numbers of change points (years in which mortality changes, estimated in continuous time).

    model1 <- ML(Goosefish, ncp = 0)
    model2 <- ML(Goosefish, ncp = 1)
    model3 <- ML(Goosefish, ncp = 2)

### 2.3 Model selection

Model runs with different change points can be compared using AIC. The `compare_models` function facilitates this feature and produces a plot of the predicted data.

    compare_models(model1, model2, model3)

    ##                   negLL npar      AIC delta.AIC
    ## 2-change point 111.1122    6 234.2244  0.000000
    ## 1-change point 116.5551    4 241.1103  6.885858
    ## 0-change point 157.9197    2 319.8394 85.615006

`compare_models` can also be used with `MLCR` and `MLmulti` (See section 4).

## 3. Diagnostic tools

### 3.1 Data preparation

To explore changes in the length distribution over time, the `modal_length` function plots the modal length from each annual length distribution. The modal length can change for several reasons, including changes in mortality, selectivity, and recruitment.

    modal_length(new.dataset, breaks = seq(80, 830, 10))

### 3.2 Mortality estimation

#### 3.2.1 Grid search & likelihood profile of change points

In order to avoid local minima in the negative log-likelihood function, the estimation functions by default use a grid search over the change points in order to find starting values close to the maximum likelihood estimates.

The grid search function can also be called seperately using `profile_ML`. This function also serves as a likelihood profile over the change points. Figures are provided for 1- and 2-change point models.

    profile_ML(Goosefish, ncp = 1)

    profile_ML(Goosefish, ncp = 2)

`profile_MLCR`, and `profile_MLmulti` are also available for the respective models (Section 4).

#### 3.2.2 Sensitivity to Lc

The `sensitivity_Lc` function for the ML estimator plots estimates of Z and change points with different values of Lc.

#### 3.2.3 Additional diagnostics

Additional diagnostics, including sensitivity to life hitory (growth, natural mortality), and bootstrapping routines are in development.

## 4. Outline of other estimators

### 4.1 MLCR (Mean Length with Catch Rate)

To use the MLCR estimator (Huynh et al. 2017b), a time series of CPUE is needed:

    data(MuttonSnapper)
    MuttonSnapper@CPUE

If the CPUE is biomass-based, e.g., pounds of fish per gear haul, then length-weight exponent `b` is also needed.

    MuttonSnapper@lwb <- 3.05

The corresponding estimation function and grid search function are `MLCR` and `profile_MLCR`, respectively:

    MLCR(MuttonSnapper, ncp = 2, "WPUE")

### 4.2 MLmulti (Multispecies Mean Length estimator)

For a multispecies analysis (Huynh et al. 2017a), seperate `MLZ_data` objects are created for seperate stocks/species and should be stored in a list:

    data(PRSnapper)
    typeof(PRSnapper)

    ## [1] "list"

The corresponding estimation function and grid search function are `MLmulti` and `profile_MLmulti`, respectively. For both functions, the Single Species Model or Multispecies 1, 2, or 3 must also be identified in the `model` argument:

    MLmulti(PRSnapper, ncp = 1, model = "MSM1")

In component `estimates` of the output object, the mortality estimates `Z[i,n]` are indexed by time period `i` and species `n`, change points `yearZ[i]` are indexed by time period `i`, and `sigma[n]` is indexed by species `n`. For models `MSM2` and `MSM3`, `Z[i,n]` are estimated for `i = 1` and derived for `i > 1`. Esimated parameters can be viewed by checking component `opt` from the output:

    res <- MLmulti(PRSnapper, ncp = 1, model = "MSM1")
    names(res@opt$par)

The `compare_models` function will correctly count the number of estimated parameters for AIC calculation.

### 4.3 MLeffort (Mean Length with Effort)

`MLeffort` uses a time series of mean length and effort to estimate a catchability coefficient `q` and natural mortality `M` (Then et al.). Parameter \(t_0\) from the von Bertalanffy equation is needed as well:

    data(Nephrops)
    Nephrops@Effort
    Nephrops@vbt0 <- 0
    MLeffort(Nephrops, start = list(q = 0.1, M = 0.2), n_age = 24)

Unlike other models in the package, starting values are required in MLeffort.

Instead of using an analytic model for the mean length, MLeffort uses an age-structured population model. The youngest age in the age-structured model is \(t_c\) which is obtained from von Bertalanffy parameters and \(L_c\): \(t_c = \frac{-1}{K}log(1 - \frac{L_c}{L_{\infty}}) + t_0\)

In the `MLeffort` function call, the number of ages above \(t_c\) to be modeled is specified in argument `n_age`. Time steps smaller than one year can be used by indicating the number of seasons in the model with argument `n_season`. The season is matched to the season in which mean lengths are observed with argument `obs_season`. Currently only one observation per year is supported. The timing within the observed season that lengths are observed is set with argument `timing`, i.e. `timing = 0, 0.5` is the beginning and middle of the season, respectively. The equilibrium effort prior to the first year of the model is indicated with argument `eff_init`, i.e. `eff_init = 0` for virgin equilibrium conditions.

    MLeffort(Nephrops, start = list(q = 0.1, M = 0.3), n_age = 24, n_season = 1, obs_season = 1, timing = 0.5)

Finally, the model can be run with a fixed M with the argument `estimate.M = FALSE`, in which case, the value of M for the model is obtained from slot `@M` in the MLZ_data object.

    Nephrops@M <- 0.3
    MLeffort(Nephrops, start = list(q = 0.1), n_age = 24, estimate.M = FALSE)

## 5. References

Gedamke, T. and Hoenig, J.M. 2006. Estimating mortality from mean length data in nonequilibrium situations, with application to the assessment of goosefish. Transactions of the American Fisheries Society 135:476-487.

Huynh, Q.C., Gedamke, T., Hoenig, J.M, and Porch C. 2017a. Multispecies Extensions to a Nonequilibrium Length-Based Mortality Estimator. Marine and Coastal Fisheries 9:68-78.

Huynh, Q.C., Gedamke, T., Porch, C.E., Hoenig, J.M., Walter, J.F, Bryan, M., and Brodziak, J. 2017b. Estimating Total Mortality Rates from Mean Lengths and Catch Rates in Non-equilibrium Situations. Transactions of the American Fisheries Society 146:803-815.

Then, A.Y, Hoenig, J.M, and Huynh, Q.C. 2018. Estimating fishing and natural mortality rates, and catchability coefficient, from a series of observations on mean length and fishing effort. ICES Journal of Marine Science 75: 610-620.