Description of Model Equations
c_model_equations.RmdThe Stochastic Population over Regional Components
(SPoRC) model is a generalized integrated population model
written in RTMB (R bindings for Template Model Builder;
Kristensen et al., 2016) that supports age, sex, population, seasonal,
and spatially-structured dynamics. Population dynamics operate across an
annual time step that is further subdivided into
seasons of duration
(where
).
Within each annual-seasonal cycle, processes occur in the following
order:
- Recruitment generally occurs in the first season, with additional recruits apportioned to subsequent seasons according to seasonal proportions. The exception is age-0 recruitment (no lag between spawning and recruitment; see Recruitment Processes below), where recruits instead enter no earlier than the spawning season,
- Markovian movement of individuals (movement only occurs in the spatial model) and total mortality both act within the season; at the end of the final season, individuals advance in age.
How movement and mortality are sequenced within step 2 is a user
choice, set by move_timing: movement then mortality
(0, the default and the historical SPoRC
behavior), mortality then movement (1), or the two acting
simultaneously and continuously (2). This choice is not
confined to the projection equations. It propagates to every quantity
whose value depends on where fish are partway through a season, spawning
biomass, catch-at-age, fishery and survey indices, tag recaptures,
equilibrium initialization, and per-recruit reference points, and each
of those is given below. The three options coincide exactly when total
mortality is constant across regions, when mortality is zero, and when
movement is absent, so single-region models are unaffected by the
setting.
Tag releases occur simultaneous to recruitment in the release year and season (i.e., recruits can be tagged), and tag recaptures are computed each season.
These processes are modeled across five primary partitions: population (), region (), year (), season (), age ( and , where is the plus group), and sex (). In single-population, single-region and/or single-sex models, these equations generally reduce by setting , and/or . In general, the same equations are used for both simulation and estimation.
Process Equations
Population Initialization
In SPoRC, three primary methods exist to initialize the
equilibrium population of the model. The first method derives the
equilibrium population using the following process:
The initialization fishing mortality
is derived from a single parameter
(init_F_par), in one of two forms set by
init_F_form:
Under "prop" the initialization F is a proportion of the
mean fishing mortality, bounded to
by the inverse-logit, so the initial age structure moves with
.
Under "abs" it is an absolute rate and is independent of
.
Whether
is estimated is set separately by init_F_spec
("fix" or "est"), so all four combinations are
available.
The distinction matters whenever the initial condition is fished.
Catch constrains only the product of numbers-at-age and fishing
mortality, so under "prop" a single parameter both depletes
the initial age structure and scales the F series: the optimizer can fit
the observed catch equally well with a smaller, harder-fished stock. Use
"abs" when the historical fishing mortality that shaped the
initial condition is conceptually distinct from the mean F of the
modeled period, for example when bridging an assessment that has its own
separate historical F parameter.
where:
- are the equilibrium numbers-at-age,
- is a global recruitment parameter used to scale the equilibrium age structure during initialization. Users have the option to either initialize the population using the same recruitment parameter that governs the stock-recruit relationship (either virgin or mean recruitment depending on the parameterization), or to estimate a separate recruitment scalar exclusively for initialization The latter is useful when the historical mean recruitment used to initialize the population differs from the virgin recruitment implied by the stock-recruit relationship, or when the assumption that the population was at unfished equilibrium at the start of the time series is not appropriate.
- is the initial instantaneous total mortality rate,
- is the instantaneous natural mortality rate,
- is the log-mean fishing mortality rate for fleet in region and season ,
- is the initialization fishing mortality for fleet , either a proportion of the mean fishing mortality or an absolute rate (see below),
- is an indicator variable equal to 1 if fleet is active in region and season in year 1, and 0 otherwise,
- is the total fishery selectivity-at-age for fleet ,
- is the retention selectivity-at-age for fleet ,
- is the discard mortality rate for fleet in region and season ,
- is the number of fishing fleets,
- describes the recruitment sex-ratio,
- apportions the global recruitment parameter across regions (estimated using a multinomial logit transform to ensure proportions sum to one).
Because the equilibrium calculation above is a purely deterministic
(non-stochastic) projection,
is treated as the median of the assumed lognormal recruitment process
(consistent with how
is interpreted elsewhere; see Recruitment Processes), and the same
lognormal bias-correction term used for recruitment deviations is
applied here as a static offset rather than about an estimated
deviation. This keeps the equilibrium age structure on a scale
consistent with the rest of the recruitment process even though no
annual deviation is estimated at initialization. The same correction is
applied when the operating model constructs an equivalent equilibrium
seed during closed-loop simulation (Setup_Sim_Rec()’s
rinit_input pathway), so fitted and simulated equilibria
remain on a consistent scale.
The plus group () of the initial population is then computed as:
However, this scalar geometric series solution assumes that the plus group accumulates in a closed system. Therefore, when movement dynamics are present, this solution does not correctly accumulate individuals into the plus group.
To address this, additional methods are provided to explicitly incorporate movement dynamics into the plus group calculation. In particular, the initial population can be derived by iterating the population to equilibrium. An exponential decay model is used to first initialize the age structure at the first iteration:
The initialized age structure is then iterated forward to equilibrium
by applying recruitment, followed by the seasonal transition (movement
and mortality) and ageing. That transition is the same operator
used by the main projection, so equilibrium initialization inherits
whatever move_timing sequencing the model is configured
with (see Population Projection section for equations).
While the iterative method correctly accumulates the plus group when
movement is present, it can be computationally inefficient. Therefore,
SPoRC enables users to compute the plus group using the
matrix formulation of the geometric series, which correctly accounts for
movement processes. Let
denote the seasonal transition operator of the Population Projection
section evaluated at the equilibrium mortality
,
and define the year-long transition for age
by composing seasons in order (season 1 applied first, hence
rightmost):
The transposes appear because is stored in the row-vector convention used above, whereas the recursion below is written as a column operator acting on . The population is projected forward to the penultimate age (), and the penultimate age is then projected forward through one more year:
where represents the culmination of processes applied to the penultimate age. plays the role of the survival ratio in the scalar series, representing the combined effects of survival and movement on the plus group over a full year, so the plus group solution incorporating movement is:
Under
and a single season,
is
.
When only a single region is modeled or no movement occurs (i.e., an
identity matrix), the matrix formulation simplifies to the standard
scalar geometric series solution under every
move_timing.
Following the definition of equilibrium age structure, initial age deviations can be applied:
where represents the numbers-at-age in the first model year and season except for recruits (). These values can be treated as a stochastic process by applying multiplicative lognormal deviations to the initial equilibrium age structure. Note that the index is introduced because users can determine whether initial age deviations are estimated up to the penultimate age class, or across all classes including the plus group.
Finally, the initial age structure can be specified as fully free
(init_age_strc = "free"), in which case no equilibrium is
projected at all. The deviations are then the initial numbers themselves
rather than multipliers on an equilibrium:
with the first age still taken from the recruitment process. Because the deviations are on the scale of log-numbers rather than log-ratios about an equilibrium, the initial condition has no information about or the assumed initial fishing mortality; any penalty applied to under this option acts as a prior on log initial abundance directly. This matches the convention of assessments in which initial numbers-at-age are freely estimated parameters rather than deviations from an equilibrium.
The initial age deviations have a sex dimension governed by
InitDevs_sex_spec. Under "est_shared_s" (the
default) one age curve
is read by every sex. Under "est_all" each sex has its own
curve
,
which under the free option gives
Recruitment Processes
SPoRC holds recruitment either about a mean parameter or
on a stock-recruit curve. Recruitment can be specified to arise about a
mean parameter
():
where are annual, lognormally distributed recruitment deviations with a lognormal bias correction term (), with representing the bias correction ramp from Methot and Taylor (2011), and is the proportion of annual recruitment assigned to season for population (with ). For seasons , recruits are added to the existing numbers at age 1:
where is the total annual recruitment (before seasonal apportionment) for population in region and year .
Recruitment can also be specified to arise from a Beverton-Holt stock recruitment function to invoke density-dependent population dynamics, following the steepness parameterization (Mace and Doonan, 1988). Localized density-dependent recruitment is defined as:
while global density-dependent recruitment can be defined as:
where under this parameterization is the virgin unfished recruitment for population , (or ) is the steepness parameter representing the fraction of that would be produced when at 20% of (or ). The steepness parameter is constrained to be between values of 0.2 and 1 and are estimated in bounded logit space. is a derived variable that represents the unfished spawning stock biomass. is the spawning stock biomass for population in region , and is the effective spawning stock biomass (see Spawning Biomass section below).
A Ricker stock-recruit relationship can alternatively be specified
(rec_model = "ricker_rec"), written in a depletion form.
For localized density dependence:
with the global form defined analogously by replacing the regional spawning biomass and with their sums across regions. The log-slope is derived from steepness as:
so the curve passes through by construction and holds the same compensation ratio as a Beverton-Holt at the same . This is not the textbook steepness definition : the Ricker here yields , which exceeds and is not bounded above by 1. Steepness values are therefore not interchangeable between the Beverton-Holt and Ricker forms, and a steepness prior calibrated for one should not be reused for the other without translation.
For both stock-recruit forms, every input to unfished spawning
biomass per recruit, and hence to
and the scale of the curve, is taken from a single reference year set by
SR_ref_yr: weight-at-age, maturity, natural mortality,
movement, stray rate, sex ratio, and the selectivity, discard mortality
and continuous-movement rate that enter through
.
The operating model uses the same reference year, so a simulation
self-test compares like with like. The default is the first model year,
which is the model’s long-standing behavior; setting
SR_ref_yr to the terminal year conditions the curve on
terminal-year biologicals instead, a convention several assessments use.
With time-varying weight-at-age the two choices imply different
and therefore different depletion scales.
SR_ref_yr fixes the per-recruit part. The
that turns spawning biomass per recruit into
is the year’s own value,
,
and it is the same
that appears in the curve’s numerator. The two cannot be taken from
different years: steepness is defined as recruitment at
as a fraction of
,
so if
were built from one
and the numerator from another, the unfished state would no longer be a
fixed point of the curve and
would lose its meaning. With R0_blocks at 5 then 12 and
,
taking
from the first block while the numerator uses the second returns 12.8 at
the unfished biomass the second block implies, rather than 12.
This matters only when
has time blocks. There a block rescales the whole curve:
moves with it, so depletion and any reference point built on the curve
step at the block boundary. Under rec_model = "mean_rec"
the question does not arise, since
is mean recruitment and no curve is formed. When a curve is fitted as a
penalty on mean-recruitment residuals instead (sr_penalty
with sr_R0_spec = "shared"), its scale is the single
R0_ref_block value rather than the year’s, so that curve
stays put while the blocked
moves the recruitment.
The spawning stock biomass is the product of numbers-at-age, spawning weight-at-age, and maturity-at-age for females in the spawning season :
where is the numbers-at-age propagated from the start of the spawning season to the spawning point within it. That propagation depends on how movement and mortality are sequenced and is defined in the Spawning Biomass Timing section below. Under the default it is simply evaluated after that season’s movement has been applied, which is the familiar form.
For single-sex models, SSB is multiplied by 0.5 to obtain female-only spawning biomass.
Note that
denotes the delay (in seasons) between spawning and when recruits enter
the population, and is user-specified as
(the classic case above) or
(age-0 recruitment, described below). For
:
if
(i.e. there is not yet enough model history to look back
seasons), SPoRC utilizes the initial equilibrium spawning
biomass instead of
to compute deterministic recruitment. That equilibrium is evaluated at
the initial fishing mortality, so it equals
whenever the model starts unfished.
Stock-Recruit Curve as a Penalty
Under both density-dependent forms above the curve generates
recruitment, which makes
the stock-recruit residual by construction. A third arrangement
(rec_model = "mean_rec" with sr_penalty = "bh"
or "ricker") leaves recruitment arising about the mean
parameter exactly as in the first equation of this section,
where
is the realized total annual recruitment, and evaluates a stock-recruit
curve alongside the dynamics without ever advancing them. The curve
supplies a prediction
(reported as SR_pred, with dimensions population by region
by year) from the Beverton-Holt or Ricker expression given above, driven
by the same
(or
under global density dependence) and with no recruitment deviation.
Numbers-at-age are advanced by
and never by
,
so the deviations remain free about the mean rather than becoming
residuals about the curve. The curve enters the model only through the
log residual
which enters the objective as a penalty (see the Stock-Recruit
Residual section under Process Error Penalties). Note that
is a derived quantity rather than an estimated parameter, which is what
separates this arrangement from the two above: a weakly determined
relationship informs the recruitment series at a cost set by the penalty
instead of dictating it, the convention several existing assessments
use. The two statements are mutually exclusive, and a stock-recruit
penalty requested alongside rec_model = "bh_rec" or
"ricker_rec" is rejected at setup, since the curve already
generates recruitment there and the residual would be penalized
twice.
The scale of the curve, and with it
and the depletion at which the curve is evaluated, is set by
sr_R0_spec:
-
"shared"(the default) takes the scale from , which under mean recruitment is the level of the recruitment series itself. A single parameter has both the recruitment level and the curve, which is better posed than"est", and it anchors the curve on mean recruitment rather than on an unfished level. -
"est"gives the curve its own estimated scale , identified by the curve fit alone. This reproduces templates that have separate mean-recruitment and unfished-recruitment parameters. Nothing ties to , so the two are free to slide against one another. -
"rinit"takes the scale from , the initial equilibrium recruitment of the Population Initialization section, so one parameter sets both the unfished age structure and the curve. This requires a separately estimated initialization recruitment (use_rinit = 1) and is the usual ADMB arrangement.
Age-0 Recruitment ()
When , recruitment for year is driven by that same year’s own spawning biomass rather than a prior year’s. The Beverton-Holt and Ricker equations above still apply, but with (or for global density dependence) in place of , and recruits enter starting at the spawning season rather than season 1, with any remaining seasonal share () added to the existing numbers at age 1 exactly as in the equation above.
Because / is not knowable until season is actually reached within year , this timing constraint is enforced structurally rather than left to the user:
- for every season before (validated at setup; recruits cannot predate the spawning event that produced them), and
- for all (validated at setup; age-0 fish cannot be mature), which guarantees the term in the sum is always zero regardless of whether this year’s recruits have been added to yet at the point is evaluated.
itself is a pure per-recruit, equilibrium quantity and does not depend on which is the same value is used whether recruitment is lagged or age-0. Unlike the case, there is no burn-in substitution of for early years: since , (this year’s own survivor biomass) is always available by the time it is needed, including in year 1.
Because age-0 recruits are inserted in the middle of the spawning
season rather than at its start, move_timing also
determines whether they need a movement step of their own. Under
the season’s movement has already been applied by the time
is evaluated, so recruits inserted immediately afterwards would
otherwise miss it entirely; when
they are therefore given that season’s movement step explicitly, and
they then experience the rest of the season’s mortality like any other
seasonal recruit pulse. Under
1 and 2 movement has not yet occurred at that point in the season, so
the newly inserted recruits are set by the end-of-season transition
along with every other age and no separate catch-up step is applied.
Effective Spawning Biomass and Multi-Population Dynamics
When multiple populations are modeled (), effective spawning biomass at each population’s natal region accounts for stray contributions from other populations:
where is the natal region of population , is the stray rate of population (the fraction of its spawning biomass contributing to non-natal regions), and the sum is taken over all other populations . For a single population, . Note that is the number of populations in a given region, where the contribution of is split evenly among populations.
Single-Season Spawning Movement
When
and
,
a separate spawning movement matrix
is applied to both fished and unfished numbers-at-age prior to computing
spawning biomass quantities, representing natal homing of individuals to
their spawning grounds. It composes with, rather than replaces, whatever
within-season movement move_timing implies: it acts on the
numbers already propagated to the spawning point,
with as defined in the Spawning Biomass Timing section below. The ordering relative to the mortality discount differs by timing, and the two do not commute once movement redistributes fish: under natal homing is applied to the post-movement numbers and the discount is taken afterwards, at the destination region, whereas under 1 and 2 the propagation to the spawning point already has that discount and natal homing is applied to the result.
This additional movement is applied only for spawning biomass calculations and does not alter the numbers-at-age array used for subsequent mortality and movement processes.
Population Projection
Following recruitment processes, the population is projected forward.
In the spatial model, each season advances the population under both
Markovian movement and total mortality. Movement is described by a
first-order Markov matrix
acting on the numbers-at-region vector,
.
In a single-region case, no movement is applied (i.e.,
is an implied identity matrix). For each population, year, season, age,
and sex combination, the movement matrix specifies bulk-transfer
coefficients. Where within the season that transfer happens, before
mortality, after it, or continuously alongside it, is set by
move_timing, and is what the rest of this section makes
explicit.
Movement and mortality are therefore combined into a single seasonal transition operator . Writing for the vector of seasonal total mortality across regions, for seasonal survival, and for the CTMC generator:
where
is the combined movement-mortality generator for the season, expressed in the column convention ( is stored row-wise, hence the transpose). Note that already holds the season duration in both of its terms ( explicitly on the generator, and implicitly in , which is itself a seasonal rate), so the season is parameterized on the unit interval throughout: propagating a fraction of the way through the season means with , and a full season is .
Under (sequential; movement then mortality) individuals move at the start of the season and then experience mortality in the destination region. Under (sequential; mortality then movement) they experience mortality in the origin region and move at the end of the season. Under (continuous) movement and mortality act simultaneously, with the generator and mortality rate combined inside a single matrix exponential; does not appear at all, and this option requires an estimated CTMC generator (). The three coincide when is constant across regions (a scalar multiple of the identity commutes with the generator), when , and when (equivalently ).
For seasons within a year (), individuals advance to the next season at the same age:
At the end of the final season (), individuals advance in age:
When these reduce to the elementwise sequential form, with movement applied first as and mortality applied afterwards as:
If recruits do not move (), and , so reduces to under all three cases.
Where in the Season Each Quantity Is Evaluated
Because resolves movement at a different point in the season under each option, every quantity that is observed partway through a season has to be evaluated consistently. The table below summarizes where each one is taken; the equations follow in the sections indicated.
| Quantity | |||
|---|---|---|---|
| Spawners, | Post-movement location, discounted by mortality | Pre-movement (origin) location, discounted by mortality | Partially redistributed: |
| Catch and discards | Baranov at post-movement location | Baranov at pre-movement location | Season-integrated abundance (spatial Baranov) |
| Fishery index | Post-movement , no discount | Pre-movement , no discount | |
| Survey index | Post-movement , discounted by mortality | Pre-movement , discounted by mortality | Snapshot |
| Tag recaptures | Baranov on the tag cohort | Baranov on the tag cohort | Season-integrated tag abundance |
Under continuous movement, note that the survey index is treated differently from catch and the fishery index. A survey is a snapshot at an instant within the season, so it uses the partial propagation , whereas catch and the fishery index accumulate over the whole season, so they use the integral of that propagation. Under the sequential timings the distinction does not arise, because movement has already been resolved and the fish are stationary for the rest of the season.
Spawning Biomass Timing
Spawning biomass is computed from the population propagated a fraction into the spawning season, consistently with the sequencing:
so spawners are at their post-movement locations under
,
at their pre-movement locations under
,
and partially redistributed under
.
No extra convention is imposed to make the three agree: each timing has
its own natural spawning state, and the
case reproduces the historical SPoRC calculation exactly.
The same
is used for
,
total biomass, and the unfished
(the last with
replaced by natural mortality alone).
Catch Under Continuous Movement
The Baranov catch equation assumes individuals remain in one region for the whole season, which does not hold under . Catch is instead taken from the season-integrated abundance:
The integral runs over the unit interval rather than over because, as noted above, already holds the season duration; is elapsed fraction of the season, not elapsed time.
When the regions decouple and this reduces to , recovering the standard Baranov form used under , which makes explicit that is simply what the familiar factor was always computing, namely the abundance accumulated over the season. The same season-integrated abundance is used for the fishery index and for predicted tag recaptures when movement is specified to be continuous.
denotes the seasonal total instantaneous mortality rate and is defined as the combination of natural mortality () scaled by seasonal duration , retained fishing mortality (), and dead discard fishing mortality ():
Natural mortality has a season index because the rate can differ between seasons, set through the season blocks of . It is a rate per year in every season, so mortality within a season is the rate times that season’s duration, and mortality over the year is the duration-weighted sum . If the rate does not vary within the year that sum is just the rate, since the durations sum to one. The annual quantity is what the equilibrium initial age structure and the plus group geometric series use, since both step a year at a time.
where the retained and dead discard fishing mortality rates at age are:
Here, is the total fishery selectivity (governing encounter probability), is the retention selectivity (governing the probability of retention given encounter), and is the discard mortality rate for fleet . Only the dead fraction of discards contributes to total mortality. The seasonal instantaneous fishing mortality rate is defined as:
where is parameterized based on lognormal deviations ( about a mean fishing mortality parameter for a given region, season, and fishery fleet (). When no catch data are available for a given region, season, and fleet, fishing mortality is set to zero.
Under the default ln_F_mean_spec = "est" the mean is
estimated and the deviations are departures from it.
ln_F_mean_spec = "fix" instead fixes the mean at its
starting value (zero on the log scale unless supplied), so that
and the deviations are annual log fishing mortality outright,
estimated as free parameters. Because the deviation penalty is then the
only statement about the level of
,
this parameterization must be paired with a penalty that leaves the
level free: Fdev_pen_center = "own_mean" (deviations
penalized about their own mean), Fdev_model = "rw" (only
increments penalized), or Use_F_pen = 0. An
"iid" or "ar1" penalty centered on the fixed
zero mean would shrink the deviations toward
,
so that combination is rejected at setup.
The discard mortality rate is parameterized analogously via logistic deviations about a mean logit-scale discard mortality rate:
where is the logit-scale mean discard mortality rate and are annual deviations. The discard mortality rate is bounded between 0 and 1.
State-Space Numbers at Age
By default the numbers at age past the first are whatever the
mortality and ageing step produces, and the only stochastic elements in
the population are recruitment and the initial age structure. Setting
NAA_re to anything other than "none" replaces
that with a state-space treatment: the log numbers at age themselves
become estimated quantities for ages two and older, and the
deterministic step becomes a prediction they are penalized against.
Write for what the mortality, movement and ageing step of the previous section produces at the start of season of year , with the plus group already accumulated when . The state replaces it outright, and the difference between them is the process error:
Season one is the year boundary, so a state there is an innovation on
the whole annual step, ageing and plus group included. A state in a
later season sits on the within-year survival and movement step alone,
where no ageing happens. The purely annual state is
NAA_re_seasons = "annual", which keeps only
and leaves the numbers deterministic between seasons; it is the default
and the special case, not a separate model.
This is a centered parameterization: the state is the level rather than a deviation multiplying a value the model still computes deterministically, which is what separates it from . The distinction matters beyond residual tracking. Because at one boundary depends on the states at that boundary and the one before it and on nothing earlier, each term of the resulting prior is supported on a two-step block, and the random-effects Hessian is block-tridiagonal in that step: in year under the annual state, and in season once every season has one. A deviation parameterization, where the level is reconstructed by accumulating shocks, gives a dense Hessian instead.
The unfished numbers at age take the same realized difference,
so the unfished reference stays on the same trajectory without a random effect of its own, and quantities derived from it such as remain comparable to their fished counterparts. Anything else that advances numbers at age in parallel with the population is rescaled by the same factor, the tagged cohorts above all, since tagged fish are a subset of the population and the innovation is read as unmodelled mortality acting on tagged and untagged alike.
Three parameterizations partition the numbers at age rather than overlapping. Age one is recruitment in every year and belongs to . Year one at ages two and older is the initial age structure and belongs to . The state covers ages two and older in years two onward, including the plus group. The plus group is not optional: it is the only cell whose influence never decays, because it accumulates every historical cohort and never resets, so leaving it deterministic gives up the conditional independence the state is worth having for.
The active ages and years can be narrowed with
NAA_re_ages and NAA_re_years, each of which
must be a contiguous run, and the active seasons with
NAA_re_seasons, which need not be: the season dim is only
ever independent or unstructured and neither reads adjacency. Outside
them the numbers at age are the deterministic prediction, exactly as
they are when NAA_re is "none".
The state runs over the assessment years. It is not projected:
numbers past the terminal year advance deterministically in
Do_Population_Projection(), with recruitment the only
stochastic element.
Whether to give the seasons their own states is a question about data. Within a year there is no ageing, so nothing separates one season’s state from the next except the observations assigned to them; a season with no data returns its prior as its posterior, and the seasons that do have data trade against it. Selecting only the seasons that have observations is what the arbitrary season set is for.
Movement Processes
Movement processes can be parameterized as either an unstructured Markov process (discrete-time Markov) or as a Continuous-time Markov chain (CTMC) process. Movement parameterized as an unstructured Markov process is estimated using a multinomial logit link function, with free parameters per stratum:
where the reference region is set as . Under this parameterization, movement fractions can be estimated independently for each stratum , or grouped into blocks to reduce the number of parameters.
Alternatively, movement can be specified as a continuous-time Markov chain (CTMC) process, which decomposes into diffusive and taxis components. Diffusive processes represent undirected movement of individuals, while taxis processes represent directed movement toward more preferred habitat. This CTMC movement parameterization is governed by an adjacency matrix (), which defines neighboring regions that can receive individuals within a given time step. Diffusive processes are given by:
where represents diffusion, is the log diffusion rate, scales the log diffusion rate, such that smaller regions have higher diffusion rates, and in the second equation indexes all destinations except the source to ensure that the rows of the matrix sum to 0, thereby conserving abundance. Taxis processes (preference) can then be written as:
Here, represents the taxis (preference) component of movement. Equation 1 determines local differences in the habitat preference function, , while equation 2 ensures that the rows of the matrix sum to 0, conserving abundance.
Habitat preference can be defined flexibly as a combination of linear effects and basis splines:
where are the estimated effects (incorporating linear or spline effects), and is the design matrix.
Diffusive and taxis processes can then be combined to construct a generator matrix:
Here, represents instantaneous movement rates. The generator matrix is Metzler, such that all off-diagonal elements satisfy:
Under the sequential timings ( 0 and 1), the instantaneous movement matrix is converted to movement fractions using the matrix exponential:
where
is the duration of the movement interval. When
ctmc_scale_by_seasdur = 1 (default),
is an annual rate and
,
so the generator and
share time units; when 0,
irrespective of season duration.
Every exponential above, here and in the
operators, is evaluated according to move_expm_nsub. The
default 0 takes it exactly. A value a power of two
instead applies
implicit (backward Euler) steps,
which is the Pade(0,1) approximant and is first order in . It exists because the reverse-mode derivative of a linear solve is another solve, while that of a matrix exponential is much more costly, so the gradient is several times cheaper. Because is a non-singular M-matrix its inverse is non-negative, and with the columns sum to one exactly, so movement fractions remain a valid transition matrix at any . The approximation is not free, though: at survival is rather than , and simulation testing puts the resulting bias in the estimated diffusion rate at roughly 12%, biased high.
Under
this exponential is never taken on its own. The generator enters the
seasonal operator together with mortality, as
,
which does not factor into a movement matrix times a survival matrix
unless
is constant across regions.
is still computed and reported, but as a diagnostic, the movement
fractions that would apply in the absence of spatially varying
mortality, rather than as a term in the dynamics.
ctmc_scale_by_seasdur is forced to 1 in this
case, since combining an unscaled generator with seasdur-scaled
mortality inside a single exponential is dimensionally inconsistent.
Continuous movement also requires an estimated generator: it is
available only for
with
.
Unstructured multinomial-logit movement supplies transition fractions
with no guaranteed real generator behind them (the Markov embedding
problem), so SPoRC rejects the combination rather than
attempting a matrix logarithm.
Observation Equations
Growth and the Size-Age Transition
The size-age transition
converts numbers at age to numbers at length: column
holds the probability that a fish of age
falls in each length bin, and sums to one. It is either supplied as data
or built inside the model from growth parameters
(growth_model = "vb_schnute"), in which case every fleet
gets its own, read at that fleet’s timing in the season. Four pieces go
into it: the mean length at age, the spread of length about that mean,
the treatment of the plus group, and the binning.
Mean length at age
Growth is von Bertalanffy in Schnute’s parameterization: instead of and , the curve is anchored by the mean lengths and at two reference ages and , with the rate of approach to the asymptote. The parameters are then on the scale of the data, which makes them easier to start and to bound. Below the curve is not extrapolated; mean length rises linearly from , the lower edge of the first length bin, to . Writing for the real age (the integer age plus the fraction of the year elapsed):
where the asymptote follows from the two anchors,
Setting growth_A2 = "Linf" reads
as
itself. The five parameters
are estimated on the log scale, one set per population, region and sex,
or shared across regions or sexes (growth_spec).
Under growth_model = "richards" the same curve is
applied to lengths raised to a power
,
a sixth estimated parameter, which lets the inflection sit anywhere
rather than at the origin:
with the asymptote read off the two anchors on the same powered scale, . Setting recovers the von Bertalanffy curve exactly, so the Richards form nests it and the linear phase below is unchanged.
Spread of length at age
Fish of one age are spread around the mean length, and that spread
grows with size. Rather than a variance per age, two parameters have it:
and
,
the values at the two reference ages, with linear interpolation between
them. Which quantity the interpolation runs on, and whether the two
parameters are read as coefficients of variation or as standard
deviations, are separate choices (growth_cv_type and
growth_sd_type).
The interpolation. The branches are on real age
:
below
the value is kept at
,
from
on it is kept at
,
and between them it is interpolated. Under
growth_cv_type = "len" (the default) the interpolant is
mean length, so a fish whose mean length sits halfway from
to
takes a value halfway from
to
;
under "age" it is age itself:
where
,
or the oldest age being evaluated when growth_A2 = "Linf"
and
is read as the asymptote. Note that the two choices are independent:
under "len" the branch is still taken on age, and only the
value inside the middle branch is a function of
.
Because
is itself increasing in
,
the two give similar shapes; they differ where growth is fast, since
interpolating on length compresses the change into the young ages.
From
to the standard deviation. Under growth_sd_type = "cv" (the
default)
is a coefficient of variation and is multiplied by mean length, so the
spread scales with size; under "sd" the two parameters are
standard deviations already and
is the standard deviation, interpolated by the same rule:
The two differ in what is kept constant across ages. Under
"cv" a constant
means the spread grows in proportion to length, so a 20 cm fish and a 60
cm fish have standard deviations in the ratio 1:3; under
"sd" a constant value means the same absolute spread at
every age. A
that declines with size
()
is the usual estimate, since the lengths of young fish vary with birth
date and early growth while old fish have converged on the
asymptote.
The plus group
The accumulator age
holds every fish of that age and older, so its mean length is not the
curve at
:
most of its fish are older than
and larger. Under growth_plus_group = "mixture" the plus
group is treated as a mixture of the ages it contains, with two
assumptions. Its age composition is taken to decline geometrically, the
share of fish
years past the accumulator age being proportional to
,
which is the survivorship under a total mortality of
per year; the
is a fixed assumption about how quickly numbers decline with age, not an
estimated rate, and it sets how much weight the older, larger fish have.
And over those years mean length is taken to rise linearly from
to
across a second lifetime of
years, beyond which the curve is at its asymptote. The plus group’s mean
length is the survivorship-weighted mean of those lengths:
which lies between
and
,
closer to
when
is old enough that little growth remains. Under
growth_plus_group = "curve" the plus group is simply the
curve at
.
Within a year the plus group grows from
by the von Bertalanffy increment over the elapsed time rather than being
re-read from the curve, so its mean length moves through the season the
way every other age’s does.
Growth that changes over time
Growth can move over the series in two ways, which answer different questions and can be used together.
Varying the parameters. Any growth parameter can have a deviation
series (growth_tv_model names one structure per parameter,
"iid" or "rw"), so the parameter in year
is
The log link suits a positive parameter. The logit link keeps a
parameter strictly inside bounds
however large the deviation, which every growth parameter is. The
deviations are penalized by the same process error used for selectivity
(see Growth Deviations under the penalties), and the realized parameters
are reported year by year as growth_pars_y.
How the deviated parameters reach size at age is a second choice
(growth_tv_type). Under "curve" each year’s
sizes are simply read off that year’s own curve: a fish of age
in year
has the length year
’s
parameters give age
,
with no memory of the years it actually lived through. Under
"cohort" size at age is advanced instead, so each cohort
keeps the history of the conditions it experienced. Writing
for the growth increment over one year under year
’s
parameters,
the start-of-year mean length advances as
Three consequences follow. Ages still in the linear phase take the length at their birth year’s parameters gave them, so a cohort born in a poor year has that start forward. The plus group is the only place growth depends on abundance: the cohort just entering it and the fish already there are blended by their numbers, which is why growth under this option is evaluated inside the population dynamics year loop rather than before it. And the coefficient of variation at age is kept at the first year’s, being evaluated once from the first year’s curve and parameters and then kept while the mean moves, so the deviations change mean size without also changing the spread.
Semi-parametric growth. The second way is a surface of deviations on
mean length at age itself, indexed by year and age
(growth_semipar),
applied after the curve and after any cohort propagation. The
parametric curve stays the parametric part and
holds departures from it: a curve with a handful of parameters cannot
fit a year in which only the four-year-olds were small, and an
unconstrained transition per year is not identified. The spread follows
the deviated mean through
,
so under growth_cv_type = "len" a deviation that lengthens
a fish also moves it along the
ramp, while under "age" the spread at age is untouched.
Available structures are "iid", "rw",
"2dar1" and "3dmarg"/"3dcond" –
the same process errors the semi-parametric selectivity forms use,
described under the penalties.
The key
The key is that distribution integrated over each length bin. Length at age is normal about with standard deviation , so with the lower edge of bin each edge is first standardized,
which is where enters: it sets how many bins the age’s mass is spread over, a large flattening the column and a small one concentrating it near . Each bin then takes the probability between its edges, being the standard normal distribution function, and the two tails are accumulated into the end bins so no mass is lost:
The first bin absorbs everything below and the last everything above , so the column sums to one, , for any and , including means that fall outside the binned range entirely, which makes each column a proper conditional distribution and lets the composition likelihoods normalize.
Under growth_dist = "lognormal" the same differences are
taken on the log scale, about a median-corrected mean so that
:
Here
is a standard deviation on the log scale, so
growth_sd_type = "sd" is the pairing that keeps it
dimensionally consistent; combining "lognormal" with
"cv" feeds a length-scale spread into a log-scale
transform.
Weight at age
When waa_model = "wt_len", weight at age is the key
applied to weight at the bin midpoints
through the weight-length relationship
,
so the weight at age holds the spread of length at age rather than being the weight of the mean length.
Timing within the year
Every fleet has its own key and weight, read at the point in the
season that fleet’s observations are taken: each fishery fleet’s at
t_fish, each survey’s at t_srv, and the
spawning weight at the spawning time. A season starts at the cumulative
duration of the seasons before it, and a point inside it is that start
plus the fraction elapsed times the season’s duration. With growth
constant over years the curve read at the real age gives the same mean
length whatever the seasons’ durations, so seasons add no approximation
to growth.
Fishery Observation Model
The fishery observation model describes the expected retained catch-at-age, retained catch-at-length, discarded catch-at-age, discarded catch-at-length, catch and discard (in units of biomass or abundance), and fishery indices.
Expected retained catch-at-age () for a given fishery fleet is calculated using Baranov’s catch equation applied to the retained fishing mortality:
Expected dead discarded catch-at-age () is similarly:
These are the forms used under 0 and 1, where individuals occupy a single region for the whole season and catch is taken where they actually are: at the post-movement (destination) locations under , since movement happens at the start of the season, and at the pre-movement (origin) locations under , since it happens at the end. Under fish redistribute among regions while they are being caught, the region-local Baranov equation is no longer valid, and catch and discards are computed from the season-integrated abundance instead (see Catch Under Continuous Movement above).
To track length-based dynamics, retained catch-at-length () and discarded catch-at-length () are derived using:
where
is the size-age transition matrix, supplied as data or built by the
growth module. When conditional age-at-length data are fit
(do_caal = 1), the joint retained and discarded catch at
length and age are also formed, each age column of the transition scaled
by the catch at that age:
so that summing over lengths returns the catch at age and summing over ages the catch at length.
Selecting at length rather than at age
The catch at length above is the catch at age spread over the key,
which is what FishLenComps_sel = "age" (the default) and
SrvLenComps_sel = "age" give. Selectivity has already been
applied at age by then, as its average over the lengths the age covers,
.
Every fish of an age is therefore equally catchable, and the length
composition within an age is the key’s own column.
Under "length" the order is reversed. The numbers at age
are spread over the key first and selected length by length,
and the survey’s index compositions the same way. The two differ by the covariance of length and selection within an age. Selecting at age replaces by its mean over the age’s length range, which is exact only where is flat over that range. Where the curve is steep, the fish taken from an age are longer or shorter than that age’s average fish, and one number per age cannot represent that. The difference is real and not a rounding, so a model whose length compositions inform a length-based selectivity should select at length.
Expected retained catch () is computed by summing over populations and then either as abundance:
or as biomass:
The fishery weight at age
is normally the population’s mean weight at age at the fleet’s timing,
which is the weight of an average fish of that age. The catch is not
made of average fish. A length-based gear takes the long ones from an
age more often than the short ones, and the long ones weigh more. With
fish_waa_selected = 1 the fleet’s catch biomass instead
uses the mean weight of the fish it takes at each age, the weight
averaged over the key re-weighted by selectivity,
with
the weight at the bin midpoint from wt_len_pars. Flat
selectivity returns the population mean exactly, and a knife edge
returns the weight of the one bin it keeps, so the option changes
nothing unless the gear selects within an age. Where it does, the
difference is largest at the youngest selected ages, whose lengths fall
on the ascending limb. srv_waa_selected does the same for a
survey index in weight.
Population-specific predicted retained catch () retains the population index and is not summed across :
Expected total discards () are computed from the dead discarded catch-at-age scaled back by the discard mortality rate to yield total discarded individuals (dead and released alive):
Discards can also be expressed as a fraction of total catch (abundance or biomass). Population-specific discards follow the same structure without summing across .
Similarly, expected fishery indices () can be computed as either abundance-based or biomass-based, using the product of total fishery selectivity and retention selectivity:
where
is the catchability coefficient for a given fishery fleet. By default
the fishery index is computed directly from start-of-season
numbers-at-age without survival discounting, on the rationale that
fishing is spread across the whole season rather than occurring at a
point within it. However, an optional within-season timing
(t_fish, a fraction of the season) can be specified per
region, season, and fleet, mirroring the survey convention: when
supplied, the numbers entering the index are first decayed by
with reproducing the start-of-season default. This is appropriate for fishery CPUE series that reflect a survey-like snapshot (e.g., an index standardized to a particular part of the season).
The set of ages entering the index sum can also be restricted per
fleet via fish_idx_ages, replacing
with a sum over the named ages only. The restriction applies to the
index total alone; the fleet’s selectivity, catch, and compositions are
unaffected.
For the same reason, the fishery index follows catch rather than the survey when movement is continuous. Under the fleet encounters fish as they redistribute, so above is replaced by the season-integrated abundance . The integral has units of abundance time, and the resulting constant is absorbed by the estimated . Under 0 and 1 the index uses as written, at the post-movement and pre-movement locations respectively. Biomass-based fishery indices are computed as:
The observed region-aggregated fishery index is compared to the sum of predicted indices across populations: . Population-specific fishery indices are compared directly to without summation.
Survey Observation Model
Likewise, the survey observation model describes the expected survey catch-at-age, survey catch-at-length, and survey indices. Expected survey catch-at-age () is calculated as follows:
where subscript denotes a given survey fleet, is the survey timing as a fraction of the season, and is the survey selectivity-at-age pattern.
This elementwise discount is exact under 0 and 1, because movement for the season has already been resolved and the fish are stationary within it (at their post-movement locations under and their pre-movement locations under ). It is not exact under , where it would hold fish in place while they are in fact diffusing. There, the survey observes the population propagated a fraction into the season under the combined generator of the Population Projection section:
Note that a survey is a snapshot at an instant within the season rather than an accumulation over it, so this is the partial propagation and not the season integral used for catch. Selectivity applies at the destination region, i.e. after propagation.
Survey timing may differ by region, which a single propagation operator cannot represent: fish observed in region arrived from regions whose elapsed times differ. The convention adopted is that the survey in region observes the population propagated to that region’s survey time, which is what the subscript outside the bracket denotes. When is constant across regions, the usual case, this collapses to a single propagation and one matrix exponential.
Expected survey catch-at-length () is given by:
and, when conditional age-at-length data are fit, the joint survey index at length and age .
Survey indices () can be computed as either abundance-based or biomass-based. Abundance-based survey indices are calculated as:
while biomass-based indices are computed as:
Here, is the weight-at-age for a given survey, represents the survey catchability coefficient. The observed region-aggregated survey index is compared to the sum of predicted indices across populations: . Population-specific survey indices are compared directly to without summation.
A survey fleet can instead observe year class strength directly, with
srv_idx_type = "recdev". Such a fleet reads no part of the
population:
where is the recruitment deviation and the center its penalty asserts (see Recruitment). The deviation relative to that center is the anomaly, how strong the year class was against what the model expected, which is what a pre-recruit survey or an environmental index measures. Under a bias ramp , so the anomaly and the deviation are not the same quantity. Deviations are signed, so such a fleet requires a normal index likelihood, and its selectivity, survey timing and weight-at-age are never read.
As with the fishery index, the ages entering the survey index sum can
be restricted per fleet via srv_idx_ages. Restricting a
fleet to a single age turns it into an index of that age alone (e.g., an
age-1 acoustic index of recruitment strength), while the fleet’s
compositions continue to use the full age range because the restriction
applies to the index sum rather than to selectivity.
Survey catchability is by default an estimated parameter,
with time-block structure
.
Alternatively, catchability can be concentrated out of the likelihood
analytically (srv_q_type), treating it as a pure scaling
nuisance parameter. Two analytic solutions are available, computed per
region and fleet over only the years with observations. The arithmetic
solution ("arith") is the ratio of mean observed to mean
predicted unscaled index:
and the geometric solution ("geo") is the exponentiated
mean log-ratio:
where denotes the predicted index evaluated at . The geometric form is the exact maximum likelihood solution for a lognormal index likelihood with a shared standard error, and is the usual companion to a lognormal index; the arithmetic form matches the convention some existing assessments use. Analytic fleets fix their parameters automatically, ignore any block structure, and cannot have catchability covariates or priors.
For estimated survey catchability, environmental linkage can be specified:
where is the base survey catchability (i.e., intercept), is a matrix of covariates, is a vector of regression coefficients, are orthogonal polynomial coefficients along with its basis functions, and are the covariates for which a polynomial term is assumed.
Tagging Observation Model
The tagging observation model tracks tag cohorts () by the combination of release region, release year, and release season () and follows a Brownie tag attrition framework. Tag cohorts are tracked for a pre-defined maximum duration (maximum tag liberty; ), after which calculations for the tag cohort are no longer computed. Tag dynamics incorporate both population () and season () dimensions, and tag reporting rates are fleet-specific (). In general, the process dynamics for the tagged cohort mimic those specified for the overall population. Immediately following release, tag cohorts are decremented by an initial tag-induced mortality rate:
where is the initial tag-induced mortality rate.
Tag cohorts are then advanced across each season by the same seasonal transition operator as the population, but evaluated with the tag-specific total mortality and over the fraction of the season the cohort is actually at liberty for, (with defined below):
For seasons within a year ():
and at the end of the final season () individuals advance in age, with accumulation of individuals in the plus group, exactly as for the population:
Under these reduce to the historical sequential form, in which Markovian movement is applied first and the cohort then follows an elementwise exponential mortality model, .
Mid-season releases are handled differently by the two families of timings. Under the sequential timings, a cohort released partway through its release season () skips the discrete movement step entirely for that season, is replaced by the identity, because a full-season transition matrix cannot represent a partial interval. Such a cohort stays in its release region for the remainder of the release season, experiencing only the partial-interval mortality, and movement resumes normally from the following season.
Continuous movement needs no such exemption, and imposing one would be inconsistent: the generator is scaled by , the same at-liberty fraction that already scales the cohort’s mortality, so tags released mid-season diffuse for exactly the fraction of the season they were at liberty for. Freezing them in place while still discounting their mortality partially would have tags dying on a partial season but holding station for a whole one.
Total mortality for the tagged cohort () is specified as:
where is the fraction of season that cohort is actually at liberty for. It equals in the release season of the release year, and in every subsequent season:
Note that multiplies every mortality component, fishing included, rather than only the total. This matters for the recapture equation below: is the fraction of deaths owing to fishing and must lie in . Scaling while leaving at full-season scale would give , which exceeds whenever and would predict more recaptures than there are dead tags. Scaling both leaves the ratio at and lets the term hold the shorter exposure, which is the standard partial-interval form of Baranov’s equation.
Here is a parameter describing chronic tag loss (i.e., annual tag shedding) and denotes the subset of fishing fleets that contribute tagging data. The summation over rather than all fleets is intentional: restricting the tag mortality calculation to fleets with tagging data prevents non-tagging fleets from unintentionally influencing tag-based parameter estimates (e.g., selectivity, reporting rates).
Similar to computations for retained catch-at-age, tag recaptures are calculated using a modified version of Baranov’s catch equation, with fleet-specific tag reporting rates applied to the retained component:
As for the fishery, this region-local form applies under 0 and 1. Under tags redistribute among regions while they are being caught, so recaptures use the season-integrated tag abundance:
The integral is evaluated by the same block-matrix construction used for the population, with in place of (see Catch Under Continuous Movement above). Because both and the fishing mortality in the numerator hold the same scaling, this integrates fishing mortality over exactly the at-liberty fraction of the season: the substitution turns the expression into on the unscaled full-season generator, which is the continuous-movement counterpart of the partial-interval Baranov equation described above.
Here represents a fleet-specific tag reporting rate parameter that can vary across space, time, and fleet, which is estimated in logit space such that it is constrained between . Recaptures are computed only for fleets in .
Fishery and Survey Selectivity
In the following descriptions of selectivity, we omit subscripts for sexes and fleets for brevity, although note that the equations remain specific to those model partitions. Several approaches are available for parameterizing fishery and survey selectivity. Selectivity can be defined as either age- or length-based. Selectivity parameters are estimated by region (), year (), sex (), and fleet, and are explicitly invariant across populations () and seasons ().
For age-based selectivity, an age vector is applied directly with a chosen functional form, and the resulting selectivity-at-age () is likewise invariant across populations and seasons. For length-based selectivity, a length vector is used to compute selectivity-at-length (), which is then converted to selectivity-at-age via a dot product with the size-age transition matrix:
Because the size-age transition matrix varies across populations and seasons, the derived selectivity-at-age inherits population and season specificity upon conversion, even though the underlying selectivity-at-length parameters remain shared across these dimensions. Given the age-based nature of the model, selectivity-at-age is utilized for all subsequent calculations. In the following we use the subscript to denote a generalized bin number.
Two forms of logistic selectivity can be specified. The first form is defined as:
where determines the slope/steepness of the logistic curve and is the bin-at-50% selection. Parameters are supplied in the order , and every selectivity parameter is estimated on the log scale, so a starting value is given as of the quantity above. The second form can be expressed as:
Here,
is also the bin-at-50% selection and
is the bin-at-95% selection. Beyond the specification of flat-topped
selectivity, SPoRC also allows for dome-shaped selectivity.
In particular, a reparametrized gamma function can be specified:
In this parameterization, is a derived power parameter, is the shape parameter that describes the steepness of the descending limb, and describes the bin-at-maximum selection. Dome-shaped selectivity can also be expressed as a power function:
with being a power parameter that determines the descending limb of the curve (larger values are steeper). The last dome-shaped selectivity form that can be specified includes a 6 parameter (denoted as through ) double normal functional form with the following transformations applied:
is the bin at which the plateau begins, kept on the bin scale rather than transformed so that it means a bin, the bin at which the plateau ends, the bin width, and control the ascending and descending widths, and and are the selectivity at the first and last bins. Writing for the height the two limbs are built up to and the plateau sits at, which is one unless a sex has an apical offset (see Sex Offsets below), the curve is assembled from
and are joined together as:
Each limb is rescaled by its own value at the bin its endpoint parameter refers to, which is what makes those parameters mean what they are named: dividing the ascending limb by puts at exactly in the first bin, and dividing the descending limb by puts it at exactly in the last. Both anchors are the model’s own first and last bin, so they follow the bin range rather than sitting at a fixed value.
The double normal functional form is incredibly flexible and is able to reduce to both flat-topped and dome-shaped selectivity forms, depending on the values of the parameters.
Non-parametric selectivity can also be specified, where bin-specific logit-scale parameters are transformed via the logistic function:
where is a freely estimated logit-scale selectivity parameter for each bin.
A second non-parametric form ("nonparlog") holds the
free parameters on the log scale instead and standardizes within each
year so selectivity averages to one over a set of bins
:
The standardization window
is given per fleet (fish_sel_norm_bins and
srv_sel_norm_bins) and is every bin by default,
i.e.
and the divisor is the mean over the whole curve. It is expressed in
whichever bin domain the fleet’s selectivity is defined on, ages or
lengths. Standardization is applied to every bin of the curve regardless
of which bins
holds; the window sets what the average is taken over, not which bins
are rescaled. Retention selectivity takes the whole bin range, since the
window is supplied for the fishery and survey data sources only.
The two non-parametric forms differ in both respects: the logit form bounds every raw value below one via the logistic transform and mean standardizes over years and bins jointly, whereas the log form leaves the scale free and centers within the year, the convention several existing assessments use. Under the log form only the differences among within a year are identified; the level of is free and is absorbed by catchability or fishing mortality, which is why it is typically paired with the selectivity parameter centering penalty described in the Priors and Penalties section.
Which bins holds is a statement about the gear rather than a numerical convenience, because the standardization fixes the level that catchability is defined against: a fleet whose refers to only part of the bin range standardizes over that part. Two choices of differ only by a constant multiplier on , and a freely estimated absorbs that multiplier exactly, leaving every fitted quantity unchanged. Under an informative prior on that multiplier is not free. The prior resists the compensating shift in , and the difference between windows is set by the selectivity parameters instead, levered by the derivative of the index negative log-likelihood with respect to at the fitted values. A window that does not match the definition the catchability prior was built under therefore shows up as a standing gradient on rather than as an absorbed scalar, and the two windows give different fits.
Two additional logistic forms with a freely estimated asymptote parameter are also available. The first uses the bin-at-50% and slope parameterization:
The second uses the bin-at-50% and bin-at-95% parameterization:
where is estimated on the logit scale, allowing the asymptotic selectivity to be less than 1. These forms are useful for fleets where full vulnerability is not achieved even at the largest observed sizes or ages.
Selectivity Plateau
Any functional form can additionally have a plateau (the
_NSelBins_<n> suffix on the model string): bins
beyond a chosen bin
are kept at that bin’s computed value rather than evaluated through the
form,
applied after the form and its parameter deviations. This is the plateau convention many existing assessments use, and it is part of the model rather than a display choice whenever the curve has not saturated by .
Sex Offsets
For models with more than one sex, a fleet’s sexes can be linked
through offsets rather than estimated independently or forced identical
(fish_sel_sex_offset / ret_sel_sex_offset /
srv_sel_sex_offset, for total fishery, retention, and
survey selectivity respectively). Under a parameter offset
("par"), the stored parameter slots of every sex beyond the
first hold additive offsets on the first sex’s transformed-scale
parameters,
so that for log-scale parameters the second sex’s natural value is
the first sex’s times
(e.g.,
,
).
Offsets fixed at zero reproduce sex-shared parameters. Under a scale
offset ("scale"), each sex keeps its own parameters and the
realized curve of every sex beyond the first is multiplied by a
constant,
with estimated per region, block, and sex; the scaled curve may exceed one, matching the convention of a log-scale male selectivity offset applied to the whole curve. Because a constant multiplier is canceled by mean standardization, the scale offset is refused for the non-parametric forms and the semi-parametric time-varying structures.
Under an apical offset ("apical"), available for the
double normal alone, the same estimated constant
is used in a different place. Rather than multiplying the finished curve, it replaces the one that the double normal’s limbs are built up to. Writing the two side by side for a sex beyond the first, with , , , , and exactly as defined for the double normal above, a scale offset evaluates the form with its plateau at one and then multiplies,
while an apical offset puts everywhere that one appeared,
and the curve is never multiplied by anything afterwards. The consequence is at the two ends. Both arrangements put the plateau at , but a scale offset has and down with it while an apical offset leaves them alone:
| first bin | plateau | last bin | |
|---|---|---|---|
| no offset | |||
| scale offset | |||
| apical offset |
Either can be made to draw any single curve, by rescaling and by ; they differ in how the curve responds when moves, which is what a gradient sees.
The apical offset is restricted to the double normal because only there is it a distinct operation. For a form that peaks at one with no separate parameters at its ends, scaling and lowering the peak are the same thing: the ascending logistic scaled by is the asymptotic logistic with asymptote (forms 6 and 7 above), and the gamma dome is already zero at both ends.
Time-varying deviations are unaffected by any of these options and still apply per sex to the effective parameters.
Bicubic Spline Selectivity
Rather than a fixed functional form, selectivity can instead be constructed as a smooth two-dimensional surface over bins and years using a bicubic natural cubic spline. A sparse grid of freely estimated log-scale node parameters, , indexed by bin-node and year-node , is expanded to the full bin-by-year surface via two successive natural cubic spline interpolations.
Bin-nodes and evaluation bins are first placed on a common scale, equally spaced by index:
and a natural cubic spline is fit through the node positions , producing an interpolation weight matrix such that, for any vector of node values, maps those node values onto all evaluation bins while passing exactly through the node values themselves. An analogous weight matrix () is constructed for the year dimension using year-nodes similarly placed on . The full surface is then obtained by a two-pass tensor-product spline: first interpolating across bins for every year-node,
where is the matrix of node parameters () and is , and then interpolating the resulting bin-interpolated year-node curves across years for a given year :
so that for every bin . Setting collapses the year dimension to a single node (equal weight for every year), yielding a time-invariant bin-only spline; combining with discrete time blocks (see Temporal Variation below) re-fits an independent bin-only spline within each block.
Two optional restrictions can be applied to the range over which the surface is actually spline-fit, with everything outside that range kept constant (edge-kept) rather than continuing the spline.
The first restricts the year dimension: given a user-specified calendar year within a given block, only years from through the block’s final year are used to place year-nodes and evaluate the spline. Years within the block prior to are assigned the same interpolation weights as itself (the boundary node),
i.e., “filled” forward from the first actually-fitted year.
The second restricts the bin dimension: given a user-specified number of bins , bin-nodes and the spline are only evaluated over bins ; any remaining bins are kept at the last fitted bin’s value,
This is useful, for example, when the observed age or length range used to originally fit the surface is narrower than the full number of ages or lengths represented in the population dynamics.
In addition to the functional forms that can be specified to describe selectivity processes, several options exist to specify continuous time-varying processes. In particular, options to specify time-varying parametric selectivity and time-varying semi-parametric selectivity are available. To illustrate, if logistic selectivity is specified and parametric deviations are invoked, the following expression is used:
where the parameters of the logistic form are allowed to vary over time.
In the context of semi-parametric selectivity, the following equation is used:
where deviations are placed about the parametric form and selectivity values are mean standardized to aid with interpretability. Mean standardization is applied only when semi-parametric deviations are specified (process error models 3-5), or when non-parametric selectivity is specified. For age-based selectivity, the mean is computed from a single population and season reference () since the underlying selectivity is invariant across these dimensions, and the standardization is then applied identically across all populations and seasons:
where is the mean of log-selectivity across all years and bins for a given region, sex, and fleet. For length-based selectivity, mean standardization is applied directly to the selectivity-at-length values before conversion to the age domain via the size-age transition matrix. Because the log-scale non-parametric form already standardizes within each year over its own window , it is excluded from this joint standardization rather than being centered a second time. Further details on how selectivity deviations arise can be found in the “Selectivity Process Error” section of this document.
Finally, individual bins can be overridden with their own freely
estimated annual deviations (_sel_bin_dev_bins),
independent of the fleet’s functional form. For each named bin
:
replacing whatever the functional form (and any standardization or
semi-parametric deviation) produced for that bin, while all remaining
bins keep their parametric shape. The override is applied last, after
every other transformation. The canonical use is a gear whose curve is
well described by a parametric form over most of its range but whose
youngest bin is governed by availability rather than by the gear (e.g.,
age-1 availability to a bottom trawl varying with year-class strength):
that bin becomes freely time-varying without abandoning the parametric
form elsewhere. The override deviations can have their own iid or random
walk process error (cont_tv_sel_bin_devs), described in the
Selectivity Process Error section.
Likelihoods
Currently, SPoRC incorporates data likelihood components
for the following data sources:
- region-aggregated fishery catches (summed across populations),
- population-specific fishery catches,
- region-aggregated fishery discards (summed across populations),
- population-specific fishery discards,
- region-aggregated fishery indices (summed across populations),
- population-specific fishery indices,
- region-aggregated fishery age compositions (summed across populations),
- population-specific fishery age compositions,
- region-aggregated fishery length compositions (summed across populations),
- population-specific fishery length compositions,
- region-aggregated discard age compositions (summed across populations),
- population-specific discard age compositions,
- region-aggregated discard length compositions (summed across populations),
- population-specific discard length compositions,
- region-aggregated survey indices (summed across populations),
- population-specific survey indices,
- region-aggregated survey age compositions (summed across populations),
- population-specific survey age compositions,
- region-aggregated survey length compositions (summed across populations),
- population-specific survey length compositions, and
- conventional tagging data.
Region-aggregated likelihoods compare observed data to predicted quantities summed across all populations (), while population-specific likelihoods compare observed data to predicted quantities for a single population directly. The total likelihood (objective function) is the sum of the individual likelihood contributions from these data sources along with priors and penalties, where the objective function is minimized using a non-linear optimization algorithm to estimate model parameters.
Observation Likelihoods
Age-Disaggregated Observations
Catch, discards and the survey index can each be fit at age rather than aggregated with a composition alongside. Every age is its own observation with its own standard deviation, and for the survey index its own catchability.
Each data source is stored over regions and sexes whatever a fleet reports, and the fleet’s Type in that year, , names which of those dims it reports separately: a split dim is a single index, a summed dim is the whole extent and the observation sits in its first slot. Writing for the populations, the prediction for retained catch is
where when the fleet splits regions in that year and when it sums over them, likewise for sexes, and selects abundance or biomass through the fleet’s units. The population-specific form replaces with the single population being compared. The other two data sources differ only in the quantity summed:
with the sums running over the same index sets.
and
are retained catch and dead discards at age,
the discard mortality rate that raises the dead discards to the total
discarded,
weight at age, and
the survey-available numbers at age. The survey index has no separate
:
an index fit age by age holds its age-specific catchability in
selectivity, through the "nonparfree" form.
A fleet’s observations are lognormal or normal. Writing for the prediction and for the observation, the residual is under the lognormal and under the normal. The standard deviation is whichever of the estimated parameter and the reported standard error the fleet’s error source names:
for "none", "data",
"est_additive" and "est_quadrature"
respectively.
The standard deviations are coupled through integer key arrays over
age, sex and fleet, in which equal entries share a parameter and
NA excludes one. A single structure therefore gives one
standard deviation per age, one per age group, or one per fleet, and
repeating entries across sexes couples the sexes.
This is not the same statement as an aggregated observation with a composition beside it. That factorization is exact for a multinomial over Poisson counts, where the total is a genuine count sum, but the sum of lognormals is not lognormal, so the two forms differ for the lognormal used here. A fleet fits one or the other.
Correlation across ages
Ages within a cell may be independent, or correlated through one of
three structures, chosen per fleet. Under "iid" each age
contributes
on its own. The other three place the cell’s residual vector in one
multivariate normal density,
,
and assign the whole density to the first age present.
Under "1dar1" the correlation is a function of age
distance, not of position in the observed vector, so a fleet that skips
ages is spaced by the ages themselves:
Where the observed ages are consecutive this is evaluated by the autoregressive recursion, which is the same density at lower cost.
Under "us" the correlation is unstructured, built from
unconstrained parameters that fill the strict lower triangle of a matrix
whose diagonal is one. Normalizing each row of
to unit length makes it a Cholesky factor, so
is a correlation matrix for any parameter values, and the principal submatrix on whichever ages a cell observes is one too.
Under "2dar1" the correlation runs over ages and years
jointly, with the covariance the Kronecker product of an AR(1) over
each:
In all three the standard deviations enter as marginal standard
deviations, so
means the same thing whichever structure a fleet chooses and one key
matrix serves all of them. This is worth naming because the selectivity
process error elsewhere in SPoRC parameterizes its
separable AR(1) by the conditional variance instead, passing
dseparable a scale of
;
the two are different parameterizations of the same family, not
different families.
The correlations are indexed by region, sex and fleet, with a leading
population index for the population-specific data sources, and are
shared through rho_*_spec.
This is defined on a complete grid, so a fleet’s observed ages and years must form one. A cell with a single observed age has no correlation to describe and falls back to independent.
The weight is the one the aggregated data source has, applied after summing over ages and sexes within a cell.
Fishery Catches
Fishery catches can be fit using a lognormal likelihood. The log-likelihood for region-aggregated observed catch, , is defined as:
Here, is the likelihood weight, is the observed catch, is the predicted catch summed over populations, and is the variance of catch on the log scale.
Population-specific catch observations can additionally be fit using the same lognormal form, comparing observed catch for a single population to the predicted catch for that population without summing across populations:
where is the predicted catch for population only.
Reporting Once a Year in a Seasonal Model
The prediction every observation equation above is compared against is written a given season . A data source can instead report once a year, in which case the prediction is the year’s total:
where is the predicted catch in season already summed over populations, is the number of seasons, and replaces in the lognormal above. Every other season contributes nothing, so for . The same substitution applies to discards, to fishery and survey indices, and to the at-age data sources.
For a composition the sum is taken before the proportions are formed, so the expected proportion at age is
where is the predicted catch at age. This is a catch-weighted composition for the year, not the average of the seasonal compositions: a season landing more fish counts for more.
Fishing mortality is still estimated season by season, so one annual observation does not identify the seasonal split on its own.
Fishery Discards
Fishery discards are fit using the same lognormal likelihood form as catches. The log-likelihood for region-aggregated observed discards is:
where is the likelihood weight, is the observed discard, is the predicted discard summed over populations, and is the variance of discards on the log scale. Population-specific discard observations follow the same lognormal form with for population only.
Time Blocks on Recruitment
R0_blocks names the block each year sits in, and
becomes
wherever the recruitment of year
is computed. Under mean recruitment
IS mean recruitment, so a block is a productivity regime; under a
stock-recruit form it is the curve’s scale, so blocking it makes the
curve time-varying. Everywhere a single value is required rather than a
year’s value, namely the initial age structure, the regional
apportionment, the
prior, the
penalty and the stock-recruit scale, the model reads
R0_ref_block.
Fishery and Survey Indices
Fishery indices can also be fit assuming a lognormal likelihood. The log-likelihood for region-aggregated observed fishery indices is:
where controls the weight of fishery indices to the objective function, represents the observed fishery indices, is the predicted fishery index summed across populations, and denotes the variance of the fishery index.
Population-specific fishery indices can additionally be fit, comparing observed population-specific indices to the predicted index for that population directly:
where is the predicted fishery index for population only.
Likewise, survey indices can be fit assuming a lognormal likelihood. The log-likelihood for region-aggregated survey indices is:
is the likelihood weight applied to survey indices, are the observed survey indices, is the predicted survey index summed across populations, and indicates the variance of the survey index.
Population-specific survey indices can additionally be fit, comparing observed population-specific indices to the predicted index for that population directly:
where is the predicted survey index for population only.
The lognormal above is the default, but each region-aggregated
fishery and survey index fleet can instead be assigned one of two
alternative error structures via FishIdx_LikeType /
SrvIdx_LikeType. A normal likelihood on the arithmetic
scale treats the supplied standard errors as arithmetic rather than
log-scale:
A multivariate normal likelihood places a fleet’s whole observed series in a single density with a fixed, user-supplied covariance across observations:
where
is the number of fitted observations for the fleet, ordered as they
appear when scanning the fleet’s use flags in array order. This is the
appropriate form when the survey itself provides a covariance across
years (e.g., a model-based index with estimated inter-annual
correlation), since a diagonal likelihood would treat correlated
residuals as independent information. The covariance is validated at
setup for symmetry and positive definiteness and is factorized once when
the AD tape is built. Note that the full multivariate density includes
the
constant, unlike TMB’s MVNORM convention, so absolute
likelihood values differ from implementations that omit it even when the
fits are identical. One-step-ahead (OSA) residuals are available only
for lognormal index fleets; normal and MVN fleets are excluded from the
OSA routines.
Fishery and Survey Compositions
Several options for fitting composition data are available in
SPoRC. These include the multinomial, the
Dirichlet-multinomial, and the logistic-normal likelihoods. In the case
of the multinomial likelihood, the following expression is used:
where subscript is used to indicate a fishery or survey fleet and the subscript generically indicates a bin number. are likelihood weights applied to composition data, is the input sample size, denotes the expected composition proportions, and are the observed composition proportions.
In its negative log form the multinomial is implemented with a small
constant
(addtocomp) guarding
and an offset so a perfect fit contributes zero:
The switch comp_const_obs
()
controls whether
is also added to the observed proportions used as weights. The default
(1) is the long-standing SPoRC behavior;
0 adds the constant only inside the logarithms, a
convention several existing assessments use, and matters when bridging
to them, since the added constant slightly reweights every bin.
If a Dirichlet-multinomial likelihood is assumed, the following parameterization (linear) is used:
Here, is the overdispersion parameter of the Dirichlet-multinomial that adjusts the input sample size. The effective sample size ( can then be derived as:
A multivariate logistic-normal likelihood can also be assumed, which is given by:
Both and are dimensional vectors, while is a covariance matrix (see below for further details). and are derived via an additive logistic function:
where and are transformed proportions using the last bin as the reference category. Because the logarithm of zero is undefined, all untransformed proportions must be strictly positive. If any observed proportion is zero, both the observed and corresponding expected values are removed, and the remaining proportions are renormalized to ensure that they sum to one before applying the transformation. The covariance matrix of the logistic-normal likelihood can be specified in various ways. In the simplest case, the covariance matrix can be assumed to be independent and identically distributed (iid):
where is a identity matrix and is an estimated overdispersion parameter representing the variance. The simple iid case can be further extended to incorporate a one-dimensional lag-1 autoregressive structure:
Here, is a correlation matrix with a lag-1 autoregressive structure, where defines the correlation across bins. Lastly, if the model is specified to be sex-structured and sex-composition data are utilized, a two-dimensional autoregressive structure can be specified:
is a constant correlation matrix dimensioned by for sexes, with off-diagonal elements controlling the correlation of age/length categories across sexes, while is a lag-1 autoregressive correlation structure, where defines the correlation across age/length categories. denotes the Kronecker product.
Logistic-Normal on Observed Bins
The forms above keep every bin, adding a small constant so the logarithm is defined. A second treatment here instead drops the empty bins. Let be the bins with something in them and their number. Both vectors are renormalized over that set,
and the additive logistic transform is taken over the bins that remain, with the last of them as the reference, giving vectors of length . The covariance is then:
where is the input sample size for that cell, is the estimated log-scale standard deviation, is the bin number of the th element of , and is the correlation, positive by construction. and are the constant cross-sex and autoregressive across-bin correlation matrices defined above, with both correlations taken through the same logistic function, and the Kronecker product is formed over the whole bin by sex stack and then cut to , so a bin dropped from one sex does not shift the other. Dividing by the sample size makes a per fish quantity, so a cell sampled harder is fit more tightly. The lag is measured in bins rather than in position, so a gap left by an empty bin, or by a restricted bin range, is the longer lag it actually is.
The log-likelihood is the multivariate normal density above, evaluated on the transformed vectors of length , less the change of variables from the transform:
All three composition likelihood forms (multinomial, Dirichlet-multinomial, logistic-normal) can be applied to retained fishery, discarded fishery, and survey composition data, as well as to both region-aggregated and population-specific variants. For region-aggregated compositions, expected values are derived from catch-at-age or survey index-at-age quantities summed across populations (). For population-specific compositions, expected values are derived from the quantities for a single population directly. For discard compositions, expected values are derived from discarded catch-at-age () or discarded catch-at-length quantities analogously. Each likelihood form and covariance structure described above applies identically across all composition data types; population-specific likelihoods additionally have separate overdispersion () and correlation parameters () estimated independently from their region-aggregated counterparts.
Structuring Compositions and Ageing Error
Related to the use of composition data likelihoods, composition data can be structured differently depending on model assumptions and data constraints. In particular, three options are available to fit to composition data:
‘Aggregated’ compositions across regions and sexes,
‘Split’ compositions for each region and sex (i.e., no implicit information about sex-ratios), and
‘Joint’ compositions across sexes (i.e., implicit information is provided about sex-ratios).
The expected compositions (i.e., catch-at-age, catch-at-length, survey catch-at-age, survey catch-at-length) when specified as ‘aggregated’ are derived with the following:
where compositions are summed across regions and sexes and normalized to sum to one. Ageing error () can then be applied using standard matrix multiplication. Expected compositions that are specified as ‘Split’ by sexes and regions are computed as:
Here, expected compositions sum to one within a given region and sex combination and ageing error is similarly applied via matrix multiplication. In the case where expected compositions are specified as ‘Joint’, they are calculated as:
where the expected compositions sum to one jointly across bins and sexes, thus preserving implicit sex-ratio information. Ageing error is then applied by taking the Kronecker product of a identity matrix with the ageing error matrix, followed by matrix multiplication. These three structuring options apply identically to retained fishery, discarded fishery, and survey composition likelihoods, as well as to both region-aggregated and population-specific variants.
Ageing error is fleet specific,
,
supplied through AgeingError_fish and
AgeingError_srv to accomodate different reading mehtods.
Every fleet’s matrix maps onto the same set of observed age bins,
because the observed composition arrays have one age dimension shared
across fleets. The length analog
(LenBinMap) is applied in exactly the same position for
length compositions, and is shared across fleets.
Additionally, every composition data source can be restricted to a
subset of observed bins (the _bins arguments). Both the
observed and expected compositions are subset to the named bins and
renormalized within them:
where is the fitted bin set, indexed on observed bins (i.e., after or has mapped model bins onto observed ones). Bins outside are left out of the likelihood entirely rather than being forced to be explained, which is appropriate for a gear that only resolves part of the range (e.g., a fishery that never encounters the youngest ages, whose zeros would otherwise have information).
The restriction and the mapping are distinct operations applied in that order. and redistribute mass from model bins onto observed bins, conserving it wherever a row sums to one, which is every row of an ageing error matrix or a length bin collapse. Restricting to discards the mass outside and renormalizes what remains. A row that sums to zero is the one case where a mapping also discards, which is what the shifted identity does to drop a model age the observations never resolve. Neither substitutes for the other: no subset of the model’s bins reproduces a many-to-one collapse, and a mapping that zeroed an observed bin would leave it with a structural-zero expectation the composition likelihood cannot fit.
For ‘Joint’ compositions the restriction is taken on each sex’s block of the stack, so the implicit sex ratio those compositions have becomes the ratio within . Where the logistic-normal families supply a correlation over bins, the covariance is formed across all observed bins and then subset to , so a gap in still contributes to the lag between the bins either side of it.
Conditional Age-at-Length
A conditional age-at-length observation is the age composition of the fish aged from one length bin. Its expectation is the row of the joint array for that bin, normalized across ages, then passed through the ageing error matrix:
which is
under the model, since the joint array is
times the numbers at age. Each length bin is then fit as its own
composition with the multinomial or Dirichlet-multinomial above, with
the input sample size the number of fish aged from that bin
(ISS_Fish_caal, ISS_Srv_caal) and the weight
Wt_Fish_caal, Wt_Srv_caal multiplying it:
with shared across the length bins of a fleet under the Dirichlet-multinomial, since the bins come from one length-stratified sample. The logistic-normal families are not available: a bin’s age sample is small and mostly zeros, which the additive log-ratio transform cannot handle. Fit together with the marginal length compositions, the lengths hold the abundance signal and the conditional rows have , which is the information on growth; fitting marginal ages as well would count the same fish twice.
Tagging
SPoRC currently allows for various tagging likelihoods,
ranging from the Poisson, Negative Binomial, multinomial, and
Dirichlet-multinomial likelihood. Additionally, SPoRC also
allows for both release- and recapture-conditioned dynamics (McGarvey
and Feenstra, 2002). The Poisson tag likelihood is given by:
where are the observed tag recaptures and is the likelihood weight applied to tagging data. In the case where the Negative Binomial is invoked, the following expression is used:
Here, represents the estimated overdispersion parameter for tagging data.
Under release conditioned dynamics, both recaptured and non-recaptured states are fit to. Proportions of observed () and expected recaptured ( individuals are given by:
denotes the total tags released for a given tag cohort (combination of release region, year, and season). Non-recaptured states can then be written as:
where and are the observed and expected non-recaptured states, respectively. These states are then combined into a single vector of observed and expected values:
If a Multinomial likelihood is assumed for release conditioned dynamics, this is given by:
Here, the subscript is used to generically denote a given element. If a Dirichlet-multinomial with released-condition dynamics was assumed, the tagging likelihood would be written as:
The parameter in the Dirichlet-multinomial likelihood represents the overdispersion parameter for tagging data.
Under recapture-conditioned dynamics, tag shedding, tag induced mortality, and tag reporting rates are assumed to be spatially-invariant and do not need to be estimated, given that these terms cancel out in the denominator (McGarvey and Feenstra, 2002). Unlike release-conditioned dynamics, assuming recaptured-conditioned processes does not require fitting to non-recaptured states. Thus, the observed and expected recaptured proportions can be written as:
where recapture probabilities are normalized by the total number of recaptures across populations, regions, ages, and sexes in a given year and season.
Parameter Priors and Process Error Penalties
Parameter Priors
Considering the complexity of integrated population models, several priors can be specified to help inform the estimation of parameters by providing additional knowledge. Priors can currently be specified for natural mortality, fishery and survey catchability, fishery and survey selectivity, steepness, recruitment population scale () and proportions, stray rates, movement rates, and tag reporting rates.
Natural Mortality
In the case of natural mortality, a lognormal prior is utilized:
where the variance of the prior is given by , and denotes the prior mean.
Fishery and Survey Catchability
For fishery and survey catchability, a lognormal prior can also be specified:
where here represents either a fishery or survey fleet, is the variance of the prior, and indicates the prior mean for catchability.
Fishery and Survey Selectivity
In general, selectivity priors can be utilized to serve as regularizing priors to facilitate stable parameter estimation (Monnahan, 2024). These priors are assumed to be lognormal and are applied to the selectivity parameters themselves:
where is a selectivity parameter for a given functional form specified, is the prior variance, and is the prior mean for the specific selectivity parameter.
In addition to lognormal priors on individual parameters, a centering
penalty can be applied jointly to a named set of selectivity
fixed-effect parameters (Use__selex_penalty with a
_selex_penalty table). For a set
of parameters kept on the log scale, the penalty is:
i.e., the squared log of the set’s mean selectivity on the natural
scale, pushing the average selectivity of the set toward one. This
resolves the scale non-identifiability of non-parametric log-scale
selectivity: such a curve is only identified up to a scalar once
catchability or fishing mortality is free to absorb its level, and the
centering penalty pins that scalar softly rather than fixing a bin
outright. Because the expression averages on the natural scale, it is
meaningful only for parameter sets kept on the log scale (the
"nonparlog" form); logit-scale sets would not average to
anything interpretable as selectivity.
Steepness
If a stock-recruit relationship is assumed (Beverton-Holt or Ricker), priors for steepness can be specified. Currently, a scaled beta prior (bounded between 0.2 and 1 by default) can be invoked:
Here, and are parameters of the beta distribution, is the prior mean steepness for a given population and region (bounded between 0.2 and 1) while is the standard deviation for these priors.
The support of the beta can be changed from the default
via optional lb and ub columns of the prior
table, in which case every
and
above is replaced by the supplied bounds. This exists because a beta
placed on a different interval is a different function of
rather than the same one shifted: a beta on
has a
term where the rescaled default has
,
and no choice of shape parameters reconciles the two. Matching a bridged
assessment’s steepness prior therefore requires matching its support,
not just its mean and standard deviation.
Recruitment Proportions
Regional recruitment is derived by apportioning a global recruitment parameter using regional recruitment proportions for each population (i.e., ). Here, is derived via a multinomial logit transformation and Dirichlet priors can be used to help constrain estimation:
are the estimated recruitment proportions across regions for population , and is the concentration parameter governing the spread of the Dirichlet distribution. Similarly, seasonal recruitment proportions can be constrained with Dirichlet priors when estimated. When and , is instead parameterized via a multinomial logit restricted to seasons (seasons before are fixed at exactly zero rather than estimated, per the timing constraint described under Age-0 Recruitment above), and any Dirichlet prior is evaluated only over that same restricted support.
R0
A lognormal prior can be placed on for any population:
where is the prior mean on the natural scale and is the standard deviation on the log scale.
Stray Rates
When stray rates are estimated
(
and use_fixed_stray_rate = 0), a standard beta prior can be
applied to regularize estimation. The prior is parameterized via
method-of-moments in terms of a mean and standard deviation:
where is the concentration parameter. The stray rate is numerically stabilized by squishing the logistic transform away from the boundaries:
where is the logit-scale parameter and is a small constant (e.g. ) ensuring . The prior is then:
where is the literal standard deviation of the Beta distribution and must satisfy to ensure . Because stray rates are generally not identifiable from fisheries data alone, this prior serves primarily as a regularizing constraint rather than an informative prior, and tight values of are recommended. Note that when is large relative to , and approach zero and the Beta density becomes U-shaped, placing mass near 0 and 1. In this regime numerical instability can occur during optimization, which is why is squished away from the boundaries via the transformation.
Movement
Likewise, priors on movement values can be assumed to arise from a Dirichlet process:
where is the origin region, is the destination, and are the concentration parameters that control the Dirichlet distribution.
What the prior is evaluated on
For unstructured movement (move_type = 0) the
above are the estimated transition fractions themselves, and the prior
applies to them directly. For CTMC movement (move_type = 1)
the model estimates a generator
rather than fractions, and the prior is evaluated on the annual
fractions obtained from it,
i.e. at
,
rather than on the seasonal fractions
stored in
.
The distinction matters once ctmc_scale_by_seasdur = 1: a
season’s movement matrix approaches the identity as the season shortens,
so a fixed
would silently become a far stronger constraint as
grows. On a three-region example the same
prior costs 1.04 nLL units at
but 9.91 at
;
evaluated annually it is 1.04 in both cases. Fixing the exponent at one
year also matches how such priors are elicited, as a belief about the
fraction of fish moving per year, independent of how the year is
partitioned. Under the legacy ctmc_scale_by_seasdur = 0 the
two coincide.
Because
is a deterministic function of the estimated CTMC parameters, the prior
still informs
under every move_timing. Note, however, that under
move_timing = 2 the seasonal operator is
,
which does not factor into movement and survival:
is then a reported diagnostic rather than a term in the dynamics, and
the prior acts as a reparameterized prior on the generator.
Choosing the concentration parameters
Writing for the concentration vector of one origin region and for the number of regions:
where behaves as the number of prior pseudo-observations, so it is the natural handle on prior strength. Two cases are worth separating:
- gives a uniform density over the simplex: every movement vector is equally likely, the contribution to the objective is constant, and the gradient is exactly zero. This is the uninformative choice.
- with is symmetric with its mode at in every region, a prior centered on equal movement among all regions, which is informative and, for a residency-dominated stock, a strong assumption rather than a vague one.
To target a particular movement vector with a chosen strength, set .
Tag Reporting Rates
Two types of priors can be specified for tag reporting rates. In particular, a symmetric beta distribution is applied:
Here, determines the scale of the tag reporting parameter and determines how strongly to penalize estimates when they approach the bounds of . Smaller values of result in larger penalties, and vice versa.
Tag reporting rate priors can also be specified as a standard beta distribution, parameterized via method-of-moments in terms of a mean and standard deviation:
where is the numerically stabilized reporting rate with the logit-scale parameter and a small constant (e.g. ). Here is the literal standard deviation of the Beta distribution and must satisfy to ensure . Note that when is large relative to , and approach zero and the Beta density becomes U-shaped, placing mass near 0 and 1. In this case, numerical instability can occur during optimization, which is why is squished away from the boundaries via the transformation.
Process Error Penalties
In addition to priors, penalties are also utilized to aid in the estimation of process errors (either penalized likelihood or integrating random effects via Laplace Approximation are possible). Currently, process errors can be specified to arise for initial age deviations, recruitment, fishing mortality, discard mortality rate, fishery and survey selectivity, and movement.
Initial Age Deviations
To estimate non-equilibrium initial age deviations, multiplicative deviations can be specified:
where deviations arise from a normal distribution with variance
.
The penalty mean
is set by InitDevs_pen_center: under "fixed"
(the default) it is the asserted prior mean (zero, or the bias-corrected
under the bias ramp), constraining both the level and the spread of the
deviations. Under "own_mean" it is the mean of the
estimated deviations themselves, so only their spread is penalized and
their level is left free; that is what a sum of squares about the
series’ own mean amounts to, and it matches the convention of
assessments whose deviation vectors are constrained to sum to zero. The
penalty has its own weight
(Wt_Init_Rec), separate from the recruitment deviation
weight, since the two penalties are dimensioned differently.
When the deviations are sex-specific
(InitDevs_sex_spec = "est_all"), each sex’s curve is
penalized, while sexes sharing one curve are penalized once (the shared
parameter is not invoked). The "own_mean" center is then
pooled over every penalized cell across ages and sexes, so the sexes
share a single estimated level.
A deviation shared across cells of the parameter array through the
map, across regions (InitDevs_spec = "est_shared_r",
RecDevs_spec = "est_shared_pop_r"), across sexes, or across
the ages past the observed range (init_age_devs_shared), is
one parameter and has one penalty. Each cell the penalty visits takes
of it, with
the number of such cells holding that level, so a series shared by three
regions is not penalized three times. Under the bias ramp the center of
the initial age deviation on age
is the ramp read at that age’s own birth year,
,
the deviation index
lying before the first model year, which is how a ramp defined on
calendar years treats the years before the model starts.
Sex-specific curves can additionally be compared to one another
(Use_init_sex_pen), a separate statement about how far
apart the sexes’ initial age structures may sit rather than about how
variable each is:
over the same ages the initial-age penalty covers, entering the objective unweighted with kept as data rather than a parameter.
Recruitment Deviations
Annual recruitment deviations can also be specified, where multiplicative deviations are assumed:
with variance
.
As for the initial age deviations, RecDevs_pen_center
selects the penalty mean
:
"fixed" (default) centers on the asserted prior mean (zero,
or the bias-corrected
when the bias ramp is active), whereas "own_mean" centers
on the mean of the estimated deviations, penalizing only their spread.
Under "own_mean" the level of the deviations is unpenalized
and must be pinned elsewhere (an
prior, or a fixed deviation), or the likelihood is flat along it; it
also cannot be combined with the bias ramp, whose
offset is meaningless once the mean is estimated rather than
asserted.
RecDevs_model specifies the process error the deviations
follow, the same three structures the fishing mortality deviations
offer. The density above is the independent case. Under
"rw" the deviations follow a random walk,
and under "ar1" they revert toward zero at rate
,
where
-
is the recruitment deviation for population
,
region
and year
,
on the log scale, estimated (
ln_RecDevs), -
is the recruitment process error standard deviation read at year
,
so it takes the early value before
sigmaR_switchand the late value from it onward, estimated (ln_sigmaR), -
is the standard deviation on year one,
RecDevs_rw_init_sigma, data, default 5. It is what sets the level of the recruitment series, since every later term is a difference. Setting it toNAuses instead, pulling the first year toward mean recruitment;dont_pen_recdev_firstdrops the term altogether, leaving the level to and the data, -
is the AR1 correlation for population
and region
,
estimated (
RecDevs_rho), transformed from the unconstrained scale by .
Both forms center each deviation on the previous one rather than on
an asserted mean, so neither reads RecDevs_pen_center and
neither can be combined with the bias ramp; both combinations are
rejected at setup. Only years the deviation map leaves in contribute a
term, and the step into year
reads year
either way, so a year left out of the penalty is one the walk passes
through rather than a gap in the series.
Three further refinements act on which deviations are penalized and
how strongly. First, only estimated deviations are penalized: cells
mapped off by hand (via map$ln_RecDevs) are excluded from
the penalty as well as from estimation. Second, the recruitment weight
(Wt_Rec) may be a per-deviation array rather than a scalar,
so individual deviations can be down-weighted or removed from the
penalty (weight zero) while remaining estimated. This is how a
stock-recruit relationship is fit over a chosen window of years while
recruitment stays effectively free elsewhere, and is distinct from
dont_est_recdev_last, which removes the deviations
themselves so recruitment reverts to the deterministic prediction.
Third, an optional penalty on the level of the recruitment series
itself (Use_rec_level_pen) can be applied, separately from
the deviation penalty:
evaluated over a chosen set of years
(rec_level_pen_yrs), with
either the mean of the log series ("own_mean", penalizing
only its variability) or zero ("fixed"). Under a
stock-recruit relationship the deviations are residuals about the
predicted curve, so a model that also wants to keep the realized
recruitment series from wandering has nowhere else to say so; this
penalty is that second, independent statement, and reproduces the
recruitment regularity penalties several existing assessments have.
State-Space Numbers at Age
The innovations from the process equations are given a zero-mean Gaussian prior whose covariance factorizes across dims, so a correlation over one dim says nothing about any other:
with standard deviation . Each factor is a correlation matrix with a unit diagonal, so only has scale, and setting every factor to the identity recovers independent innovations.
The innovation is defined only where the population has fish. Under natal homing a population may never reach a region, so there for every year and age and has no value. Writing for the cells the state runs on, the prior is taken over those cells alone,
where is the normal density. A cell with is dropped from the parameter map as well, so it is neither estimated nor penalized. Dropping a cell requires and to be the identity, since a cell inside a joint density across populations or regions cannot be left out of it.
Age and year.
is chosen with NAA_re, writing
,
and
for the age, year and cohort correlations:
NAA_re |
parameters | |
|---|---|---|
"iid" |
identity | none |
"1dar1_a" |
, years independent | |
"1dar1_y" |
, ages independent | |
"2dar1" |
the product of the two | |
"3dcond", "3dmarg"
|
Gaussian Markov random field over age, year and cohort |
These are the same forms the selectivity and growth surfaces use, so a state on the numbers at age and a surface on selectivity are penalized the same way. The three-dimensional field is the only one that does not factor into an age density times a year density, because its cohort term couples the two dims.
Population, region, season and sex.
,
,
and
are set with NAA_re_pop, NAA_re_region,
NAA_re_season and NAA_re_sex, each either the
identity or unstructured. Unstructured places no shape on how the levels
covary, at
parameters, and is the natural choice for dims with no ordering: regions
are not in a line, so a correlation decaying with distance has nothing
to decay along. Seasons do have an order, but they also wrap at the year
boundary and there are rarely more than four of them, so an unstructured
factor over the active seasons costs little and assumes less.
spans the seasons NAA_re_seasons leaves active rather than
all of them. NAA_re_region_spec and
NAA_re_season_spec set how those correlations are shared
over populations and sexes.
These enter by whitening rather than by forming the joint covariance (i.e., writing as a lower Cholesky with independent devs). With the Cholesky factor of a dim’s correlation, leaves that dim independent, so each slice is then evaluated by whatever calls for, and the log determinant of enters once per cell of the dims it does not span. A cross-region correlation therefore composes with the three-dimensional field, whose age-year block cannot be factored.
Standard deviations.
is blocked over populations, regions, years, ages and sexes with the
NAA_sigma_*blk_spec arguments, exactly as natural mortality
is. Blocking shares a standard deviation; it never removes a cell from
the state. Only "iid" admits one that varies over years or
ages, since every other form is separable or Markov in one of those dims
and a per-cell variance is neither. The rest have one standard deviation
per population, region and sex.
The full covariance. Assembled over all five dims,
of dimension , built from five small factors. The factors appear in the reverse of the array’s dim order, which is worth stating only because getting it wrong is silent: a transposed ordering still gives a valid covariance and a converging fit, reporting an age correlation that is really a year correlation. The implementation never writes the ordering down, because it whitens the dims one at a time in the order the array is dimensioned.
A worked case. Two regions, three ages (2 to 4),
three years (1995 to 1997), one population and one sex, with
NAA_re = "2dar1" and NAA_re_region = "us".
Take
,
,
region correlation
and
.
Then
and with the population and sex factors both identities the full covariance is
an matrix from four parameters. Any single correlation is the product of the three pieces. The age-3 innovation in region 1 in 1995 against the age-4 innovation in region 2 in 1996:
with covariance . Same region, same year, adjacent ages gives ; the same two ages one region apart gives .
Setting
drops
to the identity and leaves two independent single-region models. Setting
as well leaves
,
which is NAA_re = "iid".
Initial Recruitment Offset
When the initial age structure is built from its own recruitment
level (use_rinit = 1, so
is separate from
),
that level can be penalized toward the recruitment level rather than
left free (Use_rinit_pen):
The two levels are otherwise only linked through the data, and the initial age structure is often the thinnest part of it, so the penalty is a statement about how far the stock’s equilibrium recruitment may have sat from the level the modeled years show. An equilibrium recruitment stands for an average over several years rather than one, so is normally narrower than . A reasonable choice is , the recruitment variability shrunk by the number of year classes the equilibrium averages over.
Stock-Recruit Residual
When recruitment arises about a mean and a stock-recruit curve is
evaluated alongside the dynamics without generating them
(sr_penalty; see the Stock-Recruit Curve as a Penalty
section above), the curve enters the objective function through the log
residual
between the realized recruitment and the curve’s prediction:
The residual is centered on zero, and
(sr_pen_sigma) is a fixed input rather than an estimated
parameter, so the contribution is a sum of squares weighted by
up to a constant; a template with a weight
on the squared residuals corresponds to
.
The contribution is summed over the years named by
sr_pen_yrs, which defaults to every year that has a lagged
spawning biomass behind it, that is, all but the first
.
Those early years take the equilibrium substitution described in the
Recruitment Processes section rather than
,
so their residual would not be a stock-recruit residual and naming one
is an error rather than a silent fallback. Years outside the window keep
their recruitment deviations estimated and contribute nothing to this
penalty, which is how a restricted stock-recruit window is
expressed.
This penalty and the recruitment deviation penalty are separate statements about the same series. The deviation penalty acts on , an estimated parameter, about its own center, whereas this one acts on the difference between two derived quantities, so the deviations stay free to depart from the curve at a cost governed by . It sits with the process error penalties rather than the priors above because it constrains a model quantity rather than asserting knowledge about a parameter.
The penalty is a statement about the objective function alone and is not a data-generating process. Simulation, whether self-testing or closed-loop, generates recruitment from the mean parameter and its deviations exactly as the mean-recruitment equation specifies; no simulated recruitment is drawn from the curve, and plays no part in the simulated population dynamics.
Fishing Mortality Deviations
Fishing mortality deviations assume multiplicative deviations about a
mean rate. One of three process error structures can be specified via
Fdev_model: independent ("iid"), random walk
("rw"), or first-order autoregressive ("ar1").
In all three cases, the penalty is only evaluated in region
,
season
,
and fleet
combinations with observed catch (i.e.,
or any
).
IID
Fishing mortality deviations are assumed to arise from a normal
distribution with variance
.
The penalty mean
is set by Fdev_pen_center (iid model only):
"fixed" (default) centers on zero, constraining both the
level and the spread of the deviations, while "own_mean"
centers on the mean of the estimated deviations, penalizing only their
spread. Under the mean-plus-deviations parameterization the level of
fishing mortality is already set by
,
so "own_mean" avoids penalizing it twice; note it also
leaves
and the deviations’ level mutually unidentified unless one of them is
fixed, which ln_F_mean_spec = "fix" does (free annual
log-F, see the fishing mortality parameterization above).
Random Walk
Catch-active years need not be contiguous under the random walk (a fishery may close for several years and reopen later). Let denote the previous catch-active year for a given region, season, and fleet, and the number of elapsed years between them ( when catch is available every year). The first catch-active year is initialized with a large, diffuse variance; every subsequent catch-active year follows a random walk about the previous active year’s value, with variance inflated by the elapsed gap :
When catch is available every year ( throughout), this reduces exactly to a standard single-step random walk. When years are closed (e.g., a fishery closure), inflating the variance by gives exactly the same marginal distribution that would be obtained by estimating deviations for the closed years and integrating them out without actually estimating them, so no deviation parameters exist for closed years.
AR1
The AR1 form additionally estimates a correlation parameter,
(from an unconstrained parameter Fdev_rho, transformed via
).
As with the random walk, catch-active years need not be contiguous. The
first catch-active year is drawn from the process’s stationary marginal
distribution, and every subsequent catch-active year follows an AR1
transition over the elapsed gap
since the previous active year:
where is the exact variance of the sum of the intervening (unestimated) innovations that would have occurred during the closed years, and is the corresponding decay of the mean across the same gap. As with the random walk, this reduces exactly to the standard single-step AR1 transition when .
Discard Mortality Rate Deviations
Discard mortality rate deviations are penalized analogously on the logit scale:
where is the variance of the discard mortality rate deviations. The penalty is only applied in years and fleets where discard data are available.
Fishery and Survey Selectivity
A variety of process error parameterizations can be specified for fishery and survey selectivity. Across all parameterizations, multiplicative deviations are assumed. In the most basic case, iid deviations can be assumed to vary about a parameter on a given selectivity functional form:
where are selectivity deviations about a given parameter for region , year , parameter , sex , and fleet . Deviations are assumed to have a mean of 0 and a variance of , constrained by a normal distribution.
Extending the iid case, random walk selectivity deviations can also be specified about a given parameter, assuming a normal distribution:
where process error deviations for the first year are initialized
with their own standard deviation
(sel_rw_init_sigma), which defaults to a large value
()
that leaves the first year effectively unconstrained. Setting it to
NA instead starts the walk at zero under the walk’s own
,
which is what a first difference taken against a selectivity of one
amounts to and makes the first year’s deviation as smooth as every later
step. Following the first year, process error deviations follow a random
walk process with a mean conditional on the previous year’s value
()
and a variance of
.
Each fleet’s process error contribution is additionally scaled by a
per-fleet weight
(fishsel_pe_wt, retsel_pe_wt,
srvsel_pe_wt; default
)
before entering the joint likelihood. A weight of zero removes the
process error penalty for that fleet entirely while its deviations
remain estimated, which is how a model reproduces assessments that let
selectivity deviations float subject only to explicit smoothness
penalties rather than a distributional assumption.
The bin-override deviations described in the selectivity section have
their own process error (cont_tv_sel_bin_devs), either iid
or a random walk of exactly the forms above, with their own estimated
per overridden bin and their own first-year standard deviation
(sel_bin_devs_rw_init_sigma). An overridden bin that is
free of the functional form is thereby still smoothed in time when asked
to be.
In addition to being constrained by a normal distribution, both iid and random walk cases have an optional additional smoothness penalty applied:
Additionally, semi-parametric deviations can also be specified. In total, there are three options that can be utilized, two of which allow age, year, and cohort correlations, while one allows for only age or length and year correlations. In the case where age, year, and cohort correlations are specified (note that this is only possible when age-based selectivity is specified), marginal stationary variance and a conditional non-stationary variance can be invoked. The following equations describe the conditional variance version:
where we vectorize the selectivity deviations across its year and age dimensions. These deviations are then assumed to arise from a multivariate normal distribution (or Gaussian Markov Random Field) with a covariance matrix () determined by:
Here, is an identity matrix and is a diagonal matrix that determines the variance of the multivariate normal process. is a square matrix representing the partial effect of on preceding ages and/or years, governed by partial correlation coefficients for ages, years, and cohorts. To demonstrate the formulation of , a simplified example is provided with rows representing ages and columns representing years . In this example, is a matrix, where both the rows and columns represent combinations of age and year:
where , , and are parameters describing the partial autocorrelation among years within a given age, among ages within a given year, and years within a cohort, respectively. The multivariate likelihood is then defined as:
If age or length and year correlations are specified (i.e., a two-dimensional autoregressive structure), a multivariate normal likelihood is similarly assumed, but the covariance structure of this process is defined as:
where and are correlation coefficients across years and bins, respectively.
Selectivity Smoothness Penalties
A set of six penalty terms, evaluated directly on a fleet’s realized selectivity-at-bin-at-year surface rather than on any particular selectivity parameterization, can be independently weighted and applied to any selectivity functional form.
The dome-shape penalty discourages the selectivity curve from decreasing across adjacent bins within a year (i.e., encourages flat-topped or asymptotic rather than dome-shaped curves, when desired), applied only where an actual decrease occurs:
The bin (age or length) curvature penalty is a second-difference smoothness penalty across bins, normalized by the number of fitted bins :
A related, unconditional first-difference penalty across bins where both increases and decreases contribute, unlike the dome-shape penalty above which is normalized the same way:
Inter-annual variation is penalized with a first-difference penalty across years, normalized by the number of fitted years :
and inter-annual smoothness with an analogous second-difference penalty across years:
Finally, because some selectivity forms (e.g. the bicubic spline) have no built-in scale identifiability constraint (a uniform per-year shift in log-selectivity trades off exactly against that year’s fishing mortality), a mean-centering penalty regularizes the per-year mean of log-selectivity toward zero:
Each of the six terms above
(,
,
,
,
,
)
is scaled by its own independently-specified weight before being added
to the joint negative log-likelihood, allowing each to be turned on or
off and tuned separately. In code, these six weights use a
smooth_ prefix (e.g. smooth_bin_curve,
smooth_yr_diff) rather than referencing the bicubic spline
specifically, since, as described above, they apply to any selectivity
form.
Several generalizations of these penalties are available, specified per fleet (a single specification is shared by every fleet, or an unnamed list gives each fleet its own):
- Per-year weights. Every weight
may be a vector with one value per model year,
,
so a penalty can act only in the years where selectivity is allowed to
change, or act with a different strength in each year. Years with
are skipped entirely. With
normalize = FALSE(below), a per-year first-difference weight of makes exactly the negative log-kernel of a random walk with year-specific standard deviation , expressed as a penalty on the realized curve rather than on deviation parameters. - Bin range.
bin_rangerestricts the bins the penalties act over to , either one range shared by every term or a named list giving each term its own. This is how a shape penalty (e.g., the dome or curvature penalty) is confined to the older ages where the curve is expected to flatten, without constraining the ascending limb. - Normalization.
normalizecontrols whether the bin-wise weights are divided by the number of penalized bins and the year-wise weights by the number of years (the default,TRUE); it can likewise be set per term. Turn it off when weights are calibrated as explicit variances, as in the random walk correspondence above. - First-year reference. The year first-difference walk has no
predecessor in its first penalized year, so that year is normally left
unpenalized.
yr_diff_refsupplies one: the first penalized year is kept toward a reference log-selectivity vector, anchoring an otherwise free series to a known selectivity before the data begin.
Growth Deviations
Growth has two deviation surfaces, and both are penalized by the same process error routines the selectivity deviations use, so the vocabulary above has over unchanged.
A time-varying growth parameter has one deviation per year, a surface
one column wide. Under "iid" each is drawn independently
and under "rw" they form a random walk:
with one
per varying parameter
,
kept in the first data source of growth_pe_pars and
estimated under growth_tv_sigma_spec = "est", and the first
year of a walk given its own standard deviation
(growth_rw_init_sigma). Only the years named in
growth_tv_years have a deviation; the rest are kept at
zero, so a parameter can be constant early in a series and varying once
the data can support it.
The semi-parametric surface
runs over years and ages, so all five structures are available to it:
"iid" and "rw" as above, "2dar1"
for a separable first-order autoregression over ages and years, and
"3dmarg"/"3dcond" for the three-dimensional
Gaussian Markov random field over age, year and cohort described for
selectivity, on the marginal or conditional variance. The correlated
forms are the ones that make a growth surface estimable in practice: the
deviations are not identified year by year and age by age from length
data alone, and it is the correlation that lets neighboring ages and
years share information. Its hyperparameters live in the second data
source of growth_pe_pars, in the same slots the selectivity
forms use, and the surface can be restricted to the ages and years the
length data inform through growth_semipar_ages and
growth_semipar_years.
Both enter the objective unweighted, reported as and .
Movement
Time-varying movement is introduced through process error deviations, , which modify baseline movement parameters. The interpretation of these deviations depends on the movement formulation, but their stochastic structure is shared.
General Structure
Movement deviations are assumed to be independent and normally distributed:
where may be shared across dimensions depending on the selected process error model.
Only valid origin-destination pairs (i.e., adjacent regions) are assigned deviations.
Unstructured Markov Movement
For multinomial logit movement, deviations enter additively in logit space:
Thus, time variation is expressed as year-specific perturbations around a mean logit, and movement probabilities are obtained via the softmax transform.
CTMC Movement
For CTMC movement, deviations act on the transition rates rather than logits. Specifically, deviations are applied multiplicatively to the off-diagonal diffusion terms:
where: - is the baseline diffusion rate (constructed from covariates and parameters, with year lookups capped at ), - is the deviation applied on the log scale.
This formulation implies that: - deviations are log-multiplicative on movement rates, - acts as a proportional scaling factor, - time variation persists into projection years even when baseline covariates are kept fixed.
Deviations are applied only to off-diagonal elements (i.e., actual transitions), and the diagonal of the generator matrix is recomputed to preserve mass balance.
Likelihood for Deviations
The movement process error contribution to the log-likelihood can be written explicitly as:
where the summation is taken over all valid origin-destination pairs (i.e., and adjacency), and over all indices of population (), year (), season (), age (), and sex ().
Variance Structures
Different process error models specify how is shared across dimensions. These correspond to IID assumptions over subsets of:
- population (),
- year (),
- season (),
- age (),
- sex ().
For example: - IID across years: , - IID across years and ages: , - Fully stratified: .
These structures control the degree of temporal and demographic heterogeneity in movement variability.
Joint Likelihood
Lastly, the joint likelihood to be minimized represents the sum of all observational likelihood components, priors, and penalties defined above:
Note that some of these components may be zero (i.e., if no priors are used) depending on the configuration of the model. The recruitment and initial age deviation penalties enter with their own separate weights (, possibly per deviation, and ), while the recruitment level penalty and the stock-recruit residual penalty , when enabled, each enter as their own additional component with no weight of their own.
References
Kristensen, K., Nielsen, A., Berg, C.W., Skaug, H., Bell, B., 2016. TMB: Automatic Differentiation and Laplace Approximation. J. Stat. Soft. 70. https://doi.org/10.18637/jss.v070.i05
Mace, P.M., Doonan, I.J., 1988. A Generalized Bioeconomic Simulation Model for Fish Population Dynamics. MAFFish, N.Z. Ministry of Agriculture and Fisheries.
McGarvey, R., Feenstra, J.E., 2002. Estimating rates of fish movement from tag recoveries: conditioning by recapture. Can. J. Fish. Aquat. Sci. 59, 1054-1064. https://doi.org/10.1139/f02-080
Methot, R.D., Taylor, I.G., 2011. Adjusting for bias due to variability of estimated recruitments in fishery assessment models. Can. J. Fish. Aquat. Sci. 68, 1744-1760. https://doi.org/10.1139/f2011-092
Monnahan, C.C., 2024. Toward good practices for Bayesian data-rich fisheries stock assessments using a modern statistical workflow. Fisheries Research 275, 107024. https://doi.org/10.1016/j.fishres.2024.107024
Thorson, J.T., Johnson, K.F., Methot, R.D., Taylor, I.G., 2017. Model-based estimates of effective sample size in stock assessment models using the Dirichlet-multinomial distribution. Fisheries Research 192, 84-93. https://doi.org/10.1016/j.fishres.2016.06.005