--- title: "sizeMat: An R Package to Estimate Size at Sexual Maturity" author: "Josymar Torrejon-Magallanes" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{sizeMat: An R Package to Estimate Size at Sexual Maturity} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.align = "center", fig.width = 7, fig.height = 5, warning = FALSE, message = FALSE ) library(sizeMat) ``` # Introduction The `sizeMat` package estimates size at sexual maturity in organisms, especially fish and invertebrates. It includes tools for estimating: - size at morphometric maturity, based on relative growth and classification of individuals into juvenile and adult groups; - size at gonadal maturity, based on maturity stages; - maturity ogives using frequentist or Bayesian logistic regression; - uncertainty around model parameters and size at 50% maturity, usually denoted as $L_{50}$. The size at sexual maturity is defined here as the length at which a randomly chosen individual has a 50% probability of being mature. # Installation The stable version can be installed from CRAN: ```{r install-cran, eval = FALSE} install.packages("sizeMat") ``` The development version can be installed from GitHub: ```{r install-github, eval = FALSE} # install.packages("devtools") devtools::install_github("ejosymart/sizeMat") ``` # 1. Size at morphometric maturity Morphometric maturity is estimated from the relative growth relationship between two allometric variables. In this example, we use the `crabdata` dataset. This dataset contains allometric measurements and biological information for crabs of the species *Chionoecetes tanneri*. ```{r load-crabdata} data(crabdata) head(crabdata) names(crabdata) ``` ## 1.1 Classification of juveniles and adults The function `classify_mature()` classifies individuals into two groups: - juveniles = 0 - adults = 1 The classification is based on a principal components analysis using two allometric variables, followed by hierarchical clustering and discriminant analysis. The argument `varNames` requires two allometric variables. The first variable is treated as the independent variable and the second as the dependent variable. The argument `varSex` identifies the sex variable. If `selectSex = NULL`, all individuals are used. ```{r classify-data} classify_data <- classify_mature( crabdata, varNames = c("carapace_width", "chela_height"), varSex = "sex_category", selectSex = NULL, method = "ld" ) classify_data_males <- classify_mature( crabdata, varNames = c("carapace_width", "chela_height"), varSex = "sex_category", selectSex = "m", method = "ld" ) print(classify_data) ``` ## 1.2 Base graphics plot for classified data By default, `plot.classify()` uses base R graphics. ```{r plot-classify-base, fig.width = 7, fig.height = 5} plot( classify_data, xlab = "Carapace width (mm)", ylab = "Chela height (mm)" ) ``` The graphic can be customized using colors, point symbols, line types, and point size. ```{r plot-classify-base-custom, fig.width = 7, fig.height = 5} plot( classify_data, xlab = "Carapace width (mm)", ylab = "Chela height (mm)", col = c(2, 3), pch = c(5, 6), lty_lines = c(1, 2), lwd_lines = c(1, 3), cex = c(1, 2), main = "Classification" ) ``` ## 1.3 ggplot2-style plot for classified data A `ggplot2` style can be obtained with `gg_style = TRUE`. ```{r plot-classify-gg, fig.width = 7, fig.height = 5} plot( classify_data, xlab = "Carapace width (mm)", ylab = "Chela height (mm)", col = c("steelblue", "firebrick"), pch = c(16, 17), gg_style = TRUE ) ``` Because the function returns a `ggplot` object when `gg_style = TRUE`, the plot can be further modified. ```{r plot-classify-gg-modified, fig.width = 7, fig.height = 5} p_classify <- plot( classify_data, xlab = "Carapace width (mm)", ylab = "Chela height (mm)", col = c("steelblue", "firebrick"), pch = c(16, 17), gg_style = TRUE ) p_classify + ggplot2::theme_bw() ``` # 2. Estimation of size at morphometric maturity After individuals are classified, size at morphometric maturity can be estimated using `morph_mature()`. The model is based on a logistic function: $$ P_{CS} = \frac{1}{1 + e^{-(\hat{\beta}_{0} + \hat{\beta}_{1}X)}} $$ where $P_{CS}$ is the probability of being mature at length $X$. The size at 50% maturity is calculated as: $$ L_{50} = -\frac{\hat{\beta}_{0}}{\hat{\beta}_{1}} $$ The argument `method` defines the model type: - `method = "fq"` uses frequentist logistic regression; - `method = "bayes"` uses Bayesian logistic regression. For vignette purposes, we use a relatively small number of iterations so that the document compiles quickly. ```{r morph-mature} set.seed(123) my_morph_fq <- morph_mature( classify_data, method = "fq", niter = 200 ) print(my_morph_fq) my_morph_bayes <- morph_mature( classify_data, method = "bayes", niter = 200 ) print(my_morph_bayes) ``` ## 2.1 Base graphics plot for morphometric maturity By default, `plot.morphMat()` uses base R graphics. It produces histograms for the model parameters and the maturity ogive. ```{r plot-morph-base, fig.width = 7, fig.height = 5} oldpar <- par(no.readonly = TRUE) par(mfrow = c(2, 2)) plot( my_morph_fq, xlab = "Carapace width (mm)", ylab = "Proportion mature", col = c("blue", "red") ) par(oldpar) ``` To plot only the maturity ogive, use `onlyOgive = TRUE`. ```{r plot-morph-base-ogive, fig.width = 7, fig.height = 5} plot( my_morph_fq, xlab = "Carapace width (mm)", ylab = "Proportion mature", col = c("blue", "red"), onlyOgive = TRUE ) ``` ## 2.2 ggplot2-style plots for morphometric maturity A `ggplot2` maturity ogive can be obtained using `gg_style = TRUE`. ```{r plot-morph-gg-ogive, fig.width = 7, fig.height = 5} plot( my_morph_fq, xlab = "Carapace width (mm)", ylab = "Proportion mature", col = c("steelblue", "firebrick"), onlyOgive = TRUE, gg_style = TRUE ) ``` When `onlyOgive = FALSE` and `gg_style = TRUE`, the function returns a list of independent `ggplot` objects. ```{r plot-morph-gg-list} p_morph <- plot( my_morph_fq, xlab = "Carapace width (mm)", ylab = "Proportion mature", col = c("steelblue", "firebrick"), gg_style = TRUE ) names(p_morph) ``` The individual plots can then be displayed separately. ```{r plot-morph-gg-A, fig.width = 7, fig.height = 5} p_morph$A ``` ```{r plot-morph-gg-B, fig.width = 7, fig.height = 5} p_morph$B ``` ```{r plot-morph-gg-L50, fig.width = 7, fig.height = 5} p_morph$L50 ``` ```{r plot-morph-gg-ogive-from-list, fig.width = 7, fig.height = 5} p_morph$ogive ``` The returned plots can also be modified using standard `ggplot2` syntax. ```{r plot-morph-gg-custom, fig.width = 7, fig.height = 5} p_morph$ogive + ggplot2::theme_bw() ``` # 3. Size at gonadal maturity Gonadal maturity is estimated using a maturity stage variable and an allometric variable such as total length. In this example, we use the `matFish` dataset. ```{r load-matfish} data(matFish) head(matFish) ``` The dataset contains: - `total_length`: total length in cm; - `stage_mat`: gonadal maturation stage. In this example, stage `I` is considered immature, whereas stages `II`, `III`, and `IV` are considered mature. ## 3.1 Estimation of size at gonadal maturity The function `gonad_mature()` requires: - `varNames`: the length variable and the maturity stage variable; - `immName`: the immature stage or stages; - `matName`: the mature stage or stages; - `method`: the logistic regression approach; - `niter`: the number of bootstrap or Bayesian iterations. ```{r gonad-mature} set.seed(123) my_gonad_fq <- gonad_mature( matFish, varNames = c("total_length", "stage_mat"), immName = "I", matName = c("II", "III", "IV"), method = "fq", niter = 200 ) print(my_gonad_fq) my_gonad_bayes <- gonad_mature( matFish, varNames = c("total_length", "stage_mat"), immName = "I", matName = c("II", "III", "IV"), method = "bayes", niter = 200 ) print(my_gonad_bayes) ``` ## 3.2 Base graphics plot for gonadal maturity By default, `plot.gonadMat()` uses base R graphics. ```{r plot-gonad-base, fig.width = 7, fig.height = 5} oldpar <- par(no.readonly = TRUE) par(mfrow = c(2, 2)) plot( my_gonad_fq, xlab = "Total length (cm)", ylab = "Proportion mature", col = c("blue", "red") ) par(oldpar) ``` To plot only the maturity ogive, use `onlyOgive = TRUE`. ```{r plot-gonad-base-ogive, fig.width = 7, fig.height = 5} plot( my_gonad_fq, xlab = "Total length (cm)", ylab = "Proportion mature", col = c("blue", "red"), onlyOgive = TRUE ) ``` The legend position can be modified with `legendPosition`. ```{r plot-gonad-base-legend-position, fig.width = 7, fig.height = 5} plot( my_gonad_fq, xlab = "Total length (cm)", ylab = "Proportion mature", col = c("blue", "red"), onlyOgive = TRUE, legendPosition = "bottomright" ) ``` The legend can also be removed. ```{r plot-gonad-base-no-legend, fig.width = 7, fig.height = 5} plot( my_gonad_fq, xlab = "Total length (cm)", ylab = "Proportion mature", col = c("blue", "red"), onlyOgive = TRUE, showLegend = FALSE ) ``` ## 3.3 ggplot2-style plots for gonadal maturity A `ggplot2` maturity ogive can be obtained using `gg_style = TRUE`. ```{r plot-gonad-gg-ogive, fig.width = 7, fig.height = 5} plot( my_gonad_fq, xlab = "Total length (cm)", ylab = "Proportion mature", col = c("steelblue", "firebrick"), onlyOgive = TRUE, gg_style = TRUE ) ``` The position of the $L_{50}$ and $R^2$ labels can also be changed. ```{r plot-gonad-gg-legend-position, fig.width = 7, fig.height = 5} plot( my_gonad_fq, xlab = "Total length (cm)", ylab = "Proportion mature", col = c("steelblue", "firebrick"), onlyOgive = TRUE, gg_style = TRUE, legendPosition = "bottomright" ) ``` When `onlyOgive = FALSE` and `gg_style = TRUE`, the function returns a list of independent `ggplot` objects. ```{r plot-gonad-gg-list} p_gonad <- plot( my_gonad_fq, xlab = "Total length (cm)", ylab = "Proportion mature", col = c("steelblue", "firebrick"), gg_style = TRUE ) names(p_gonad) ``` The individual plots can be displayed separately. ```{r plot-gonad-gg-A, fig.width = 7, fig.height = 5} p_gonad$A ``` ```{r plot-gonad-gg-B, fig.width = 7, fig.height = 5} p_gonad$B ``` ```{r plot-gonad-gg-L50, fig.width = 7, fig.height = 5} p_gonad$L50 ``` ```{r plot-gonad-gg-ogive-from-list, fig.width = 7, fig.height = 5} p_gonad$ogive ``` The returned plots can be customized using `ggplot2`. ```{r plot-gonad-gg-custom, fig.width = 7, fig.height = 5} p_gonad$ogive + ggplot2::theme_bw() ``` # References Agostinho, C. S. (2000). Use of otoliths to estimate size at sexual maturity in fish. *Brazilian Archives of Biology and Technology*, 43(4). Corgos, A. and Freire, J. (2006). Morphometric and gonad maturity in the spider crab *Maja brachydactyla*: a comparison of methods for estimating size at maturity in species with determinate growth. *ICES Journal of Marine Science*, 63(5), 851-859. Roa, R., Ernst, B. and Tapia, F. (1999). Estimation of size at sexual maturity: an evaluation of analytical and resampling procedures. *Fishery Bulletin*, 97(3), 570-580. Somerton, D. A. (1980). A computer technique for estimating the size of sexual maturity in crabs. *Canadian Journal of Fisheries and Aquatic Sciences*, 37(10), 1488-1494.