Skip to contents

Introduction

The most common growth models used in fisheries, such as von Bertalanffy, Gompertz, logistic, and Richards, are non-linear models. Computer functions used to estimate parameters for these models require “starting values” to initiate the parameter search algorithm. Previous versions of FSA (v0.9.6 and lower) used ad hoc methods to estimate starting values for parameterizations of the von Bertalanffy function, but did not provide any method to derive starting values for the ohter common growth functions.

Several “self-starting” non-linear models are provided in R, with three of these found in base R and one in an add-on package that correspond to the common fisheries growth models. These functions provide starting values that are based on robust theory. Herein, I show how the starting values provided by these self-starting functions can be used to derive starting values for the common parameterizations of the common growth models used in fisheries. I will conclude by briefly demonstrating a new function in FSA that will provide the starting values demonstrated here.


Derivation of Starting Values

von Bertalanffy Length-at-Age

FSA provides a wide variety of von Bertalanffy parameterizations for modeling simple length-at-age data (Table 1).1

Table 1: Parameterizations of the von Bertalanffy growth equation for length-at-age data available in FSA.
param Equation
1 E(Lt)=L(1eK(tt0))E(L_t) = L_\infty\left(1-e^{-K(t-t_0)}\right)
2 E(Lt)=L(LL0)eKtE(L_t) = L_\infty - (L_\infty-L_0)~e^{-Kt}
3 E(Lt)=ωK(1eK(tt0))E(L_t) = \frac{\omega}{K}\left(1-e^{-K(t-t_0)}\right)
4 E(Lt)=L(LL0)eωLtE(L_t) = L_\infty - (L_\infty-L_0)~e^{-\frac{\omega}{L_\infty}t}
5 E(Lt)=L(1elog(2)tt0t50t0)E(L_t) = L_\infty\left(1-e^{-log(2)\frac{t-t_0}{t_{50}-t_0}}\right)
6 E(Lt)=Lr+(LLr)eeK(ttr)E(L_t) = L_r + (L_\infty-L_r)~e^{-e^{-K(t-t_r)}}
7 E(Lt)=L1+(L3L1)1eK(tt1)1eK(t3t1)E(L_t) = L_1+(L_3-L_1)\frac{1-e^{-K(t-t_1)}}{1-e^{-K(t_3-t_1)}}
8 E(Lt)=L1+(L3L1)1r2tt1t3t11r2E(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=L3L2L2L1r=\frac{L_3-L_2}{L_2-L_1}


The response variable, LL, is length and the explanatory variable, tt is age. Parameters in these growth functions are:

  • LL_\infty = asymptotic mean length
  • KK = exponential rate of approach to LL_\infty
  • t0t_0 = nuisance parameter that is the hypothetical time/age when mean length is 0
  • L0L_0 = mean length at age-0 (i.e., hatching or birth)
  • ω\omega = growth rate near t0t_0
  • t50t_{50} = age when half of LL_\infty is reached
  • trt_r = mean age at LrL_r (sometimes this is a constant)
  • LrL_r = mean length at trt_r (sometimes this is a constant)
  • L1L_1 = mean length at t1t_1 (generally a younger age)
  • L2L_2 = mean length at t2t_2 (generally an intermediate age)
  • L3L_3 = mean length at t3t_3 (generally a older age)

Constant values (i.e., set by the user) are:

  • trt_r = mean age at LrL_r (sometimes this is a parameter)
  • LrL_r = mean length at trt_r (sometimes this is a parameter)
  • t1t_1 = a younger (generally) age
  • t2t_2 = an age halfway between t1t_1 and t2t_2
  • t3t_3 = an older (generally) age


SSasymp() is a self-starting function2 to fit an “asymptotic regression” function to data. The parameterization for this function is3

Y=Asym+(R0Asym)eelrc×input Y = \text{Asym}+(\text{R0}-\text{Asym})~e^{-e^{\text{lrc}\times\text{input}}}

where YY and input\text{input} are the response and explanatory variables, respectively, Asym\text{Asym} is a parameter for the horizontal (i.e., YY) asymptote, R0\text{R0} is a parameter related to the value of YY at X=0X=0, and lrclrc is a “parameter representing the natural logarithm of the rate constant.”

In growth (in length) modeling, YY is LL (for length); input\text{input} is tt (for time as measured by age); Asym\text{Asym} is clearly LL_{\infty}, the asympotic mean length; and R0\text{R0} is clearly L0L_0, the mean length at t=0t=0 (i.e., the y-intercept). Thus, at this point, the R “asymptotic regression” function can be re-written for the purposes of growth modeling as

L=L(LL0)eelrc×t L = L_\infty - (L_\infty-L_0)~e^{-e^{\text{lrc}\times t}}

If we move lrc\text{lrc} off of the log scale by defining K=elrcK=e^{\text{lrc}}, we can further write this function as

L=L(LL0)eKt(1) L = L_\infty - (L_\infty-L_0)~e^{-Kt} \qquad(1)

Equation 1 is exactly the second parameterization of the von Bertalanffy growth function in FSA.4 Thus, the starting values produced by SSasymp() can be used directly to find starting values for the second parameterization of the von Bertalanffy growth function in FSA (Table 2). Indeed these values can be used for all parameterizations that have LL_\infty, L0L_0, and KK. Starting values for other parameters in other parameterizations are derived from these values as shown below.

A starting value for t0t_0, the “hypothetical time when the mean length is zero”, is derived by setting L=0L=0 in Equation 1 and solving for tt.

0=L(LL0)eKtL=(LL0)eKtLLL0=eKtlog(LLL0)=Klog(LLL0)K=t \begin{align} 0 &= L_\infty - (L_\infty-L_0)~e^{-Kt} \\ L_\infty &= (L_\infty-L_0)~e^{-Kt} \\ \frac{L_\infty}{L_\infty-L_0} &= e^{-Kt} \\ log\left(\frac{L_\infty}{L_\infty-L_0}\right) &= -K \\ -\frac{log\left(\frac{L_\infty}{L_\infty-L_0}\right)}{K} &= t \end{align}

The ω\omega parameter was introduced into the fisheries growth modeling literature as ω=KL\omega=KL_\infty (Gallucci and Quin 19795). Thus, a starting value for ω\omega is simply the product of the starting values for KK and LL_\infty.

A starting value for t50t_{50} is derived (most easily) by solving the first parameterization equation for tt when LL=12\frac{L}{L_\infty}=\frac{1}{2}.

L=L(1eK(tt0))LL=1eK(tt0)12=1eK(t50t0)eK(t50t0)=12K(t50t0)=log(12)t50t0=log(2)Kt50=t0+log(2)K \begin{align} L &= L_\infty\left(1-e^{-K(t-t_0)}\right) \\ \frac{L}{L_\infty} &= 1-e^{-K(t-t_0)} \\ \frac{1}{2} &= 1-e^{-K(t_{50}-t_0)} \\ e^{-K(t_{50}-t_0)} &= \frac{1}{2} \\ -K(t_{50}-t_0) &= log\left(\frac{1}{2}\right) \\ t_{50}-t_0 &= \frac{log(2)}{K} \\ t_{50} &= t_0+\frac{log(2)}{K} \end{align}

A starting value for LrL_r (i.e., mean length at time trt_r) can be found by simply plugging trt_r into any parameterization6 and solving for LL. This strategy generalizes to find starting values for L1L_1, L2L_2, and L3L_3.

A starting value for trt_r can be found by plugging LrL_r for LL into any of the parameterizations and solving for tt.


Table 2: Conversion from SSasymp() parameters (Asym\text{Asym}, R0\text{R0}, and lrc\text{lrc}) to parameters for the common von Bertalanffy parameterizations used to model fish growth in FSA. Note that parameterizations 6, 7, and 8 have other parameters not shown in this table (but described in the main text).
Param LL_\infty L0L_0 KK ω\omega t0t_0 t50t_{50}
1 Asym\text{Asym} elrce^{\text{lrc}} log(LLL0)K-\frac{log\left(\frac{L_\infty}{L_\infty-L_0}\right)}{K}
2 Asym\text{Asym} R0\text{R0} elrce^{\text{lrc}}
3 elrce^{\text{lrc}} KLKL_\infty log(LLL0)K-\frac{log\left(\frac{L_\infty}{L_\infty-L_0}\right)}{K}
4 Asym\text{Asym} R0\text{R0} KLKL_\infty
5 Asym\text{Asym} log(LLL0)K-\frac{log\left(\frac{L_\infty}{L_\infty-L_0}\right)}{K} t0+log(2)Kt_0+\frac{log(2)}{K}
6 Asym\text{Asym} elrce^{\text{lrc}}
7 elrce^{\text{lrc}}


The equivalency of the parameterizations and the starting values across parameterizations is shown in Figure 1.

Figure 1: Parameterizations 1-8 of the von Bertalanffy growth functions evaluated at starting values derived from the parameters of SSasymp (Asym\text{Asym}=450, R0\text{R0}=25, and lrclrc=-1.2). The linewidth decreases from the first to last parameterization (and the color differs) to show how the curves are plotted on top of each other.


The ninth parameterization (Table 3) of the von Bertalanffy model in FSA is a so-called “double von Bertalanffy” model.7

Table 3: Parameterizations of the von Bertalanffy growth equation for length-at-age data available in FSA.
param Equation
9 E(Lt)=L(1eK2(tt0))(1+eb(tt0a))(1+eab)K2K1bE(L_t) = L_\infty\frac{\left(1-e^{-K_2(t-t_0)}\right)\left(1+e^{-b(t-t_0-a)}\right)}{\left(1+e^{ab}\right)^{-\frac{K_2K_1}{b}}}

Starting values for the ninth parameterization (i.e., the “double”) von Bertalanffy growth model have not been developed in FSA. Starting values for this parameterization will have to be developed by other means.


von Bertalanffy Seasonal Length-at-Age

There are also several parameterizations of the von Bertalanffy model that include a seasonal component in the model for when age is not recorded annually (Table 4).


Table 4: Parameterizations of the von Bertalanffy growth equation for length-at-age data with a seasonal component available in FSA.
param Equation
10 E(Lt)=L[1eK(tt0)S(t)+S(t0)]E(L_t) = L_\infty\left[1-e^{-K(t-t_0)-S(t)+S(t_0)}\right] where S(t)=CK2πsin(2π(tts))S(t)=\frac{CK}{2\pi} sin(2\pi(t-t_s))
11 E(Lt)=L[1eK(tt0)R(t)+R(t0)]E(L_t) = L_\infty\left[1-e^{-K(t-t_0)-R(t)+R(t_0)}\right] where R(t)=CK2πsin(2π(tWP+0.5))R(t)=\frac{CK}{2\pi} sin(2\pi(t-WP+0.5))
12 E(Lt)=L(1eK(tt0)V(t)+V(t0))E(L_t) = L_\infty(1-e^{-K'(t'-t_0)-V(t')+V(t_0)}) where V(t)=K(1NGT)2πsin(2π(1NGT)(tts))V(t)= \frac{K'(1-NGT)}{2\pi}sin(\frac{2\pi}{(1-NGT)}(t-t_s))


New parameters in these growth functions are:8

  • CC = proportional growth depression at “winter peak”
  • tst_s = time from t=0t=0 until first growth oscillation begins
  • WPWP = “winter peak” (point of slowest growth)
  • KK' = exponential rate of approach to LL_\infty during the growth period
  • NGTNGT = length of “no-growth period”


Starting values for LL_\infty, KK, and t0t_0 are derived as if the data were recorded as annual lengths-at-age. Starting values for the other parameters are defined ad hoc as follows.

  • CC set at an intermediate value of 0.5
  • tst_s set at 0.3, a likely fraction of the year for growth to start in the northern hemisphere.
  • WPWP set at 0.8, because WP=t2+0.5WP=t_2+0.5
  • NGTNGT set at 0.3, a likely fraction of the year for “no growth” in the northern hemisphere.
  • KK' set at K(1NGT)\frac{K}{(1-NGT)}, assuming that KK was only over the “growth period” (i.e., 1NGT1-NGT).

Starting values for the seasonal growth models are much less tested than those for annual growth models. Please consider them carefully.

von Bertalanffy Tag-Recapture

Still other parameterizations of the von Bertalanffy model are used with tag-recapture data (Table 5).

Table 5: Parameterizations of the von Bertalanffy growth equation for length at tag and recapture data available in FSA.
param Equation
13 E(LrLm)=(LLm)(1eKδt)E(L_r-L_m)=(L_\infty-L_m)\left(1-e^{-K\delta t}\right)
14 E(Lr)=Lm+(LLm)(1eKδt)E(L_r)=L_m + (L_\infty-L_m)\left(1-e^{-K\delta t}\right)
15 E(LrLm)=(L+β(LmLm)Lm)(1eKδt)E(L_r-L_m)=(L_\infty+\beta(L_m-\bar{L}_m)-L_m)\left(1-e^{-K\delta t}\right)
16 E(LrLm)=(α+βLm)(1eKδt)E(L_r-L_m)=(\alpha+\beta L_m)\left(1-e^{-K\delta t}\right)
17 E(Lr)=Lm+(α+βLm)(1eKδt)E(L_r)=L_m+(\alpha+\beta L_m)\left(1-e^{-K\delta t}\right)
18 E(LrLm)=[L2g1L1g2g1g2Lm][1(1+g1g2L1L2)δt]E(L_r-L_m)=\left[\frac{L_2g_1-L_1g_2}{g_1-g_2}-L_m\right]\left[1-\left(1+\frac{g_1-g_2}{L_1-L_2}\right)^{\delta t}\right]
19 E(LrLm)=[L2g1L1g2g1g2Lm][1(1+g1g2L1+L2)t2t1+S2S1]E(L_r-L_m)=\left[\frac{L_2g_1-L_1g_2}{g_1-g_2}-L_m\right]\left[1-\left(1+\frac{g_1-g_2}{L_1+L_2}\right)^{t_2-t_1+S_2-S_1}\right] with S1=usin(2π(t1w)2π)S_1=u\text{sin}\left(\frac{2\pi(t_1-w)}{2\pi}\right) and S2=usin(2π(t2w)2π)S_2=u\text{sin}\left(\frac{2\pi(t_2-w)}{2\pi}\right)

The response variable is generally the change in length (i.e., growth increment) from time of tagging to time of recapture, LrLmL_r-L_m. Some models are parameterized to have LmL_m on the right-hand-side though. The explanatory variable is the change in time between the time of tagging and recapture, δt\delta t.

New parameters in these growth functions are:

  • β\beta = a measure of individual fish variability.
  • α\alpha = a nuisance parameter related to LL_\infty and an individual’s LmL_m.
  • g1g_1 = mean annual growth rate at the (relatively small) reference length L1L_1.
  • g2g_2 = mean annual growth rate at the (relatively large) reference length L2L_2.
  • uu = describes “the extent of seasonality” (uu=0 is no seasonality).
  • ww = is the time of year when growth rates are maximum.


Starting values for (most of) these parameters were developed with the following ad hoc procedure.

  • Regress (linear) observed annual growth rate (i.e., δLδt\frac{\delta L}{\delta t} or LrLmtrtm\frac{L_r-L_m}{t_r-t_m}) on observed length-at-marking (i.e., LmL_m).
  • Use this model to predict annual growth rates (g1g_1 and g2g_2) at L1L_1 and L2L_2. [L1L_1 and L2L_2 are chosen by the user in parameterization 18, but are set in FSA at the 10th and 90th percentiles of observed LmL_m for the other parameterizations.]
  • Use these results in L=L2g1L1g2L1L2L_\infty=\frac{L_2g_1-L_1g_2}{L1-L2} and K=log[1+g1g2L1L2]K=-log\left[1+\frac{g_1-g_2}{L_1-L_2}\right] from Francis (1988).

In the Wang models β\beta is 0 if there is no individual variation in growth. In my experience a starting value for β\beta near 0, but no 0, is usually sufficient. FSA defaults to use β=0.1\beta=0.1 as a starting value. A starting value for α\alpha of LLmL_\infty-\bar{L}_m is used by noting that if β=0\beta=0 then parameterizations 15 and 16 are equal when α=LLm\alpha=L_\infty-L_m. An average α\alpha can be estimated by using Lm\bar{L}_m for LmL_m. These starting values for α\alpha and β\beta have not been rigorously tested.

Warning

Starting values for parameterization 19 have not been developed for FSA. Starting values for this parameterization will have to be developed by other means.


Gompertz Length-at-Age

FSA provides several parameterizations of the Gompertz function for modeling simple length-at-age data (Table 6).

Table 6: Parameterizations of the Gompertz growth equation for length-at-age data available in FSA.
param Equation
1 E(Lt)=Leea1gitE(L_t) = L_\infty e^{-e^{a_1-g_it}}
2 E(Lt)=Leegi(tti)E(L_t) = L_\infty e^{-e^{-g_i(t-t_i)}}
3 E(Lt)=L0ea2(1egit)E(L_t) = L_0 e^{a_2(1-e^{-g_it})}
4 E(Lt)=Lea2egitE(L_t) = L_\infty e^{-a_2e^{-g_it}}
5 E(Lt)=Le1giegi(tt0)E(L_t) = L_\infty e^{-\frac{1}{g_i}e^{-g_i(t-t_0)}}


New parameters in these growth functions are:9

  • tit_i = age at the inflection point
  • gig_i = instantaneous growth rate at tit_i, the inflection point
  • a1a_1, a2a_2 = nuisance parameters with no biological meaning


SSgompertz() is a self-starting function10 to fit a Gompertz function to data. The parameterization for this function is11

Y=Asymeb2b3X Y = \text{Asym}~e^{-b_2b_3^X}

where YY and XX are the response and explanatory variables, respectively, Asym\text{Asym} is a parameter for the horizontal (i.e., YY) asymptote, b2b_2 is a parameter related to the value of YY at X=0X=0, and b3b_3 is a “parameter related to the scale of the x-axis.”

In growth (in length) modeling, YY is LL (for length), XX is tt (for time as measured by age), and Asym\text{Asym} is clearly LL_{\infty}. Thus, at this point, the Gompertz function from SSgompertz() can be re-written for the purposes of growth modeling as

L=Leb2b3t(2) L = L_\infty e^{-b_2b_3^t} \qquad(2)

It is not immediately clear how b2b_2 and b3b_3 relate to parameters from common parameterizations of the Gompertz functions used to model fish growth. These will be explained below.

The first parameterization differs from Equation 2 only in the exponent of ee (after the negative). This part of the equation for the first parameterization can be rearranged as follows

e(agit)ea1egit) \begin{align} & e^{(a-g_it)} \\ & e^{a_1}e^{-g_it)} \end{align}

