The FAO catch statistics give one value per year for each fishing area, without any detail within the area. The package therefore gives the sea surface temperature (SST) in the same form: one row per FAO major marine fishing area and year. It uses it to compare the catch with the temperature of the sea, through the mean temperature of the catch (MTC).
🌡️ Sea surface temperature of the FAO areas
fao_area_sst() returns the yearly SST of the 19 FAO
major marine fishing areas. Every call says which SST data it uses:
sst27 <- fao_area_sst("27")
#> SST: NOAA ERSST v5, built into the package (FAO major areas; 2 x 2 degrees, monthly; In situ only: ships and buoys (ICOADS), Argo floats from 1999; 1950-2025; Huang et al. (2017) Journal of Climate 30: 8179-8205). See ?fao_area_sst to use other SST data.
head(sst27[, c("area_en", "year", "sst_mean", "sst_p10", "sst_p90", "sst_min_month", "sst_max_month")])
#> area_en year sst_mean sst_p10 sst_p90 sst_min_month sst_max_month
#> 1 Atlantic, Northeast 1950 9.247 -0.789 18.017 6.883 12.478
#> 2 Atlantic, Northeast 1951 9.236 -1.078 18.021 6.932 12.572
#> 3 Atlantic, Northeast 1952 9.329 -0.964 18.152 7.045 12.778
#> 4 Atlantic, Northeast 1953 9.487 -0.836 18.371 7.171 12.913
#> 5 Atlantic, Northeast 1954 9.333 -0.751 17.905 7.095 12.481
#> 6 Atlantic, Northeast 1955 9.358 -1.046 18.493 6.954 12.753| Argument | Meaning | Default |
|---|---|---|
area |
FAO area codes (e.g. "27") or names as in the FAO data
(e.g. "Atlantic, Northeast") |
NULL: all 19 areas |
sst |
The SST data: "ersst5" (built in), the name of a
product downloaded with download_sst_data(), or the path of
a NetCDF file or of a folder of NetCDF files |
the sst setting of fao_settings(),
"ersst5" unless changed |
variable |
Name of the SST variable in your NetCDF files |
NULL: found from its name |
data_dir |
Folder where downloaded data and computed tables are kept | fao_data_dir() |
| Column | Meaning |
|---|---|
product, source
|
The SST product and the SST data used |
area_code, area_en, year
|
FAO area and year |
sst_mean |
Mean SST of the area: the mean of the 12 monthly area means (°C) |
sst_p10, sst_p90
|
Range within the area: 10th and 90th percentiles of the yearly SST of its grid cells, weighted by area |
sst_min_month, sst_max_month
|
Seasonal range: the coldest and warmest monthly area means. In areas on both sides of the equator the seasons of the two hemispheres partly cancel, so this range is narrow there |
n_cells |
Number of grid cells in the area |
downloaded |
Date the data were downloaded or computed |
The built-in SST: NOAA ERSST v5
The package comes with one SST product, to keep it small:
| NOAA ERSST v5 | |
|---|---|
| Provider | NOAA National Centers for Environmental Information |
| Grid | 2° x 2° (about 220 km), monthly |
| Years in the package | 1950–2025 |
| Observations | In situ only: ships and buoys (ICOADS), Argo floats from 1999 |
| Sea ice | About -1.8 °C under ice |
| Licence | NOAA data: may be used and redistributed for free |
| Cite | Huang et al. (2017), see the references |
ERSST v5 is the smallest of the common SST products and is consistent over the whole period, since it uses no satellite data. Its 2° grid is coarse for small areas: the Mediterranean and Black Sea (area 37) has only 96 cells.
Using your own SST data
Any other gridded SST can be used by giving the path of its NetCDF file, or of a folder of NetCDF files, either for one call or once for the session:
fao_area_sst("27", sst = "D:/data/HadISST_sst.nc") # one call
fao_settings(sst = "D:/data/HadISST_sst.nc") # all functions, for the session
mean_temperature_catch(FAO27$area_data) # now uses this file
fao_settings(sst = "ersst5") # back to the built-in SSTThe files are read as follows:
- They must hold an SST variable with longitude, latitude and
time, monthly or daily (e.g. HadISST, COBE-SST2, OISST, ERSST,
or a climate model output). The variable is found by its name
(
sst,analysed_sst,tos, …); give it asvariable = "..."if not. - Longitudes may run from -180 to 180 or from 0 to 360. Values in kelvin are converted to °C. If there are several depths, the first (the surface) is used. Values below -5 °C, which some products use to mark sea ice (-1000 in HadISST1), are set to -1.8 °C.
- Daily values are averaged by month, and only years with all 12 months are kept. Grids finer than 1° are first averaged to about 1°.
- The yearly area means are computed the first time, which can take a
few minutes, and saved in the
sstfolder offao_data_dir(). Later calls with the same files read the saved table; if the files change, the table is computed again. - Reading NetCDF files needs the ncdf4 package (Pierce 2025):
install.packages("ncdf4").
Downloading common SST products
fao_sst_products() (no arguments) lists the products the
package knows, with their provider, grid, first year, data sources,
treatment of sea ice, licence, reference (citation,
doi), web page (homepage), download server and
approximate size per year (mb_per_year):
knitr::kable(fao_sst_products()[, c("product", "name", "grid", "first_year", "data_sources", "mb_per_year")])| product | name | grid | first_year | data_sources | mb_per_year |
|---|---|---|---|---|---|
| ersst5 | NOAA ERSST v5 | 2 x 2 degrees, monthly | 1854 | In situ only: ships and buoys (ICOADS), Argo floats from 1999 | 0.78 |
| hadisst1 | Met Office HadISST1 | 1 x 1 degree, monthly | 1870 | In situ: Met Office Marine Data Bank (with GTS reports from 1982) and ICOADS monthly medians 1871-1995; reduced-space optimal interpolation | 3.10 |
| cobe2 | JMA COBE-SST2 | 1 x 1 degree, monthly | 1850 | In situ SST and sea-ice observations; satellite observations used to reconstruct variability where observations are few | 3.40 |
| oisst21 | NOAA OISST v2.1 | 0.25 x 0.25 degree, monthly means of daily analyses (averaged to 1 degree by the package) | 1982 | Satellite (AVHRR), ships, buoys and Argo floats | 11.00 |
download_sst_data() downloads one of these products, one
year at a time, and computes its table. It is then used by its name,
e.g. sst = "hadisst1":
download_sst_data("hadisst1") # about 240 MB; run again to resume
fao_area_sst("27", sst = "hadisst1")| Argument | Meaning | Default |
|---|---|---|
product |
"ersst5", "hadisst1", "cobe2"
or "oisst21" (for ERSST v5, whose table is built in, the
years published since are added) |
"ersst5" |
years |
Years to download |
NULL: from 1950 (1982 for OISST v2.1) to the last
complete year |
data_dir |
Folder where the files are kept (in its sst folder,
with files.csv recording where and when each was
downloaded) |
fao_data_dir() |
overwrite |
Download again the years already downloaded | FALSE |
quiet |
Print no progress messages | FALSE |
Years already downloaded are skipped, so an interrupted download is
resumed by running the function again. It returns the area table, as
fao_area_sst(). SST products use different observations and
methods (HadISST1: Rayner et al. 2003; COBE-SST2: Hirahara et al. 2014;
OISST v2.1: Huang et al. 2021), so their values and trends differ
somewhat. Repeating an analysis with a second product shows how much a
result depends on the product.
How the area means are computed
Each grid cell counts for each FAO major area it overlaps, weighted by the area of the overlap computed on the sphere. Cells on a boundary between two areas are shared, and coastal cells count for their sea part only. The areas are those of the FAO map in the package (the 19 marine areas of the CWP handbook). Values over the Arctic Sea and the Antarctic areas partly reflect sea ice rather than measured water temperature.
🧩 Subareas and divisions (extension)
fao_area_sst(level = "division") gives the SST of the
FAO subareas and divisions, the units of the catch data by division
(load_fao_divisions(), see 💾 FAO
data). The built-in ERSST v5 table covers the subareas and divisions
of areas 34, 37, 47 and 51; downloaded products and your own NetCDF
files give all of them.
div <- fao_area_sst(level = "division")
#> SST: NOAA ERSST v5, built into the package (FAO subareas and divisions of areas 34, 37, 47 and 51; 2 x 2 degrees, monthly; In situ only: ships and buoys (ICOADS), Argo floats from 1999; 1950-2025; Huang et al. (2017) Journal of Climate 30: 8179-8205). See ?fao_area_sst to use other SST data.
show_table(subset(div, startsWith(area_code, "37.") & year == 2024)[, c("area_code", "area_en", "sst_mean", "n_cells")], n = 12)| area_code | area_en | sst_mean | n_cells | |
|---|---|---|---|---|
| 1215 | 37.1 | Western subarea | 19.96 | 31 |
| 1291 | 37.1.1 | Balearic | 19.95 | 16 |
| 1367 | 37.1.2 | Gulf of Lion | 18.88 | 6 |
| 1443 | 37.1.3 | Sardinia | 20.19 | 16 |
| 1519 | 37.2 | Central subarea | 21.60 | 32 |
| 1595 | 37.2.1 | Adriatic | 19.69 | 6 |
| 1671 | 37.2.2 | Ionian | 21.76 | 28 |
| 1747 | 37.3 | Eastern subarea | 22.38 | 26 |
| 1823 | 37.3.1 | Aegean | 21.46 | 13 |
| 1899 | 37.3.2 | Levant | 22.96 | 15 |
| 1975 | 37.4 | Black Sea subarea | 16.97 | 17 |
| 2051 | 37.4.1 | Marmara Sea | 20.58 | 1 |
Many divisions are small for a 2° grid: the Sea of Marmara and the Sea of Azov have one or two cells. A finer product, given as the path of its NetCDF files, suits divisions better.
🐟 Mean temperature of the catch
The mean temperature of the catch (MTC; Cheung et al. 2013) is the average preferred temperature of the species caught, weighted by their catch:
where is the preferred temperature of species and its catch in year ; both sums are over the items that have a preferred temperature. A rising MTC means that species of warmer waters make up a larger part of the catch.
FAO27 <- fishing_area_data("Atlantic, Northeast", plot = FALSE)
mtc <- mean_temperature_catch(FAO27$area_data)
mtc$trend # slopes (°C per decade), Mann-Kendall test, correlation with SSTThe preferred temperatures come from FishBase and SeaLifeBase
(TempPrefMean), matched to the FAO species items by
fishbase_match(); how the data are obtained and matched is
explained in 🐠 FishBase and SeaLifeBase
traits. With the default version = "latest", the first
run downloads the FishBase and SeaLifeBase tables it needs (about 23 MB)
when online; offline, it uses the newest downloaded release, or else the
table built into the package. version = "builtin" always
uses the built-in table, without download.
The chart shows the MTC with the SST of the area (and its range
within the area) and, below, the share of the catch that has a preferred
temperature (the coverage). Years in which this share is below
min_coverage are faded and left out of the trends. Trends
are computed over all years and over the years from
trend_from: the slope of a linear regression (°C per
decade), a Mann-Kendall test (Mann 1945; Kendall 1975) corrected for
autocorrelation as in peak_trend() (Yue and Wang 2004), and
the Pearson correlation of MTC and SST, for the series and for their
year-to-year differences.
| Argument | Meaning | Default |
|---|---|---|
area_data |
FAO catch data: fishing_area_data()$area_data, or any
subset of load_fao_data() (several areas give one MTC per
area) |
required |
version |
FishBase and SeaLifeBase release, e.g. "26.06";
"builtin" for the table built into the package (see
fishbase_match()) |
"latest" |
min_coverage |
Minimum share of the catch (%) made up by items with a preferred
temperature; years below it are faded, marked in the table and left out
of the trends and correlations (0 keeps all years) |
50 |
trend_from |
First year of the second trend period (the period studied by Cheung et al. 2013 starts in 1970) | 1970 |
use_match |
Kinds of match (match_type of
fishbase_match()) whose preferred temperature is used |
c("exact", "synonym", "WoRMS valid name (exact)", "WoRMS valid name (synonym)", "manual") |
match |
A checked match table to use instead of running
fishbase_match(): a data frame, or the path of a CSV file
such as the species table of a previous run (needs
species_en, match_type and
temp_pref_mean) |
NULL |
sst |
SST to compare with: "ersst5", a downloaded product,
the path of NetCDF files, FALSE for none, or a data frame
with area_code (or area_en), year
and sst_mean (optionally sst_p10,
sst_p90) |
the sst setting of fao_settings(),
"ersst5" unless changed |
plot |
Save the charts in figures/png/summary/
|
TRUE |
table |
Save the tables in tables/
|
TRUE |
lang |
Language of the chart text and names: "en",
"zh" or "both"
|
NULL: the language of fao_settings()
|
pptx |
Also save the charts as editable PowerPoint files in
figures/pptx/summary/
|
FALSE |
plot_show |
Also draw each chart in the plot window (e.g. the Plots pane of RStudio) as it is saved |
FALSE, or plot_show of
fao_settings()
|
label |
Name at the start of the output file names | the fishing area (or country) of the data |
data_dir |
Folder where downloaded data are kept | fao_data_dir() |
The function returns yearly (MTC, coverage, SST and its
product by area and year), trend (slopes, Mann-Kendall
tests and correlations by area and period) and species (one
row per area and FAO species item).
🧩 By division (extension)
With catch data by division, by = "division" gives the
MTC of each division, compared with the SST of the division:
med <- load_fao_divisions("GFCM")
mtc_divisions <- mean_temperature_catch(med, by = "division")Divisions without a boundary on the FAO map use the SST of their
subarea (column sst_unit), codes that are not places
(e.g. 37.0.0 Tunas) have no SST, and the function says which divisions
have fewer than 5 grid cells.
⚠️ What the package does, and what you must check
The package computes the MTC, its trends and its comparison with SST.
The preferred temperature of each species is not
checked by the package. It is a first, automatic match of the FAO
scientific name to FishBase or SeaLifeBase (TempPrefMean),
given with the links needed to check it. Names do not always match
between databases (Grenié et al. 2023), so whether each match and its
temperature are right must be judged by you, from these pages and the
literature, before the results are used:
- Open the species table,
tables/<label>_mtc_species.csv. Items are sorted by catch, so the first rows matter most. - For each item used (
usedis TRUE), openurl(the FishBase or SeaLifeBase page of the matched species),search_urlandworms_url(the World Register of Marine Species). Check that the matched species is the FAO item, and that its preferred temperature is plausible for the stock in the area. - Write who checked it, or the date, in the column
checked. Correct a wrong value intemp_pref_meanand give its source innote(to use a value for an item that is not used, such as a genus, also set itsmatch_typeto"manual"); or record the correction in the corrections file offishbase_match(), which every later run applies. - Run the function again with the checked table:
mtc <- mean_temperature_catch(FAO27$area_data, match = "tables/Atlantic__Northeast_mtc_species.csv")Until every item used has been checked, the function says how much of the catch has been checked, and the chart caption says that the preferred temperatures have not all been checked.
Limitations
-
Preferred temperatures. FishBase gives
TempPrefMeanas an estimate from AquaMaps maps, computed with an unpublished script (Froese 2020), and does not document which map cells and which temperature (surface or bottom) it uses. For some species it is far below the temperature of the area where most of their catch is taken: it is 10.3 °C for European pilchard, 83% of whose catch (2015-2024) is taken in area 34. Cheung et al. (2013) used the median of a temperature profile computed from modelled distributions instead, as did most regional studies (Tsikliras and Stergiou 2014; Liang et al. 2018), while Dimarchopoulou et al. (2022) and Lavin et al. (2023) used the FishBase mean, as here. MTC values of the package are therefore not directly comparable with published ones. -
Coverage. Items above species level (e.g. “Marine
fishes nei”) are left out, as in the published studies. Their coverage
ranges from below 30% to over 90% (Tsikliras et al. 2015; Liang et
al. 2018), and no published study sets a minimum;
min_coverage = 50is a convention of the package. More catch is reported by species over time, without earlier years being revised (Garibaldi 2012), and catches move between areas or are reported as “nei” (FAO 2024), which changes the MTC without any change in temperature. -
Causes. The MTC also changes with the species
fished, fishing grounds, gear, markets, management and reporting, not
only with temperature (e.g. Alajmi et al. 2024; Lavin et al. 2023).
Check which items drive a change (
weight_pct,contribution_cin the species table) before attributing it to warming. - Statistics. Trends are linear slopes and Mann-Kendall tests; the comparison with SST uses correlations of the series and of their year-to-year differences. Both series are autocorrelated: the Mann-Kendall test is corrected for it (Yue and Wang 2004), but the p-values of the slopes and correlations are too small (Yue et al. 2002; Pyper and Peterman 1998), and the correlation of differences can miss a relation that acts only over decades. In the Adriatic Sea, the relation of MTC with SST was no longer significant once autocorrelation was accounted for (Kamberi et al. 2025).
Files
| File | Content |
|---|---|
figures/png/summary/<label>_mtc.png |
MTC and SST (with its range in the area); for one area, the coverage below |
figures/png/summary/<label>_mtc_coverage.png |
Coverage of each area (several areas only) |
tables/<label>_mtc.csv |
Yearly MTC, coverage, SST and the SST data used |
tables/<label>_mtc_trend.csv |
Slopes, Mann-Kendall tests and correlations with SST |
tables/<label>_mtc_species.csv |
Each species item: preferred temperature, catch, weight,
contribution, match, links, checked and
note
|
📝 In the Word report
fao_report() adds a section on the mean temperature of
the catch with mtc = TRUE (see 📝
Assessment report: Word, LaTeX and PDF). The report uses the
FishBase data bundled with the package
(mtc_version = "builtin"), so it needs no download and
gives the same values on every computer;
mtc_version = "latest" uses the newest FishBase release
instead. The other settings of mean_temperature_catch() are
given with the prefix mtc_,
e.g. mtc_sst = "hadisst1" or
mtc_match = "<checked species table>". The species
used, with their matches and links, are returned as
report$mtc_species for checking:
report <- fao_report(27, mtc = TRUE, mtc_min_coverage = 60)
report$mtc_species📖 References
Alajmi, A., Ben-Hasan, A., Alrushaid, T., Vahabnezhad, A. and Pauly, D. (2024). Mean temperature of the catch index can be masked by changes in catch composition unrelated to ocean warming. Fisheries Management and Ecology 31: e12659. doi:10.1111/fme.12659
Cheung, W.W.L., Watson, R. and Pauly, D. (2013). Signature of ocean warming in global fisheries catch. Nature 497: 365–368. doi:10.1038/nature12156
CWP (Coordinating Working Party on Fishery Statistics). CWP Handbook of Fishery Statistics: Main water areas (FAO major fishing areas). Rome: FAO. https://www.fao.org/cwp-on-fishery-statistics/handbook/general-concepts/main-water-areas/en/
Dimarchopoulou, D., Makino, M., Prayoga, M.R., Zeller, D., Vianna, G.M.S. and Humphries, A.T. (2022). Responses in fisheries catch data to a warming ocean along a latitudinal gradient in the western Pacific Ocean. Environmental Biology of Fishes 105: 1347–1362. doi:10.1007/s10641-021-01162-z
FAO (2026). Global Capture Production 1950–2024, release 2026.1.0. In: Fisheries and Aquaculture. Rome: FAO. https://www.fao.org/fishery/collection/capture/en. Licence: CC BY 4.0. Release file: https://www.fao.org/fishery/static/Data/Capture_2026.1.0.zip
FAO (2024). The State of World Fisheries and Aquaculture 2024 – Blue Transformation in action. Rome: FAO. doi:10.4060/cd0683en
Froese, R. (2020). Personal communication: R code (PrefTempBatch_5.R) to estimate preferred temperature from AquaMaps (version 10/2019). FishBase reference 123201. https://www.fishbase.se/references/FBRefSummary.php?ID=123201
Froese, R. and Pauly, D. (Eds.) (2026). FishBase. World Wide Web electronic publication. Version (06/2026). https://www.fishbase.se
Garibaldi, L. (2012). The FAO global capture production database: a six-decade effort to catch the trend. Marine Policy 36: 760–768. doi:10.1016/j.marpol.2011.10.024
Grenié, M., Berti, E., Carvajal-Quintero, J., Dädlow, G.M.L., Sagouis, A. and Winter, M. (2023). Harmonizing taxon names in biodiversity data: a review of tools, databases and best practices. Methods in Ecology and Evolution 14: 12–25. doi:10.1111/2041-210X.13802
Hirahara, S., Ishii, M. and Fukuda, Y. (2014). Centennial-scale sea surface temperature analysis and its uncertainty. Journal of Climate 27: 57–75. doi:10.1175/JCLI-D-12-00837.1
Huang, B., Thorne, P.W., Banzon, V.F., Boyer, T., Chepurin, G., Lawrimore, J.H., Menne, M.J., Smith, T.M., Vose, R.S. and Zhang, H.-M. (2017). Extended Reconstructed Sea Surface Temperature, Version 5 (ERSSTv5): upgrades, validations, and intercomparisons. Journal of Climate 30: 8179–8205. doi:10.1175/JCLI-D-16-0836.1
Huang, B., Liu, C., Banzon, V., Freeman, E., Graham, G., Hankins, B., Smith, T. and Zhang, H.-M. (2021). Improvements of the Daily Optimum Interpolation Sea Surface Temperature (DOISST) Version 2.1. Journal of Climate 34: 2923–2939. doi:10.1175/JCLI-D-20-0166.1
Kamberi, E., Hala, E. and Möllmann, C. (2025). Impact of large-scale oceanic variability on Adriatic fisheries evidenced through the ‘mean temperature of the catch’ approach. Frontiers in Marine Science 12: 1719738. doi:10.3389/fmars.2025.1719738
Kendall, M.G. (1975). Rank correlation methods, 4th edition. London: Charles Griffin.
Lavin, C.P., Pauly, D., Dimarchopoulou, D., Liang, C. and Costello, M.J. (2023). Fishery catch is affected by geographic expansion, fishing down food webs and climate change in Aotearoa, New Zealand. PeerJ 11: e16070. doi:10.7717/peerj.16070
Liang, C., Xian, W. and Pauly, D. (2018). Impacts of ocean warming on China’s fisheries catches: an application of “mean temperature of the catch” concept. Frontiers in Marine Science 5: 26. doi:10.3389/fmars.2018.00026
Mann, H.B. (1945). Nonparametric tests against trend. Econometrica 13: 245–259. doi:10.2307/1907187
NOAA National Centers for Environmental Information. Extended Reconstructed Sea Surface Temperature (ERSST) v5. https://www.ncei.noaa.gov/products/extended-reconstructed-sst
Palomares, M.L.D. and Pauly, D. (Eds.) (2026). SeaLifeBase. World Wide Web electronic publication. Version (06/2026). https://www.sealifebase.se
Pierce, D. (2025). ncdf4: Interface to Unidata netCDF (Version 4 or Earlier) Format Data Files. R package version 1.24. doi:10.32614/CRAN.package.ncdf4
Pyper, B.J. and Peterman, R.M. (1998). Comparison of methods to account for autocorrelation in correlation analyses of fish data. Canadian Journal of Fisheries and Aquatic Sciences 55: 2127–2140. doi:10.1139/f98-104
Rayner, N.A., Parker, D.E., Horton, E.B., Folland, C.K., Alexander, L.V., Rowell, D.P., Kent, E.C. and Kaplan, A. (2003). Global analyses of sea surface temperature, sea ice, and night marine air temperature since the late nineteenth century. Journal of Geophysical Research 108(D14): 4407. doi:10.1029/2002JD002670. Dataset description, with the warning of 10 March 2016 on its use where high resolution or SST gradients matter: https://coastwatch.pfeg.noaa.gov/erddap/info/erdHadISST/index.html
Tsikliras, A.C. and Stergiou, K.I. (2014). Mean temperature of the catch increases quickly in the Mediterranean Sea. Marine Ecology Progress Series 515: 281–284. doi:10.3354/meps11005
Tsikliras, A.C., Peristeraki, P., Tserpes, G. and Stergiou, K.I. (2015). Mean temperature of the catch (MTC) in the Greek Seas based on landings and survey data. Frontiers in Marine Science 2: 23. doi:10.3389/fmars.2015.00023
WoRMS Editorial Board. World Register of Marine Species. Flanders Marine Institute (VLIZ). https://www.marinespecies.org, doi:10.14284/170
Yue, S. and Wang, C.Y. (2004). The Mann-Kendall test modified by effective sample size to detect trend in serially correlated hydrological series. Water Resources Management 18: 201–218. doi:10.1023/B:WARM.0000043140.61082.60
Yue, S., Pilon, P., Phinney, B. and Cavadias, G. (2002). The influence of autocorrelation on the ability to detect trend in hydrological series. Hydrological Processes 16: 1807–1829. doi:10.1002/hyp.1095
