Skip to contents

Not every useful covariate is a gridded field on a monthly step. Two other kinds are available, and they behave differently from the gridded data and from each other: seafloor terrain, which does not vary in time at all, and basin-scale climate indices, which do not vary in space.

Neither is fetched with matchData(). They have their own attach functions, because neither is a spatiotemporal nearest-feature join.

Not everything useful is a gridded Copernicus variable on a monthly time step. Two other kinds are available, and they behave differently from the Copernicus data and from each other.

Seafloor terrain

This does not vary by month or year. So it is fetched once for a study area and attached to every time step. It comes from NOAA ETOPO via marmap, a suggested package rather than a hard dependency:

bathy <- fetch_bathymetry(
  bounding_box = list(xmin = -70, xmax = -66, ymin = 41, ymax = 44)
)

observations <- attach_bathymetry(observations, bathy, c("DEPTH", "SLOPE", "TPI"))

bathymetry_variables() lists them: DEPTH, SLOPE, ASPECT, and TPI.

TPI, the topographic position index, is a cell’s depth relative to the mean of the eight around it. It answers a question depth cannot. A 100 m bank top and a 100 m basin floor are the same depth and very different places. TPI is positive on the first, negative on the second, and near zero on both flat bottom and uniform slopes.

It is scale-dependent by construction. It describes position within the immediate neighbourhood, so its meaning follows the resolution of the grid it was computed on.

attach_bathymetry() takes either a plain data frame with coordinate columns or an sf object, so it works on observations and on accessEnvDat() output alike.

Climate indices

These are monthly, and have no spatial dimension. One value describes the whole basin, so every observation in a month receives the same number:

observations <- attach_climate_index(observations, c("NAO", "AMO"))

index_dictionary()          # NAO, AO, AMO, PDO, LCR, AMOC

That makes them a different kind of covariate from local temperature. They tell you about when — what year and season it was. They tell you nothing about where within a region conditions are better.

So they are useful for interannual questions (“was this a warm-regime year?”) and useless for spatial ones. A model given only indices cannot produce a map.

Six are available, and they are not interchangeable.

Name What it measures Units Timescale Record
NAO Pressure difference, Icelandic Low to Azores High standardized anomaly Year to year 1950–
AO Strength of the polar vortex standardized anomaly Year to year 1950–
AMO Detrended North Atlantic SST anomaly degrees C Multidecadal 1948–
PDO Leading mode of North Pacific SST standardized anomaly Decadal 1948–
LCR Retroflection of the Labrador Current fraction Year to year 1993–2014
AMOC Overturning transport at 26.5°N Sv Year to year 2004–

Most are standardized anomalies — in standard deviations, not anything physical. Only AMO (degrees C) and AMOC (Sverdrups) carry real units, so a coefficient fitted to one of those is not comparable with one fitted to NAO. index_dictionary() carries the units at runtime.

NAO is the usual first choice in the Northwest Atlantic. It sets the strength and track of the westerlies, and with them heat flux and mixing over the shelves. Its winter values carry most of the signal. Summer values are noisier and mean less.

AO is the hemispheric version of the same thing: polar vortex strength rather than an Atlantic-specific pressure dipole. In winter it correlates strongly with NAO. Including both usually buys little and costs collinearity, so pick one unless you have a reason.

AMO is a slow background state, not a year-to-year signal. It varies over decades. Within a study period of ten or twenty years it may act more like a trend than a covariate. One caution: it is derived from North Atlantic SST, so using it to predict local SST is partly circular.

PDO is North Pacific and included for completeness. It has limited relevance to Atlantic shelf systems, and a relationship found with it is worth treating sceptically.

The last two are different in kind, and get their own sections below.

The overturning circulation

AMOC is the strength of the Atlantic overturning in Sverdrups, measured directly by the RAPID mooring array at 26.5°N. Alone among these it is a measurement rather than a pattern derived from pressure or SST.

amoc <- fetch_climate_index("AMOC")      # monthly, April 2004 onward
observations <- attach_climate_index(observations, "AMOC")