If b2=ea1b_2=e^{a_1} and b3=egib_3=e^{-g_i} then this simplified exponent is the same as the exponent in Equation 2. Thus, gi=log(b3)g_i=-log(b_3) and a1=log(b2)a_1=log(b_2) (and, of course, L=AsymL_\infty=\text{Asym}).

Similarly, the second parameterization also only differs from Equation 2 after the negative in the exponent of ee. Again, simplifying this exponent gives

egi(tti)egit+gitiegitegitiegitiegit \begin{align} & e^{-g_i(t-t_i)} \\ & e^{-g_it+g_it_i} \\ & e^{-g_it}e^{g_it_i} \\ & e^{g_it_i}e^{-g_it} \end{align}

If b2=egitib_2=e^{g_it_i} and b3=egib_3=e^{-g_i} then this simplified exponent is the same as the exponent in Equation 2. Thus, gi=log(b3)g_i=-log(b_3) and ti=log(b2)git_i=\frac{log(b_2)}{g_i}.

There is no asymptote in the third parameterizations, so the entire function must be manipulated to show equivalence to Equation 2.

L0ea2(1egit)L0ea2a2egitL0ea2ea2egit \begin{align} & L_0 e^{a_2(1-e^{-g_it})} \\ & L_0 e^{a_2-a_2e^{-g_it}} \\ & L_0 e^{a_2}e^{-a_2e^{-g_it}} \\ \end{align} If L=L0ea2L_\infty=L_0e^{a_2}, b2=a2b_2=a_{2}, and, again, b3=egib_3=e^{-g_i} then the third parameterization is equivalent to Equation 2. Thus, a2=b2a_2=b_2, gi=log(b3)g_i=-log(b_3), and L0=Lea2L_0=\frac{L_\infty}{e^{a_2}}.

