library(FSA) # for headtail(), vbFuns(), vbStarts()
library(dplyr) # for select(), filter()
library(nlstools) # for nlsBoot()
Other VBGF Parameterizations
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.
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.
<- read.csv("https://raw.githubusercontent.com/fishR-Core-Team/FSAdata/main/data-raw/BlackDrum2001.csv") |>
bdm 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=
.
<- vbFuns("Original") ) ( vbO
#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.
<- vbStarts(tl~otoage,data=bdm,type="Original") ) ( svO
#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).
<- nls(tl~vbO(otoage,Linf,K,L0),data=bdm,start=svO)
nlsO 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
<- nlsBoot(nlsO)
bootO 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=
.
<- vbFuns("Francis") ) ( vbF
#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()
).
<- range(bdm$otoage) ) ( ages
#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=
.
<- vbStarts(tl~otoage,data=bdm,type="Francis",ages2use=ages) ) ( svF
#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()
.
<- nls(tl~vbF(otoage,L1,L2,L3,t1=ages),data=bdm,start=svF)
nlsF 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
<- nlsBoot(nlsF)
bootF 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