The von Bertalanffy Growth Function (VBGF) was introduced and methods for fitting the function were illustrated in Chapter 12 of the Introductory Fisheries Analyses with R (IFAR) book. The VBGF used there 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. The most common parameterizations of the VBGF may be seen with vbModels() from FSA.

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 function 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 the IFAR book) and is not interested in the parameters of the other parameterizations, then either of these two parameterizations may be used.

The parametarization of Francis (1988) will be fit in this supplement to illustrate fitting other than the “Typical” parameterization used in Chapter 12 of the IFAR book. Other supplements demonstrate how to fit other growth functions and use alternative nonlinear model fitting algorithms.

 

Required Packages for this Supplement

Functions used in this supplement require the packages shown below.

> library(FSA)
> library(dplyr)
> library(nlstools)

Data Used in this Supplement

The male Black Drum data (view, download, meta-data) used in the IFAR book are also used in this supplement.

> bdmf <- read.csv("BlackDrum2001.csv") %>%
    select(-c(spname,day,weight)) %>%
    filterD(sex %in% c("male","female"),otoage<50)
> bdm <- filterD(bdmf,sex=="male")
> headtail(bdm)
   year agid month     tl  sex otoage
1  2001    1     4  787.5 male      6
2  2001    2     5  700.0 male      5
3  2001    8     5 1140.0 male     23
72 2001  122     5 1175.0 male     39
73 2001  125     6  590.0 male      4
74 2001  127     6  530.0 male      3

 

Fitting Other VBGF Parameterizations

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 the IFAR chapter 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 the common parameterizations shown in vbModels() 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. A brief explanation of the parameters is also returned if msg=TRUE is included in vbFuns().

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 Ling=.

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

Starting values are obtained with vbStarts() as described in the IFAR chapter.

> ( svO <- vbStarts(tl~otoage,data=bdm,type="Original") )
$Linf
[1] 1192.692

$L0
[1] 88.57503

$K
[1] 0.1924053

The VBGF is fit and parameter estimates with likelihood profile confidence intervals are obtained as described in the IFAR book. Bootstrapped confidence intervals and predictions may also be obtained as described in the IFAR book.

> nlsO <- nls(tl~vbO(otoage,Linf,L0,K),data=bdm,start=svO)
> cbind(Ests=coef(nlsO),confint(nlsO))
Waiting for profiling to be done...
             Ests         2.5%        97.5%
Linf 1196.7192108 1177.9880068 1217.3520912
L0    242.1882291  133.1636548  338.4767316
K       0.1418268    0.1214678    0.1649841
> bootO <- nlsBoot(nlsO)
> cbind(Ests=coef(nlsO),confint(bootO))
             Ests     95% LCI     95% UCI
Linf 1196.7192108 1180.856750 1215.089792
L0    242.1882291  147.578306  325.960829
K       0.1418268    0.124511    0.161096
> predict(bootO,vbO,t=3)
prediction    95% LCI    95% UCI 
  572.5216   535.9480   610.3373 

 

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") )
function(t,L1,L2=NULL,L3=NULL,t1,t3=NULL) {
  if (length(L1)==3) { L2 <- L1[[2]]; L3 <- L1[[3]]; L1 <- L1[[1]] }
  if (length(t1)==2) { t3 <- t1[[2]]; t1 <- t1[[1]] }
  r <- (L3-L2)/(L2-L1)
  L1+(L3-L1)*((1-r^(2*((t-t1)/(t3-t1))))/(1-r^2))
}
<environment: 0x073c2010>

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) )
[1]  3 42

Starting values are obtained with vbStarts() as described in the IFAR chapter and above. However, 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) )
$L1
[1] 572.775

$L2
[1] 1139.625

$L3
[1] 1205

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

> nlsF <- nls(tl~vbF(otoage,L1,L2,L3,t1=ages),data=bdm,start=svF)
> cbind(Ests=coef(nlsF),confint(nlsF))
Waiting for profiling to be done...
       Ests      2.5%     97.5%
L1  572.975  533.2025  612.3236
L2 1157.463 1145.6535 1169.2496
L3 1194.248 1176.6756 1212.7376
> bootF <- nlsBoot(nlsF)
> cbind(Ests=coef(nlsF),confint(bootF))
       Ests   95% LCI   95% UCI
L1  572.975  534.7997  613.7465
L2 1157.463 1146.7695 1168.4532
L3 1194.248 1177.5684 1210.2266
> predict(bootF,vbF,t=3,t1=ages)
prediction    95% LCI    95% UCI 
  573.0725   534.7997   613.7465 

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)

Formula: tl ~ vbF(otoage, L1, L2, L3, t1 = ages)

Parameters:
   Estimate Std. Error t value Pr(>|t|)
L1  572.975     19.424    29.5   <2e-16
L2 1157.463      5.910   195.9   <2e-16
L3 1194.248      8.717   137.0   <2e-16

Residual standard error: 45.6 on 71 degrees of freedom

Correlation of Parameter Estimates:
   L1    L2   
L2 -0.16      
L3  0.17  0.65

Number of iterations to convergence: 5 
Achieved convergence tolerance: 3.023e-06

 


Reproducibility Information

  • Compiled Date: Sat Feb 13 2016
  • Compiled Time: 9:50:14 AM
  • R Version: R version 3.2.3 (2015-12-10)
  • System: Windows, i386-w64-mingw32/i386 (32-bit)
  • Base Packages: base, datasets, graphics, grDevices, methods, stats, utils
  • Required Packages: FSA, dplyr, nlstools, captioner, knitr and their dependencies (assertthat, car, DBI, digest, evaluate, formatR, gdata, gplots, graphics, grDevices, highr, Hmisc, lazyeval, magrittr, markdown, methods, plotrix, plyr, R6, Rcpp, sciplot, stats, stringr, tools, utils, yaml)
  • Other Packages: captioner_2.2.3, dplyr_0.4.3, extrafont_0.17, FSA_0.8.5, knitr_1.12.3, nlstools_1.0-2
  • Loaded-Only Packages: assertthat_0.1, DBI_0.3.1, digest_0.6.9, evaluate_0.8, extrafontdb_1.0, formatR_1.2.1, gdata_2.17.0, gtools_3.5.0, htmltools_0.3, lazyeval_0.1.10, magrittr_1.5, MASS_7.3-45, parallel_3.2.3, plyr_1.8.3, R6_2.1.2, Rcpp_0.12.3, rmarkdown_0.9.2, Rttf2pt1_1.3.3, stringi_1.0-1, stringr_1.0.0, tools_3.2.3, yaml_2.1.13
  • Links: Script / RMarkdown

 

References

Beverton, R. J. H., and S. J. Holt. 1957. On the dynamics of exploited fish populations. Page 533. 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.

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.