The fourth parameterization is equal to Equation 2 if b2=a2b_2=a_2 and b3=egib_3=e^{-g_i}. Thus, again a2=b2a_2=b_2 and gi=log(b3)g_i=-log(b_3) (and, of course, L=AsymL_\infty=\text{Asym}).

The fifth parameterization includes t0t_0 which appears to be defined, as in the von Bertalanffy function, as the age where the mean length is zero (i.e., the x-intercept). The three-parameter Gompertz function used here has a lower asymptote at L=0L=0 and, thus, does not have an x-intercept. Therefore, it is not exactly clear what t0t_0 is. However, again, the exponent of ee (after the negative) of the fifth parameterizations can be rearranged

1giegi(tt0)1giegit+git01giegitegit01giegit0egit \begin{align} & \frac{1}{g_i}e^{-g_i(t-t_0)} \\ & \frac{1}{g_i}e^{-g_it+g_it_0} \\ & \frac{1}{g_i}e^{-g_it}e^{g_it_0} \\ & \frac{1}{g_i}e^{g_it_0}e^{-g_it} \end{align}

If b2=1giegit0b_2=\frac{1}{g_i}e^{g_it_0} and b3=egib_3=e^{-g_i}, then this simplified exponent is the same as the exponent in Equation 2. Thus, gi=log(b3)g_i=-log(b_3) and t0=log(b2gi)git_0=\frac{log(b_2g_i)}{g_i} (and, of course, L=AsymL_\infty=\text{Asym}).

