Yes — very familiar.
Stock Synthesis (SS) is NOAA’s and the ISC’s go-to integrated stock assessment framework, and it’s widely used globally (MSC, WCPFC, IATTC, etc.). It’s built around a statistical, age-structured population dynamics model, and it can integrate a huge range of data types within a single likelihood framework.
Here’s a concise technical breakdown of its structure:
At its heart, SS implements a forward-projected age-structured model with:
Recruitment (often log-normal deviations from a stock-recruit curve, usually Beverton-Holt).
Growth (typically von Bertalanffy; can be time- or sex-specific).
Natural mortality (M) — fixed or estimated, can vary with age or sex.
Fishing mortality (F) decomposed by fleet, season, and selectivity function.
Spawning biomass computed from mature female abundance × weight-at-age × maturity.
It simulates cohorts moving through time, subject to mortality and fishing, and tracks the resulting biomass and catch at age/size.
SS is “data-rich” — it uses multiple data likelihoods simultaneously:
| Data type | Modeled as | Purpose |
|---|---|---|
| Total catch (by fleet/year) | Observation error (lognormal) | Constrains removals |
| CPUE indices / surveys | Lognormal or normal errors | Abundance trends |
| Age/length compositions | Multinomial or Dirichlet | Size/age structure |
| Tag-recapture | Binomial / negative binomial | Movement & mortality |
| Mean size-at-age or weight-at-age | Normal | Growth validation |
| Environmental covariates (optional) | Linear predictor | Recruitment or selectivity links |
Each component contributes to the joint likelihood (often weighted).
Uses maximum likelihood (with optional Bayesian priors or MCMC).
Key estimated parameters:
Virgin recruitment (R₀), steepness (h) of the stock–recruit curve.
Selectivity parameters for each fleet (often logistic).
Catchability (q) for CPUE indices.
Variance parameters (σ for process & observation errors).
Penalized likelihood adds constraints (e.g., for recruitment deviations, F-smoothness).
Each fleet (gear type or country) can have its own selectivity curve (logistic, double-normal, cubic spline, etc.).
Allows time-varying selectivity or time blocks for changes in fishing behavior or gear.
Multiple seasons and areas can be modeled (multi-area movement possible).
Recruitment deviations are estimated annually or in blocks.
Optionally linked to environmental covariates or spawning biomass through a stock–recruit relationship (usually Beverton–Holt, sometimes Ricker).
Deviations are penalized via lognormal distribution with σR.
Key outputs include:
Time series of spawning biomass, recruitment, F, depletion, MSY, etc.
Derived reference points: SB₀, SBMSY, FMSY, B/BMSY, F/FMSY.
Residual plots, likelihood profiles, and diagnostics for each data source.
Sensitivity runs (alt M, h, selectivity, weighting).
Retrospective analyses and hindcasting.
Input via text control files: starter.ss, data.ss, control.ss, forecast.ss.
Outputs to .rep, .par, .sso files for diagnostics and visualization.
Common wrappers: R packages r4ss, ss3sim, and SS-DOM for simulation and MSE.
Actively maintained by NOAA’s SWFSC (Rick Methot et al.).
Used by:
ISC (for North Pacific albacore, bluefin, billfish).
WCPFC, IATTC, and IOTC.
U.S. NMFS for most domestic assessments (groundfish, pelagics).
MSC CABs and client fisheries to interpret quantitative scoring under PIs 1.1–1.2.
Short, blunt answer: Stock Synthesis can’t put explicit state-space random effects directly on NAA (numbers-at-age) the way WHAM/SAM do. If you want the effect the abstract describes, you approximate it in SS by letting process noise act on the drivers of NAA and on availability, especially in multi-area setups—i.e., cohort (recruitment) deviations + time-varying survival/availability/selectivity/q. That’s the practical “default starting point” in SS.
Here’s exactly how to implement the closest SS equivalent, step-by-step.
This is your primary “NAA RE” in SS.
Recruitment devs (annual): turn them ON and set a realistic sigmaR.
Early rec devs: turn ON so noise propagates into older ages in the initial population.
Bias-adjustment ramp: enable and tune so rec residuals are centered and not distorted.
Multi-area? Use area-specific recruitment (split of R0 across areas, or area-specific devs) so movement/availability mis-spec is partly absorbed via where cohorts “arrive.”
Effect: you get cohort-wise stochasticity that flows through all ages → a big chunk of what people want when they say “RE on NAA.”
Since explicit ε on NAA isn’t available, you let availability to fleets/indices vary stochastically:
Time-varying selectivity (per fleet & area):
Enable year-to-year deviations (random-walk style with a penalty/SD) on 1–2 key selectivity parameters (e.g., double-normal peak or logistic inflection).
Interpretation: small annual shifts ≈ changes in age/size availability (or de facto movement into the sampled area).
Index catchability (q) deviations (per index & area):
Turn ON modest q-devs (again as a RW with a small SD).
Interpretation: absorbs survey availability swings and minor spatial shifts.
Time blocks (if you prefer regime changes):
Use blocks instead of annual devs when you believe availability shifts in steps (e.g., regime shift, distribution change).
Effect: these deviations let the model explain spatial/temporal variation in observed age structure and abundance without having to estimate explicit movement rates—mirroring what the abstract advocated.
If availability alone doesn’t cut it, allow limited process variance on mortality:
Time-varying M (by area or globally):
Pick an M parameterization that allows deviations (blocks or RW with a tight SD).
Use small SDs; this can confound with selectivity and recruitment if you overdo it.
Effect: minor changes in survival propagate to NAA across ages/years.
In control.ss (conceptually):
Recruitment
Set sigmaR (start conservative), enable main rec devs (phase > 0).
Enable early rec devs; define early and main dev windows.
Turn on bias-adjustment and set the ramp (early yrs 0 → modern yrs ~full adjustment).
Selectivity deviations (per key fleets, and per area if fleets are area-specific)
Choose selectivity form (logistic or double-normal).
Enable time-varying devs on 1–2 parameters; set dev method ~ random-walk with small dev SD (e.g., 0.03–0.10 to start) and an estimation phase.
Apply to years where you actually have data support.
Index q deviations
Enable q-devs with a small SD for indices that show availability swings.
M deviations (optional)
If used, keep one simple lever (e.g., a global offset or area-level offset) with small SD. Prefer blocks over annual devs unless you truly have signal.
Multi-area setup
Assign fleets/indices to areas; consider area-specific recruitment (split parameters) so cohorts originate in plausible places.
If you already have explicit movement matrices, keep them simple; rely on availability/q devs to mop up unmodeled fine-scale movement.
Start with small SDs on all devs (selectivity, q, M). Increase only if diagnostics show persistent, structured misfit.
Re-tune data weights (compositions, index CVs) after enabling devs.
Diagnostics:
Rec bias-adjustment plots (should look reasonable).
Dev traces for selex/q/M: should look like stationary RWs, no big drift.
Residual age/length patterns should flatten.
Retrospectives: improved stability is the tell-tale sign you’ve captured the missing process.
Likelihood profiles on R0, h, key selex parms to check confounding.
Hindcast/prediction skill for indices.
If your fish truly moves a lot among areas (as the abstract warns), these SS proxies degrade. If you need formal ε_{a,t} on log N with AR1 across ages/years, run WHAM or SAM for the state-space fit, then port insights back to SS (e.g., which component needs more/less variance).
Rec: sigmaR ~ 0.4–0.6; main devs ON, early devs ON; bias-adj ramp from early years (0–0.2) → recent years (0.8–1.0).
Selex devs (per key fleet/area): RW with dev SD ~ 0.05; devs start only after the fleet begins; limit to 1–2 parameters.
q devs (per index/area): RW with dev SD ~ 0.05.
M devs (optional): blocks or RW with dev SD ~ 0.02–0.05; only if clearly needed.
That’s the SS playbook to implement what the abstract recommends in a state-space setting: use recruitment + availability/survival devs to stand in for NAA RE, especially in multi-area models where explicit movement isn’t feasible.
control.ss that implements the closest Stock Synthesis analogue to random effects on NAA: (1) recruitment deviations (incl. early devs + bias adjustment), (2) time-varying selectivity via random-walk devs on 1–2 key parameters per fleet/area, (3) q-deviations for indices, and (4) optional M deviations (tight).
Use this as a scaffold and swap your fleet/area IDs and years to match data.ss.
SS version: SS3.30.x
Years below are examples; replace with your model’s start/end in starter.ss and data.ss.
“RW devs” here are implemented via time-varying parameter deviations with small SD penalties.
Goal: put process error on cohorts so variability propagates through ages.
# --- Stock-recruit setup --- SR_function: 3 # 3 = Beverton-Holt SR_LN(R0): 10.50 0.05 8.0 14.0 4 # init, priorSD, lo, hi, phase SR_h (steep): 0.80 0.10 0.20 0.999 4 # estimate steepness if data supports SR_sigmaR: 0.50 # process SD on recruitment SR_envlink: 0 # 0 = none (add later if needed) # --- Recruitment deviations control --- recdevs_on: 1 # 1=estimate main recruitment devs recdev_phase: 4 # turn on in phase 4 (example) recdev_first_yr: 1975 # main dev window start recdev_last_yr: 2024 # main dev window end (data end year) early_recdevs_on: 1 # 1=estimate early devs early_recdev_first_yr: 1955 # early dev window start (fills ages) early_recdev_last_yr: 1974 # early dev window end recdev_do_bias_adj: 1 # enable bias adjustment # Bias adjustment ramp (year value), pairs end with -9999 # Start low in early years → near 1.0 in modern years biasadj_list: 1960 0.00 1970 0.20 1990 0.60 2010 0.90 2020 1.00 -9999 0
Tips
Start SR_sigmaR around 0.4–0.6.
Use early rec devs so the initial age structure isn’t overly rigid.
Tune the bias-adj ramp after first runs (use SS plot outputs).
Goal: let availability to fleets/indices drift slightly year-to-year, which soaks up unmodeled movement/space effects.
Pick one or two key selex parameters per fleet (e.g., logistic Inflection and Slope, or double-normal Peak). Keep SDs small.
# --- Selectivity patterns per fleet --- # Example: Fleet 1 (fishery) uses logistic selectivity with 2 parms (Inflection, Slope) fleet: 1 selex_pattern: 1 # 1 = logistic selex_parm1 (Inflection): 50.0 0.2 20 120 3 selex_parm2 (Slope): 5.0 0.2 0.1 20 3 # Time-varying (devs) settings for Fleet 1 selex # dev_type: 2 = random walk, set dev years and SD selex_parm1_timevary: use_devs: 1 dev_type: 2 dev_minyr: 1990 dev_maxyr: 2024 dev_SD: 0.05 # start tight dev_phase: 5 selex_parm2_timevary: use_devs: 1 dev_type: 2 dev_minyr: 1990 dev_maxyr: 2024 dev_SD: 0.05 dev_phase: 5 # Example: Fleet 2 (survey index) double-normal (Peak, TopWidth) fleet: 2 selex_pattern: 24 # e.g., double-normal length selex selex_parm1 (Peak): 55.0 0.3 30 100 3 selex_parm2 (TopWidth): 8.0 0.3 1 25 3 selex_parm1_timevary: use_devs: 1 dev_type: 2 dev_minyr: 1995 dev_maxyr: 2024 dev_SD: 0.06 dev_phase: 5
Tips
Keep devs to 1–2 parameters per fleet; small SDs (0.03–0.10).
Only allow devs in years with data support for that fleet.
If you prefer regimes, use time blocks instead of annual devs.
Goal: capture survey availability swings (another proxy for spatial dynamics).
# --- q setup for survey fleets (index components) --- index_fleet: 2 q_initial: -1.50 0.5 -10 5 3 # ln(q) or q depending on your config q_timevary: use_devs: 1 dev_type: 2 dev_minyr: 1995 dev_maxyr: 2024 dev_SD: 0.05 dev_phase: 5 extraSD_for_index: 0.0 # keep 0 initially; add only if needed
Tip: Turn on q-devs only for indices with visible interannual availability noise.
Goal: allow tiny survival-side variation only if necessary (can confound with selex/recruitment).
# --- Natural mortality setup --- # Example: Age-invariant ln(M) with optional random-walk devs ln_M_parm: -1.61 0.20 -3.0 -0.2 -1 # fix first (phase -1) and add devs later if needed # If/when needed, estimate M with tight bounds and small devs: ln_M_parm: -1.61 0.20 -3.0 -0.2 3 # now estimated M_timevary: use_devs: 1 dev_type: 2 dev_minyr: 1990 dev_maxyr: 2024 dev_SD: 0.02 dev_phase: 6
Tip: Try to fit without M devs first. Add only if diagnostics show persistent survival-pattern misfit.
Assign fleets/indices to Areas in data.ss.
In control.ss, split recruitment (R0 fraction by area) or allow area-specific recruitment devs if supported by your setup.
Keep explicit movement simple; let selex/q devs absorb fine-scale annual variability.
Start with composition effective sample sizes and index CVs that reflect reality; re-tune after enabling devs.
Avoid cranking lambdas to “force” fits—prefer sensible dev_SD values and believable data weights.
Recruitment bias-adjustment plot → recent years near 1.0; no obvious bias.
Dev traces (selex/q/M) → stationary RW (no big linear drift).
Residual age/length patterns → flatter after enabling devs.
Retrospectives → reduced peel bias vs. no-devs case.
Likelihood profiles on R₀, h, key selex parms → check for confounding.
Hindcast index skill (fit to withheld tail years) → should improve.
starter.ss
Turn on detailed output and ensure yrs cover early rec-devs.
Make sure initial year ≤ early_recdev_first_yr.
forecast.ss
Set recruitment treatment in projections consistent with sigmaR (e.g., recent mean with σR).
Don’t project with wildly drifting selex/q—keep future devs off unless you’re testing scenarios.
Implement recruitment devs (incl. early) + bias-adj ramp.
Enable selex devs for 1–2 key fleets with dev_SD ≈ 0.05.
Add q devs for 1–2 indices if they’re noisy (dev_SD ≈ 0.05).
Re-tune weights; check diagnostics.
Only if needed, add tight M devs.
If you paste your fleet list (fishery/survey IDs, start years) and model year range, I’ll fill this template with your exact numbers and phases so you can run it as-is.
--
You received this message because you are subscribed to the Google Groups "SS3 - Forum" group.
To unsubscribe from this group and stop receiving emails from it, send an email to ss3-forum+...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/ss3-forum/CAFmxBYVG8%2Bx34Y0OSzGnqZDegZ0h9Nc4hk0d4kX9roqOJg-t%2Bw%40mail.gmail.com.
This Message Is From an Untrusted SenderYou have not previously corresponded with this sender.See https://itconnect.uw.edu/email-tags for additional information. Please contact the UW-IT Service Center, he...@uw.edu 206.221.5000, for assistance.
To view this discussion visit https://groups.google.com/d/msgid/ss3-forum/CAEqtY7dDXv26GG5E_UMNuDrUed3igd79QBwNC5%3D7ZBOhcrCMzQ%40mail.gmail.com.
Does ChatGPT have access to subscription based material (e.g., non-open source papers). If not, it is missing a majority of knowledge, including most of the CAPAM special issue papers.
My experience is that if you ask ChatGPT or similar a question like these, which are already summarized in a website or user manual, it does very well, often semi-regurgitating the information. But if you ask a question that isn’t, the answer still looks good at face value, but if you know the subject you find a lot of BS.
To view this discussion visit https://groups.google.com/d/msgid/ss3-forum/CAEc9JZO0ds4Mz%2Bfb5OZi8-bT3L0eH6t4WgLw%3DyNgJ2LAud%3DqVQ%40mail.gmail.com.
To view this discussion visit https://groups.google.com/d/msgid/ss3-forum/SN6PR02MB56480AC552C4F787BBF1B4A6CCA2A%40SN6PR02MB5648.namprd02.prod.outlook.com.
To view this discussion visit https://groups.google.com/d/msgid/ss3-forum/CAFmxBYVQitBM3fF7NJHDH0bdcNEVq0Xoet_mGvQGbv7Uw%2BJ-Lw%40mail.gmail.com.