Other VBGF Parameterizations

Author

Derek H. Ogle

 

The von Bertalanffy Growth Function (VBGF) used in Chapter 12 of Ogle (2016) is from Beverton and Holt (1957) and is called the “Typical” parameterization of the VBGF. The VBGF can be expressed in alternative forms that are called parameterizations.

Different parameterizations do not fit the data differently. In other words, all parameterizations of the VBGF have the same number of parameters and will produce the same predicted values and fitted model plots. However, different parameterizations have different parameters that may be of interest to the fisheries scientist for biological reasons or because they have useful statistical properties. For example, the parameterizations of von Bertalanffy (1938) and Mooij et al. (1999) both use \(L_{0}\), which is the mean length at time 0 (i.e., at “hatch”). Thus, either of these parameterizations could be used if the \(L_{0}\) parameter was of biological interest. In contrast, the parameters in the parameterizations of Schnute (1981) and Francis (1988) are either largely or wholly based on expected values, which are generally less correlated. Thus, if one wants to avoid the problems associated with highly correlated parameters (as discussed in Ogle (2016)) and is not interested in the parameters of the other parameterizations, then either of these two parameterizations may be used.

The parametarizations of von Bertalanffy (1938) and Francis (1988) are fit in this supplement to illustrate fitting other than the “Typical” parameterization used in Chapter 12 of Ogle (2016). Fitting growth functions other than the VBGF is demonstrated here.

Setup

Packages

Functions used in this supplement require the following packages.

library(FSA)      # for headtail(), vbFuns(), vbStarts()
library(dplyr)    # for select(), filter()
library(nlstools) # for nlsBoot()

Data