These findings are summarized in Table 7.


Table 7: Conversion from SSgompertz() parameters (Asym\text{Asym}, b2b_2, and b3b_3) to parameters for the common Gompertz parameterizations used to model fish growth in FSA.
param LL_\infty L0L_0 gig_i tit_i t0t_0 a#a_{\text{\#}}
1 Asym\text{Asym} log(b3)-log(b_3) log(b2)log(b_2)
2 Asym\text{Asym} log(b3)-log(b_3) log(b2)gi\frac{log(b_2)}{g_i}
3 Leb2\frac{L_\infty}{e^{b_2}} log(b3)-log(b_3) b2b_2
4 Asym\text{Asym} log(b3)-log(b_3) b2b_2
5 Asym\text{Asym} log(b3)-log(b_3) log(b2gi)gi\frac{log(b_2g_i)}{g_i}


The equivalency of the parameterizations and the starting values across parameterizations is shown in Figure 2.

Figure 2: All parameterizations of the Gompertz growth functions evaluated at starting values derived from the parameters of SSgompertz (Asym\text{Asym}=450, b2b_2=2.5, and b3b_3=0.75). The linewidth decreases from the first to last parameterization (and the color differs) to show how the curves are plotted on top of each other.


Gompertz Tag-Recapture

Still other parameterizations of the Gompertz model are used with tag-recapture data (Table 8).

