Gompertz growth for Pacific saury and the long spawning season

37 views
Skip to first unread message

Larry Jacobson

unread,
Dec 2, 2024, 8:32:33 PM12/2/24
to SS3 - Forum

a) I need to use a Gompertz growth curve for Pacific saury in SS3.  As explained in the user’s manual, Gompertz is a special case of the Richards curve but with b=0 and using a different equation to avoid dividing by zero.  Trouble is, there does not seem to be a GrowthModel switch for this option in the control file (see below). Does the code switch to the alternate equation if it sees b=0?  Is the correct id for Gompertz undocumented?  Perhaps Gompertz hasn’t been programmed yet?


2 # GrowthModel: 1=vonBert with L1&L2; 2=Richards with L1&L2; 3=age_specific_K_incr; 4=age_specific_K_decr; 5=age_specific_K_each; 6=NA; 7=NA; 8=growth cessation


b) The Gompertz equation in the user’s manual says ln(ysub2 / y - 1) but the y’s are not defined.  For clarity, it might be possible to use the same symbols for Richards and Gompertz (e.g. y_sub_2 is Linfinity?). 

c) I be using Rick Methot's idea for spreading the spawning season out over seasons and subseasons.  A prolonged spawning season is realistic and absolutely necessary for fitting the length comp data.

Thanks and cheers!

Arni Magnusson

unread,
Dec 5, 2024, 2:06:29 AM12/5/24
to SS3 - Forum
a) To use the Gompertz growth function in Stock Synthesis, select Richards and fix the shape parameter at a small value such as b=0.0001.

b) Both equations in the user manual covering Richards (and Gompertz) growth have errors in them, which are currently being fixed.

The correct equation for Schnute (1981, Eq. 15) parametrization of Richards growth is
richards.png
and it produces a Gompertz curve when b is assigned a small value such as 0.0001. Stock Synthesis does not implement b=0 as a special case, but fixing the shape parameter to a small value such as b=0.0001 will apply a Gompertz curve just fine.

To look for sensible values of k and b for a given dataset, this R function can be helpful:

schnute <- function(t, L1, L2, k, b, A1, A2)
{
  (L1^b + (L2^b-L1^b) * (1-exp(-k*(t-A1))) / (1-exp(-k*(A2-A1))))^(1/b)
}

See today's pull request for more details and related links.

Quang Huynh

unread,
Sep 15, 2025, 8:39:31 PM (4 days ago) Sep 15
to SS3 - Forum
I'm continuing Larry's work on the Pacific saury model with the Richards growth function. 

With constant growth,  the ss3_code() function from Arni's vignette matches Len_Beg in the endgrowth output as expected.

I want to explore time-varying growth where the asymptotic length (L2 with A2 = 999) is adjusted by an environmental variable. However, the length at age calculated with ss3_code() with parameters from MGparm (report:7 in Report.sso) no longer match Len_Beg values in endgrowth (report:47). There's also a bump in the length at the max age which didn't exist with constant growth (I set no growth above maxage, decay parameter = -998). 

What could be going on?



 Rplot.png

Rick Methot

unread,
Sep 15, 2025, 10:29:00 PM (4 days ago) Sep 15
to Quang Huynh, SS3 - Forum
Hi,
Here are a couple of ideas, but I may need to see the full output to be sure.
1.  Growth is dynamic over time.  FIsh grow from their current size-at-age towards the current year's Linf at a rate governed by the current year's K.  So, length-at-age in the final year depends upon the time history of the growth parameters, not the growth parameter values in the final year.

2.  If Linf > length@age at the oldest age, then whether or not you have time-varying growth affects the time series of length at age in the accumulator age.  That length-at-age is the numbers-weighted average of the fish already in the plus group with their growth, with the length of the fish just graduating into that group.  That averaging happens when there is time-varying growth, but I never got around to adding code to doing it even when there are constant growth parameters.  If you suspect this is an issue, one solution is to increase maxage so fish are closer to Linf as they age, or to trick SS3 into acting as if there is time-varying growth when there isn't.  

Rick


--
You received this message because you are subscribed to the Google Groups "SS3 - Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ss3-forum+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/ss3-forum/8a3130be-c449-410b-beed-87458c8533fdn%40googlegroups.com.
Message has been deleted

Quang Huynh

unread,
9:43 AM (1 hour ago) 9:43 AM
to SS3 - Forum
Hi Rick, 

Thanks for the helpful info about how growth is incremented for each cohort. 

For (1), what I'm seeing is that the growth is changing in the model earlier than I want. The environmental variable that adjusts L_at_Amax_Fem_GP_1 is zero until time step 93 (this is a season as years model), so I expected constant growth before then, yet growth is starting to change in year 3 and reaches a new set of numbers by year 6. Below is the screenshot of Report.sso comparing the annual parameters vs. length at age. The length at age in years 1 and 2 are what I expect from the base growth parameters and I want those values until year 93. I'm not sure where the values in year -2 come from, but are they relevant to the problem at hand?

For (2), I notice that the mean size at the max age never changes from the base value of 30.7079 with the decay parameter set to -998, so SS3 seems to be using the original asymptotic length. What I want is the length to be closer to the 'new' asymptotic length in any given year. This species has a longevity of 2 years (annual age 0 and 1), so ideally the plusgroup will have minimal impact on the population dynamics. Would a decay parameter set to Z = 999 also be the way to eliminate the build-up in growth from previous years to the plus group average size?

Quang


screenshot.png


Reply all
Reply to author
Forward
0 new messages