The male Black Drum data.1 used in Ogle (2016) are also used in this supplement. As in Ogle (2016) a few unneeded variables are removed for simplicity, only males are examined, and a single old fish is removed by including only fish with an otolith age less than 50.

  • 1 Download data with CSV link on the linked page.

  • bdm <- read.csv("https://raw.githubusercontent.com/fishR-Core-Team/FSAdata/main/data-raw/BlackDrum2001.csv") |>
      select(-c(spname,day,weight)) |>
      filter(sex=="male",otoage<50)
    headtail(bdm)
    #R|     year agid month     tl  sex otoage
    #R|  1  2001    1     4  787.5 male      6
    #R|  2  2001    2     5  700.0 male      5
    #R|  3  2001    8     5 1140.0 male     23
    #R|  72 2001  122     5 1175.0 male     39
    #R|  73 2001  125     6  590.0 male      4
    #R|  74 2001  127     6  530.0 male      3

     

    Original Parameterization

    The parameterization originally proposed by von Bertalanffy (1938) is defined as

    \[ E[L|t] = L_{\infty} - (L_{\infty}-L_{0})e^{-Kt} \]

    where \(L_{\infty}\) and \(K\) are as defined for the typical parameterization and \(L_{0}\) is the mean length at \(t=0\).

    As demonstrated in Ogle (2016) for the “Typical” VBGF, an R function that uses the VBGF to predict length from a given age is needed. This R function may be created by the user, but for many common parameterizations it is easier to use vbFuns() from FSA. As a reminder, vbFuns() requires the name for the parameterization to use in quotes as the first argument.2

  • 2 A brief explanation of the parameters is also returned if msg=TRUE is included.

  • An R function called vbO() is created for the “original” parameterization below. Note with this function that values for the three parameters may be included as a vector in Linf=.

    ( vbO <- vbFuns("Original") )
    #R|  function(t,Linf,K=NULL,L0=NULL) {
    #R|    if (length(Linf)==3) { K <- Linf[[2]]
    #R|                           L0 <- Linf[[3]]
    #R|                           Linf <- Linf[[1]] }
    #R|    Linf-(Linf-L0)*exp(-K*t)
    #R|    }
    #R|  <bytecode: 0x000001f9063746d8>
    #R|  <environment: 0x000001f9064c29f0>

    Starting values are obtained with vbStarts() as described in Ogle (2016), but using type="Original" for this parameterization.

    ( svO <- vbStarts(tl~otoage,data=bdm,type="Original") )
    #R|  $Linf
    #R|  [1] 1192.692
    #R|  
    #R|  $K
    #R|  [1] 0.1924053
    #R|  
    #R|  $L0
    #R|  [1] 88.57503

    The VBGF is fit and parameter estimates with likelihood profile confidence intervals and bootstrapped confidence intervals and predictions may also be obtained as described in Ogle (2016).

    nlsO <- nls(tl~vbO(otoage,Linf,K,L0),data=bdm,start=svO)
    cbind(Ests=coef(nlsO),confint(nlsO))
    #R|               Ests         2.5%        97.5%
    #R|  Linf 1196.7192084 1177.9880068 1217.3520912
    #R|  K       0.1418268    0.1214678    0.1649841
    #R|  L0    242.1881977  133.1636548  338.4767317
    bootO <- nlsBoot(nlsO)
    cbind(Ests=coef(nlsO),confint(bootO))
    #R|               Ests      95% LCI      95% UCI
    #R|  Linf 1196.7192084 1178.5421670 1215.8891738
    #R|  K       0.1418268    0.1223639    0.1627932
    #R|  L0    242.1881977  145.0522382  334.5605528
    predict(bootO,vbO,t=3)
    #R|       t   Median  95% LCI 95% UCI
    #R|  [1,] 3 573.2464 537.8995 612.112

     

    Francis Parameterization

    The Francis (1988) parameterization is defined as

    \[ E[L|t] = L_{1} + (L_{3}-L_{1})\frac{1-r^{2\frac{t-t_{1}}{t_{3}-t_{1}}}}{1-r^{2}} \]

    where

    \[ r=\frac{L_{3}-L_{2}}{L_{2}-L_{1}} \]

    The function parameters are \(L_{1}\), \(L_{2}\), and \(L_{3}\), which represent the mean lengths at ages \(t_{1}\), \(t_{2}\), and \(t_{3}\), respectively, where \(t_{1}\) and \(t_{3}\) are relatively young and old ages chosen by the user and \(t_{2}\) is the average of \(t_{1}\) and \(t_{3}\).

    Similar to above, an R function called vbF() is created for the “Francis” parameterization below. Note with this function that values for the three parameters may be included as a vector in L1= and that the youngest and oldest ages may be included as a vector in t1=.

    ( vbF <- vbFuns("Francis") )
    #R|  function(t,L1,L2=NULL,L3=NULL,t1,t3=NULL) {
    #R|    if (length(L1)==3) { L2 <- L1[[2]]; L3 <- L1[[3]]; L1 <- L1[[1]] }
    #R|    if (length(t1)==2) { t3 <- t1[[2]]; t1 <- t1[[1]] }
    #R|    r <- (L3-L2)/(L2-L1)
    #R|    L1+(L3-L1)*((1-r^(2*((t-t1)/(t3-t1))))/(1-r^2))
    #R|    }
    #R|  <bytecode: 0x000001f90639c710>
    #R|  <environment: 0x000001f9052cacc0>

    As stated above, the user must choose values for \(t_{1}\) and \(t_{3}\). In this example, I have chosen to use the youngest and oldest ages in the data (as found with range()).

    ( ages <- range(bdm$otoage) )
    #R|  [1]  3 42

    Starting values are obtained with vbStarts() as described above, but with type="Francis". Additionally, with the “Francis” parameterization, the ages that define \(t_{1}\) and \(t_{3}\) must also be provided in ages2use=.

    ( svF <- vbStarts(tl~otoage,data=bdm,type="Francis",ages2use=ages) )
    #R|  $L1
    #R|  [1] 572.775
    #R|  
    #R|  $L2
    #R|  [1] 1139.625
    #R|  
    #R|  $L3
    #R|  [1] 1205

    The VBGF is fit and parameter estimates with likelihood profile confidence intervals and bootstrapped confidence intervals and predictions are obtained as described in Ogle (2016), with the exception that the vector that defines the youngest and oldest ages must be supplied to vbF().

    nlsF <- nls(tl~vbF(otoage,L1,L2,L3,t1=ages),data=bdm,start=svF)
    cbind(Ests=coef(nlsF),confint(nlsF))
    #R|         Ests      2.5%     97.5%
    #R|  L1  572.975  533.2025  612.3236
    #R|  L2 1157.463 1145.6535 1169.2496
    #R|  L3 1194.248 1176.6756 1212.7376
    bootF <- nlsBoot(nlsF)
    cbind(Ests=coef(nlsF),confint(bootF))
    #R|         Ests   95% LCI   95% UCI
    #R|  L1  572.975  537.1674  609.8586
    #R|  L2 1157.463 1146.1576 1169.1746
    #R|  L3 1194.248 1178.7829 1211.8380
    predict(bootF,vbF,t=3,t1=ages[1],t3=ages[2])
    #R|       t   Median  95% LCI  95% UCI
    #R|  [1,] 3 574.7108 537.1674 609.8586

    Note that the intra-parameter correlations are relatively low for this parameterization. Additionally, the scale of the parameters in the “Francis” parameterization are usually similar. Both of these characteristics may aid model convergence.

    summary(nlsF,correlation=TRUE)$correlation
    #R|             L1         L2        L3
    #R|  L1  1.0000000 -0.1609491 0.1705984
    #R|  L2 -0.1609491  1.0000000 0.6492111
    #R|  L3  0.1705984  0.6492111 1.0000000

    References

    Beverton, R. J. H., and S. J. Holt. 1957. On the Dynamics of Exploited Fish Populations. United Kingdom Ministry of Agriculture; Fisheries.
    Francis, R. I. C. C. 1988. Are growth parameters estimated from tagging and age-length data comparable? Canadian Journal of Fisheries and Aquatic Sciences 45:936–942.
    Mooij, W. M., J. M. V. Rooij, and S. Wijnhoven. 1999. Analysis and comparison of fish growth from small samples of length-at-age data: Detection of sexual dimorphism in Eurasian Perch as an example. Transactions of the American Fisheries Society 128:483–490.
    Ogle, D. H. 2016. Introductory Fisheries Analyses with R. CRC Press, Boca Raton, FL.
    Schnute, J. 1981. A versatile growth model with statistically stable parameters. Canadian Journal of Fisheries and Aquatic Sciences 38:1128–1140.
    von Bertalanffy, L. 1938. A quantitative theory of organic growth (inquiries on growth laws II). Human Biology 10:181–213.