Table 8: Parameterizations of the Gompertz growth equation for length at tag and recapture data available in FSA.
param Equation
6 E(LrLm)=L[LmL]egiδtLmE(L_r-L_m)=L_{\infty}\left[\frac{L_m}{L_{\infty}}\right]^{e^{-g_i\delta t}}-L_m
7 E(Lr)=L[LmL]egiδtE(L_r)=L_{\infty}\left[\frac{L_m}{L_{\infty}}\right]^{e^{-g_i\delta t}}


Warning

Starting values for the tag-recapture growth models have not been developed for FSA. Starting values for these parameterizations will have to be developed by other means.


Logistic Length-at-Age

FSA provides several parameterizations of the logistic function for modeling simple length-at-age data (Table 9).

Table 9: Parameterizations of the logistic growth equation for length-at-age data available in FSA.
param Equation
1 E(Lt)=L1+eg(tti)E(L_t) = \frac{L_\infty}{1+e^{-g_{-\infty}(t-t_i)}}
2 E(Lt)=L1+aegtE(L_t) = \frac{L_\infty}{1+ae^{-g_{-\infty}t}}
3 E(Lt)=L0LL0+(LL0)egtE(L_t) = \frac{L_0L_\infty}{L_0+(L_\infty - L_0)e^{-g_{-\infty}t}}


The response variable, LL, is the mean length and the explanatory variable, tt is age. Parameters in these growth functions are:12

  • gg_{-\infty} is the instantaneous growth rate at t=t=-\infty
  • aa = nuisance parameters with no biological meaning


SSlogis() is a self-starting function13 to fit a logistic function to data. The parameterization for this function is14

Y=Asym1+exmidinputscal Y = \frac{\text{Asym}}{1+e^{\frac{\text{xmid}-\text{input}}{\text{scal}}}}

where YY and input\text{input} are the response and explanatory variables, respectively, Asym\text{Asym} is a parameter for the horizontal (i.e., YY) asymptote, xmidxmid is a parameter for the value of XX at the inflection point, and scalscal is a “parameter on the input axis.”

In growth (in length) modeling, YY is LL (for length), input\text{input} is tt (for time as measured by age), and Asym\text{Asym} is clearly LL_{\infty}. Most likely xmidxmid is tit_i, but it is not clear at this point. Thus, at this point, the R logistic function can be re-written for the purposes of growth modeling as

L=L1+exmidtscal(3) L = \frac{L_\infty}{1+e^{\frac{\text{xmid}-t}{\text{scal}}}} \qquad(3)

Below I show how parameters in the common parameterizations of the logistic function relate to xmid\text{xmid} and scal\text{scal} (and, possibly, LL_{\infty}). It is easier to relate Equation 3 to the Gompertz paramaeterizations if Equation 3 is presented in the more verbose form of

