Fetches coefficients from FishBase and SeaLifeBase via
coasts::get_taxa_morphometrics() and collapses them to one coefficient
pair per taxon code, the same aggregation Mozambique uses: geometric mean
of a, arithmetic mean of b.
Value
A list with expanded (the taxon-to-species expansion) and
length_weight (alpha3_code, n_studies, lw_a, lw_b).
FAO area filtering
Coefficients are restricted to the FAO major fishing areas in
conf$metadata$fishbase$fao_areas — 57 and 71 for Timor-Leste, which
straddles the Eastern Indian Ocean and the Western Central Pacific. Do not
leave that key unset: coasts::resolve_fao_areas() falls back to c(51, 57),
the Indian Ocean pair the WIO pipelines use, which would filter Timor on one
wrong area and miss the Pacific one entirely, silently.
The filter was off until 2026-09-05, justified as "body form does not stop
applying at an area boundary". That answered the wrong question — the filter
removes species from the pool, it does not invalidate a coefficient. The
measured reason to have it on is that the unfiltered pools are dominated by
species that do not occur in Timor: CLP was priced off 114 records of
Clupea harengus (Atlantic herring) and 36 of Sprattus sprattus.
strip_parentheticals is on because several FAO names carry a bracketed
synonym ("Haemulidae (=Pomadasyidae)") and match nothing as written.
Length types
A published pair W = a * L^b is fitted on whichever axis the study used —
Type is TL, FL, SL, CL, … — but every length reaching
join_weights() is a total length. Pooling the pairs as published
therefore averaged fork-length and standard-length fits into one number and
applied it to TL, which overestimates weight, because FL and SL are shorter
than TL (medians here: FL 0.958 TL, SL 0.827 TL).
length_length, fetched by the same call, restates every convertible pair on
a TL basis. POPLL fits
Length1 = aL + bL * Length2 — the second column is the predictor — so
the ratio L_type / TL is bL when Length2 is TL and 1 / bL when
Length1 is. Substituting L_type ~= ratio * TL into W = a * L_type^b
gives W = a * ratio^b * TL^b: b is unchanged and only a is
rescaled. Fits with an intercept above 1 cm are not proportional and are
skipped; per species and type the median ratio is used.
length_types = NULL is passed for this reason. The coasts default keeps
only TL/FL pairs, which would leave the 460 SL rows unconvertible —
and SL is where the error is largest.
Measured on Timor's taxa: of 1,648 non-TL pairs, 1,363 convert and 285 do
not. The 285 are kept as published rather than dropped. Dropping them
takes MOO down 92% and SFA 78% — those taxa's fetched pairs carry them,
and what is left is a curated supplement fitted on a different axis again.
Zanzibar 4.9.0 converts only for taxa that would otherwise have nothing;
Timor converts everything it can, which is why no Type filter is needed
here (see summarise_lw_coeffs()).
What is pooled in
Timor's 559 curated rows over 11 mostly-invertebrate codes, from
curated_lw_coeffs(). They carry no FAO area, so they are bound on after
the filter and are never area-restricted — and, being bound after the
conversion above, they are never restated either. That is deliberate: their
Type values (CW, ShL, ML, CL) are invertebrate axes FishBase
carries no conversion for, and field practice measures those taxa on total
length anyway.