Methodology 路 Version analog-v1.0.0

How the Analog Engine Works

Which historical year most resembles the present large-scale climate state, exactly how that is calculated, and the things it deliberately refuses to claim.

Read this first. An analog year is a historical similarity, not a forecast. Similar large-scale patterns have repeatedly produced different regional weather and different agricultural outcomes. The similarity percentage is an index produced by this algorithm, not a probability. Nothing on the teleconnections dashboard predicts what any coming season will do.

The question being answered

Given the time of year, the current state of the major teleconnections, and how those teleconnections arrived at that state, which previous year most closely resembled the present?

That last clause is the part most analog comparisons skip. Two Junes can show an identical Arctic Oscillation reading while one arrived there after six weeks of steady positive persistence and the other after a violent reversal the week before. Those are not the same atmosphere. The engine weights the recent path more heavily than the current reading precisely for this reason.

What goes into the comparison

Fifteen archived series participate in the modern comparison, grouped into six climate families. Every value is read at its own native frequency from the site's historical archive, and nothing is interpolated.

Participating series and family weights
FamilyWeightSeriesNative frequency
ENSO / tropical Pacific30%Ni帽o 1+2, Ni帽o 3, Ni帽o 3.4, Ni帽o 4 (relative), ONI, RONI, SOIweekly, seasonal, monthly
NH circulation30%AO, NAO, PNAdaily
MJO12.5%ROMI in RMM conventiondaily
SH circulation10%AAO / SAMdaily
Decadal ocean10%PDO, IPO tripole indexmonthly
Stratosphere7.5%QBO 30 hPamonthly

These weights are a starting position for a general global analog, not a scientific result. They are versioned as weights-v1.0.0 and published through the methodology API endpoint so any result can be reproduced exactly.

Why weight by family rather than by index

The Ni帽o regions are strongly correlated with each other, and AO with NAO. If every archived column counted as an independent vote, then archiving four Ni帽o boxes would hand the tropical Pacific four votes while the stratosphere kept one. That would not reflect any physical reasoning, only which files happen to be easy to download.

So each family receives a fixed share of the total weight, and that share is divided within the family. Adding a fifth ENSO series in future will not increase ENSO's influence; it will only refine it.

State, trajectory, persistence and background

Each series contributes up to four kinds of comparison, combined with these weights:

The default lookback is 60 days, with 30 and 90 day alternatives available in the explorer. Trajectory features exist only for genuinely daily series. A monthly index does not get a 30-day trajectory, because one monthly value repeated thirty times is one observation wearing a costume, not thirty observations. Monthly, weekly and seasonal series contribute period-to-period change instead.

Comparing the same time of year

Candidates are compared at the same calendar position, not merely at whichever historical date happens to produce matching numbers. A January circulation state can never become the top analog for July.

The as-of rule, and why it changes the answer

When the engine compares today with a date in 2003, the 2003 feature vector may contain only what a person standing in 2003 could actually have known on that date.

This sounds pedantic until you see what it does. A completed monthly index for July is not published until early August. A three-month ONI season ending June 30 is not available on June 30. If the engine quietly used those values, every historical comparison would be built from a slightly clairvoyant version of the past, and any future attempt to test the method honestly would be corrupted from the start.

So in real-time mode, which is the public default, a historical observation is usable only if its measurement period had ended and its modeled publication date had passed. The modeled lags are:

Native frequencyAssumed lagRule
Daily3 daysValue for day D assumed available on D plus 3
Weekly6 daysWeekly value available 6 days after the period ends
Monthly8 daysMonth M available 8 days after M ends
Seasonal8 daysSeason available 8 days after its final month ends

These are conservative rules derived from documented source cadence. They are modeled availability, not recovered publication timestamps, and the system says so in every response rather than implying a precision it does not have. When genuine vintage archives become available they can replace the model without changing anything else.

This is testable, and it matters On 30 July 2026, running the long-record comparison in real-time mode returns 2023 as the closest analog. Running the identical comparison in final-data mode, which ignores publication timing, returns 1965 instead. Same archive, same weights, same date. The only difference is whether the past is allowed to know its own future. If as-of correctness were cosmetic, those two answers would match. They do not.

A second mode, final-data research mode, uses the currently preferred values regardless of publication timing. It is useful for exploratory climatology and is clearly labeled as unsuitable for strict real-time evaluation.

The MJO is compared as a vector

MJO phase is conventionally reported as an integer from 1 to 8, but those integers wrap around a circle. Phase 8 and phase 1 are neighbours. Treating the phase number as an ordinary quantity would score them as maximally different, which is simply wrong.

The engine therefore compares the RMM1 and RMM2 coordinates directly. Adjacent phases come out adjacent, and a weak-amplitude MJO near the middle of the diagram is correctly treated as similar to any other weak MJO, regardless of which octant it nominally occupies. An inactive MJO should not be allowed to break an otherwise strong seasonal match.

Missing data lowers coverage, it never helps

A naive distance calculation gets better as data goes missing, because there are fewer things left to disagree about. That would rank the emptiest years highest, which is the opposite of useful.

Instead, coverage is measured as the share of family weight that had usable data at the comparison date, and the score is multiplied by the square root of coverage. A candidate must clear 70% coverage and have at least three families represented, or it is excluded from the primary ranking entirely, with the reason recorded and available through the API.

Two archive depths, both published

The archive is not equally deep for every index. The MJO record begins in 1991 and the Southern Annular Mode in 1979, while AO, NAO and PNA reach back to 1950.

Rather than pick one, the engine publishes both:

Showing only the modern result would let a shorter, more detailed archive quietly erase potentially important older years. When the two depths disagree, that disagreement is information, and it is displayed rather than resolved.

Robustness, which is not confidence

A high similarity score on its own means very little. What matters more is whether the same year keeps winning when reasonable assumptions change.

Every production run is recomputed under four alternative settings: a 30-day trajectory, a 90-day trajectory, exact calendar date only, and with the MJO removed. Stability is then reported:

This is deliberately labeled robustness rather than confidence. It describes the stability of a ranking, and says nothing about whether the coming season will resemble the analog year.

How the explanation is written

The "why this year" and "where it differs" text on the dashboard is generated directly from the weighted contribution arithmetic: the engine sorts indices by how much each contributed to the score and names the strongest and weakest. No language model writes it, and identical inputs always produce identical text. If the explanation says the ENSO family drove the match, that is a readout of the numbers, not a narrative fitted over them afterwards.

What this cannot tell you

Reproducing a result

Every published run records its method version, feature version, weight version, data vintage mode, analysis date and generation timestamp. The API is open:

The explorer on the teleconnections dashboard exposes the same controls and exports both the full ranking as CSV and the complete experiment definition as JSON.

Method version analog-v1.0.0 路 feature pipeline features-v1.0.0 路 weights weights-v1.0.0 路 published 30 July 2026. Built on the site's own teleconnection archive: NOAA CPC daily AO, NAO, PNA from 1950 and AAO from 1979, NOAA PSL ROMI from 1991, CPC monthly Northern Hemisphere patterns from 1950, CPC weekly relative Ni帽o SSTs, ONI and RONI from 1950, SOI, NCEI PDO, PSL IPO tripole index and QBO. Every stored observation is traceable to a hashed copy of the source file that produced it.
A closing caution. Analog reasoning is genuinely useful for building intuition about how a season is evolving, and genuinely dangerous as a substitute for a forecast. The 1997 and 2015 El Ni帽o events shared a great deal of large-scale structure and still delivered materially different outcomes to many regions. Treat the analog year as a question worth investigating, never as an answer.