L=L1+exmidtscal=L1+exmidscaltscal=L1+exmidscaletscal(4) \begin{align} L &= \frac{L_\infty}{1+e^{\frac{\text{xmid}-t}{\text{scal}}}} \\ &= \frac{L_\infty}{1+e^{\frac{\text{xmid}}{\text{scal}}-\frac{t}{\text{scal}}}} \\ &= \frac{L_\infty}{1+e^{\frac{\text{xmid}}{\text{scal}}}e^{-\frac{t}{\text{scal}}}} \end{align} \qquad(4)

The only difference between the first parameterization and Equation 3 is in the denominator after the “1+”. This portion of the equation for the first parameterization can be rewritten as

eg(tti)egt+gtiegtegtiegtiegt \begin{align} & e^{-g_{-\infty}(t-t_i)} \\ & e^{-g_{-\infty}t+g_{-\infty}t_i} \\ & e^{-g_{-\infty}t}e^{g_{-\infty}t_i} \\ & e^{g_{-\infty}t_i}e^{-g_{-\infty}t} \end{align}

Comparing this to Equation 4 it is apparent that g=1scalg_{-\infty}=\frac{1}{\text{scal}} and gti=xmidscalg_{-\infty}t_i=\frac{\text{xmid}}{\text{scal}}. The latter can be simplified as

gti=xmidscalti=xmidgscalti=xmidggti=xmid \begin{align} g_{-\infty}t_i &= \frac{\text{xmid}}{\text{scal}} \\ t_i &= \frac{\text{xmid}}{g_{-\infty}\text{scal}} \\ t_i &= \frac{\text{xmid}g_{-\infty}}{g_{-\infty}} \\ t_i &= \text{xmid} \end{align}

Thus, xmid\text{xmid} is the abcissa of the inflection point. Starting values for the first parameterization are thus L=AsymL_\infty=\text{Asym}, g=1scalg_{-\infty}=\frac{1}{\text{scal}}, and ti=xmidt_i=\text{xmid}.

The second paramaterization only differs from Equation 3 in the denominator after the “1+”, and no simplification is needed to notice that g=1scalg_{-\infty}=\frac{1}{\text{scal}} and a=exmidscala=e^{\frac{\text{xmid}}{\text{scal}}}.

The third parameterizations differs more substantively and requires more work. First, rewrite the whole equation by dividing both the numerator and denominator by L0L_0 to get

L=L1+LL0L0egt L = \frac{L_\infty}{1+\frac{L_\infty - L_0}{L_0}e^{-g_{-\infty}t}}

In this form the only difference from Equation 3 is again in the denominator after the “1+”. Again, by comparing this to Equation 4, it is apparent that g=1scalg_{-\infty}=\frac{1}{\text{scal}} and LL0L0=exmidscal\frac{L_\infty - L_0}{L_0}=e^{\frac{\text{xmid}}{\text{scal}}}. This second value is solved for L0L_0 with

LL0L0=exmidscalLL0=L0exmidscalL=L0+L0exmidscalL=L0(1+exmidscal)L1+exmidscal=L0 \begin{align} \frac{L_\infty - L_0}{L_0} &= e^{\frac{\text{xmid}}{\text{scal}}} \\ L_\infty - L_0 &= L_0e^{\frac{\text{xmid}}{\text{scal}}} \\ L_\infty &= L_0 + L_0e^{\frac{\text{xmid}}{\text{scal}}} \\ L_\infty &= L_0\left(1+e^{\frac{\text{xmid}}{\text{scal}}}\right) \\ \frac{L_\infty}{1+e^{\frac{\text{xmid}}{\text{scal}}}} &= L_0 \end{align}

These findings are summarized in Table 10.


Table 10: Conversion from SSlogis() parameters (Asym\text{Asym}, xmid\text{xmid}, and scal\text{scal}) to parameters for the common logistic parameterizations used to model fish growth in FSA.
param LL_\infty L0L_0 gg_{-\infty} tit_i aa
1 Asym\text{Asym} 1scal\frac{1}{\text{scal}} xmid\text{xmid}
2 Asym\text{Asym} 1scal\frac{1}{\text{scal}} exmidscale^{\frac{\text{xmid}}{\text{scal}}}
3 Asym\text{Asym} L1+exmidscal\frac{L_\infty}{1+e^{\frac{\text{xmid}}{\text{scal}}}} 1scal\frac{1}{\text{scal}}


The equivalency of the parameterizations and the starting values across parameterizations is shown in Figure 3.

Figure 3: All parameterizations of the logistic growth functions evaluated at starting values derived from the parameters of SSlogis (Asym\text{Asym}=450, xmid\text{xmid}=2.5, and scal\text{scal}=0.75). The linewidth decreases from the first to last parameterization (and the color differs) to show how the curves are plotted on top of each other.


Richards Length-at-Age

FSA provides several parameterizations of the Richards function for modeling simple length-at-age data (Table 11).

Table 11: Parameterizations of the Richards growth equation for length-at-age data available in FSA.
param Equation
1 E(Lt)=L[11bek(tti)]bE(L_t) = L_\infty\left[1-\frac{1}{b}e^{-k(t-t_i)}\right]^{b}
2 E(Lt)=L(1+ek(tt0))bE(L_t) = L_\infty\left(1+e^{-k(t-t_0)}\right)^{b}
3 E(Lt)=L[1+((L0L)1b1)ekt]bE(L_t) = L_\infty\left[1+\left(\left(\frac{L_0}{L_\infty}\right)^{\frac{1}{b}}-1\right)e^{-kt}\right]^{b}