Being real is also its limitation, in two ways. It starts in April 2004, so it cannot reach back over a longer survey record. And it is measured far south of the shelf: it describes the basin-scale circulation the Labrador and slope currents sit within, not conditions on the Gulf of Maine or Scotian Shelf. A weakening AMOC is associated with a warming Northwest Atlantic shelf, but that is a chain of several links, so check the sign of any relationship against LCR and AMO rather than assuming it.

Two practical notes. RAPID publishes this only as NetCDF, so it needs the ncdf4 package — a Suggests, installed with install.packages("ncdf4"). And the published series is twelve-hourly, averaged to monthly here; the file is over a megabyte, so it is cached like the Copernicus downloads.

Moat BI, Smeed DA, Rayner D, Johns WE, Smith R, Volkov D, Elipot S, Petit T, Kajtar J, Baringer MO, Collins J (2026). Atlantic meridional overturning circulation observed by the RAPID-MOCHA-WBTS array at 26°N from 2004 to 2024 (v2024.1a). British Oceanographic Data Centre, NERC, UK. https://doi.org/10.5285/48d0bf43-0598-ceb2-e063-7086abc062f1

Staying current

Four of the six indices are still growing. Downloads are cached, and the cache expires on an interval matched to how often each provider actually publishes, so a living index re-downloads on its own without being asked:

climate_index_status()      # what is cached, how old, what is due
refresh_climate_index()     # force a re-fetch of everything still growing
refresh_climate_index("AMOC")
Updates Cache reused for Indices
Monthly 7 days NAO, AO, AMO, PDO
Roughly yearly 30 days AMOC
Never forever LCR

LCR finished at 2014, so re-downloading it cannot produce anything new and it is skipped rather than fetched again.

Two behaviours are worth knowing, because both are deliberate.

Staleness is judged from the data, not the cache. A fresh download of a file the provider stopped updating is still stale. If a series ends further behind the present than its source’s usual publishing lag, you are told, along with the command to force a refresh and the note that if refreshing changes nothing then the provider has not published either.

A failed download falls back to the cached copy, with a warning. A provider being briefly unreachable should not become an error here when usable data is already on disk. The warning is what keeps the old copy from being mistaken for a current one.

The Labrador Current retroflection index

LCR is the odd one out among the five, and often the most directly useful. The other four are atmospheric or SST patterns. This one describes a current: how much of the Labrador Current turns eastward at the Grand Banks instead of continuing southwest along the shelf.

Positive values mean stronger retroflection. That means less cold, fresh, oxygen-rich Labrador water reaching the Scotian Shelf and Gulf of Maine. For shelf water properties that is a shorter causal chain than the NAO, which acts on them only indirectly through winds.

lcr <- fetch_climate_index("LCR")        # monthly, 1993-2014
observations <- attach_climate_index(observations, "LCR")

It is the published output of one study rather than an operational product, so cite it when you use it:

Jutras M, Dufour CO, Mucci A, Talbot LC (2023) Large-scale control of the retroflection of the Labrador Current. Nature Communications 14:2623. https://doi.org/10.1038/s41467-023-38321-y

index_dictionary() prints that citation, and as.data.frame(index_dictionary())$reference carries it at runtime.

Three limits worth knowing.

It covers 1993–2014 only, so it cannot be attached to recent observations.

The series is fetched from the paper’s published source data, not recomputed. The authors derived it by seeding 966 virtual particles per week across a line at (53°N, 56.7°W)–(54.3°N, 52.0°W). Each was tracked for three years through GLORYS12V1 velocities with OceanParcels. The index is the difference between the counts crossing hydrographic sections on the Labrador and Scotian Shelves.

Extending the record past 2014 means redoing that computation, not calling a different function.

The values are the raw index, not the normalized one plotted in the paper. The published source data runs roughly −0.09 to 0.18, consistent with a fraction of the seeded particles. Figure 3a of the paper shows a detrended, smoothed series normalized to [−1, 1], spanning about −0.6 to +0.5.

Both describe the same quantity, but the numbers are not comparable. Don’t read a value here against that figure. To get the paper’s variant, apply its chain yourself: detrend, 12-month rolling mean, rescale to [−1, 1], subtract the 1993–2015 mean.

One interaction to know. attach_climate_index() joins on year and month, and upscale_time(to = "year") stamps its output MONTH = 1. So attaching an index to annual data would give every year January’s value. Aggregate the index to a year first instead.