The response variable, LL, is the mean length and the explanatory variable, tt is age. New parameters in these growth functions are:15

  • kk = growth rate parameter
  • bb = nuisance parameter with no biological meaning


The FlexParamCurve package contains SSposnegRichards() which is a self-starting function for using nls() to fit a “Positive-Negative Richards growth” function to data. This function can fit an 8-parameter curve but if some of the parameters are not used then it is possible to fit a 4-parameter Richards function, a function similar to the Richards parameterizations in FSA. Their “twelfth model” (i.e., modno=12) can be written, using their R function parameters, as

Y=Asym[1+MeK(XInfl)]1M Y = \frac{\text{Asym}}{\left[1+Me^{-K(X-\text{Infl})}\right]^{\frac{1}{M}}} where YY and XX are the response and explanatory variables, respectively, Asym\text{Asym} is a parameter for the horizontal (i.e., YY) asymptote, KK is a “rate parameter”, Infl\text{Infl} is the “inflection point” (i.e., the x-axis position of the inflection point), and MM is a “shape parameter”.

To better match the parameterizations in FSA, the FlexParamCurve function can be re-written as,

Y=Asym[1+MeK(XInfl)]1M Y = \text{Asym}\left[1+Me^{-K(X-\text{Infl})}\right]^{-\frac{1}{M}}

In growth (in length) modeling, YY is LL (for length), XX is tt (for time as measured by age). With these substitutions the (modified) function from FlexParamCurve can be re-written for the purposes of growth modeling as

L=L[1+MeK(tInfl)]1M(5) L = L_\infty\left[1+Me^{-K(t-\text{Infl})}\right]^{-\frac{1}{M}} \qquad(5)

A comparison of Equation 5 to the three parameterizations of the Richards function in FSA clearly shows that L=AsymL_\infty=\text{Asym} and b=1Mb=-\frac{1}{M} for each. Substituting these values, and noting that M=1bM=-\frac{1}{b}, Equation 5 can be written as

L=L[11bMeK(tInfl)]b L = L_\infty\left[1-\frac{1}{b}Me^{-K(t-\text{Infl})}\right]^{b}

This is exactly the first parameterization in FSA if k=Kk=K and ti=Inflt_i=\text{Infl}. In fact, k=Kk=K and ti=Inflt_i=\text{Infl} in the other parameterizations.

If t0t_0 is the value of tt when L=0L=0 then plug 0 into Equation 5 and solve for tt as follows16

0=L[1+MeK(tInfl)]1M0=1+MeK(tInfl)1M=eK(tInfl)log(1M)=K(tInfl)log(1M)K=tInflInfllog(1M)K=t \begin{align} 0 &= L_\infty\left[1+Me^{-K(t-\text{Infl})}\right]^{-\frac{1}{M}} \\ 0 &= 1+Me^{-K(t-\text{Infl})} \\ -\frac{1}{M} &= e^{-K(t-\text{Infl})} \\ log\left(-\frac{1}{M}\right) &= -K(t-\text{Infl}) \\ -\frac{log\left(-\frac{1}{M}\right)}{K} &= t-\text{Infl} \\ \text{Infl}-\frac{log\left(-\frac{1}{M}\right)}{K} &= t \end{align} or, alternatively, t0=tilog(b)kt_0=t_i-\frac{log(b)}{k}.

In the third parameterization L0L_0 is defined as the mean length when t=0t=0. Thus, plug t=0t=0 into Equation 5 and solve for LL to see that L0=L[11bekti]bL_0=L_\infty\left[1-\frac{1}{b}e^{kt_i}\right]^{b}.

These findings are summarized in Table 12.

Table 12: Conversion from SSposnegRichards() parameters (Asym\text{Asym}, Infl\text{Infl}, KK, and MM) to parameters for the common Richards parameterizations used to model fish growth in FSA.
param LL_\infty L0L_0 kk tit_i t0t_0 bb
1 Asym\text{Asym} KK Infl\text{Infl} 1M-\frac{1}{M}
2 Asym\text{Asym} KK Infllog(1M)K\text{Infl}-\frac{log\left(\frac{1}{M}\right)}{K} 1M-\frac{1}{M}
3 Asym\text{Asym} Asym[1+MeK×Infl]1M\text{Asym}\left[1+Me^{K\times\text{Infl}}\right]^{-\frac{1}{M}} KK 1M-\frac{1}{M}


The equivalency of the parameterizations and the starting values across parameterizations is shown in Figure 3.

Figure 4: All parameterizations of the Richards growth functions evaluated at starting values derived from the parameters of SSposnegrichards (Asym\text{Asym}=450, Infl\text{Infl}=2.5, KK=0.5, MM=0.1). The linewidth decreases from the first to last parameterization (and the color differs) to show how the curves are plotted on top of each other.


Schnute Length-at-Age

Schnute (1981) proposed a model for fish growth that can represent the von Bertalanffy, Gompertz, logistic, and Richards functions, along with others. The model has the following four parameters

  • L1L_1 = expected length at (a relatively young) age t1t_1
  • L3L_3 = expected length at (a relatively old) age t3t_3
  • aa = a shape parameter that is inversely related to width of the “arc” before an inflection point
  • bb = a shape parameter this is related to the ratio of the height of the “arcs” before and afer the inflection point

Starting values for L1L_1 and L3L_3 are easily obtained as the mean observed lengths at ages t1t_1 and t3t_3. However, I am unaware of any robust methodological method for developing starting values for aa and bb. Descriptions in Schnute (1981) suggest that aa is equal to KK from the von Bertalanffy or kk from the Richards, if growth is shaped like those functions. A good “wild guess” at KK and kk is 0.3, so FSA used 0.3 as an ad hoc “wild guess” starting value for aa. Further discussion in Schnute (1981) of the shape of growth trajectories relative to aa suggests that aa is likely not negative for most fisheries length-at-age data.

No similar observations were made with respect to bb from reading Schnute (1981). Limited personal experience suggests that using a starting value for bb are fickle. For cases 1 and 2, a “small” bb tends to work, so a starting value of 0.5 is used for bb in FSA. For case 3, a “larger” bb is needed, so a staring of 3.0 is used for bb in FSA. These starting values are “wild guess” at best and are unlikely to work in all (or even nost) situations. See the examples at the end of this article for how to manually choose starting values with FSA.

Finally, it seems that the automatic generation of stating values algorithm tends to work better if t1t_1 is very near, if not the actual, youngest observed age. In contrast, t3t_3 seems to work better if it is near the start (i.e., younger age) rather than the end of the asymptote.


Finding Starting Values in FSA

In FSA versions >0.9.6, findGrowthStarts() can be used to find the starting values described here. This function has four main parameters. The first two are a formula of the form length~age and data= which contain the length and age data from which the starting values will be derived. Additionally, use type= to choose the type of growth function to be used (i.e., "von Bertalanffy", "Gompertz", "logistic", or "Richards") and param= to choose the particularly parameterization for the model by the number shown in Table 1, Table 4, Table 6, Table 9, and Table 11.

For example, suppose that length-at-age data similar to that shown below is available in a data.frame named df.

#>  age tlV
#>    0  61
#>    2 237
#>    3 287
#>    4 312
#>    7 430
#>   15 435

The starting values for the first parameterization of the von Bertalanffy model could be obtained as below.

( sv1 <- findGrowthStarts(tlV~age,data=GrowthData1,type="von Bertalanffy",param=1) )
#>        Linf           K          t0 
#> 454.4806075   0.2974555  -0.4752262

It is also possible to declare the model parameterization with a “name.”17

( sv1 <- findGrowthStarts(tlV~age,data=GrowthData1,type="von Bertalanffy",pname="Typical") )
#>        Linf           K          t0 
#> 454.4806075   0.2974555  -0.4752262

There may be times when the provided starting values are non-sensical (you may get a warning message) or they do not lead to model convergence when fitting the non-linear regression to data. In these instances it may be useful to view a quick diagnostic plot of how the model evaluated at the starting values “fits” the data. Such a plot can be made by including plot=TRUE in findGrowthStarts().

sv1 <- findGrowthStarts(tlV~age,data=GrowthData1,type="von Bertalanffy",param=1,
                        plot=TRUE)

Additionally, it may be useful to “fix” some starting values at values of your choice (rather than having them determined from the data). Such parameters can be included in a NAMED vector given to fixed= in findGrowthStarts(). For example, the K parameter is fixed at 0.5 below.

( sv2 <- findGrowthStarts(tlV~age,data=GrowthData1,type="von Bertalanffy",param=1,
                          fixed=c("K"=0.5)) )
#>        Linf           K          t0 
#> 454.4806075   0.5000000  -0.2827173

Some parameterizations of the von Bertalanffy require the user to choose values for certain constants. For example, param=7 requires you to choose a “young” age for t1 and an “older” age for t2. These constants should be set in a NAMED vector that is given to constvals= in findGrowthStarts().

( sv3 <- findGrowthStarts(tlV~age,data=GrowthData1,type="von Bertalanffy",param=7,
                          constvals=c("t1"=1,"t3"=13)) )
#>          L1          L3           K 
#> 161.4312295 446.2251430   0.2974555

Of course, all of these optional arguments may be used together.18

sv4 <- findGrowthStarts(tlV~age,data=GrowthData1,type="von Bertalanffy",param=7,
                        constvals=c("t1"=1,"t3"=13),fixed=c("K"=0.5),plot=TRUE)

Of course, similar code is used for the other growth models (and parameterizations).

( sv5 <- findGrowthStarts(tlV~age,data=GrowthData1,type="Gompertz",param=2) )
#>        Linf          gi          ti 
#> 443.5949291   0.4521523   1.1615297

It is important to note that these are examples of find the starting values only. These starting values would then be provided to a nonlinear model fitting algorithm (e.g., nls()) to find the best-fit parameter estimates. This is demonstrated more thoroughly elsewhere, but below is a quick example using the starting values for first parameterization of von Bertalanffy derived above.

vonb1 <- makeGrowthFun(type="von Bertalanffy")
rvb1 <- nls(tlV~vonb1(age,Linf,K,t0),data=GrowthData1,start=sv1)
coef(rvb1)
#>        Linf           K          t0 
#> 456.0374952   0.2932701  -0.4848237