Which historical year most resembles the present large-scale climate state, exactly how that is calculated, and the things it deliberately refuses to claim.
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.
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.
| Family | Weight | Series | Native frequency |
|---|---|---|---|
| ENSO / tropical Pacific | 30% | Ni帽o 1+2, Ni帽o 3, Ni帽o 3.4, Ni帽o 4 (relative), ONI, RONI, SOI | weekly, seasonal, monthly |
| NH circulation | 30% | AO, NAO, PNA | daily |
| MJO | 12.5% | ROMI in RMM convention | daily |
| SH circulation | 10% | AAO / SAM | daily |
| Decadal ocean | 10% | PDO, IPO tripole index | monthly |
| Stratosphere | 7.5% | QBO 30 hPa | monthly |
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.
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.
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.
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.
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 frequency | Assumed lag | Rule |
|---|---|---|
| Daily | 3 days | Value for day D assumed available on D plus 3 |
| Weekly | 6 days | Weekly value available 6 days after the period ends |
| Monthly | 8 days | Month M available 8 days after M ends |
| Seasonal | 8 days | Season 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.
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.
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.
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.
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.
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.
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.
Every published run records its method version, feature version, weight version, data vintage mode, analysis date and generation timestamp. The API is open:
/api/teleconnections/analogs/current the current production run, both depths/api/teleconnections/analogs?mode=&lookback=&tolerance=&includeMjo=&vintageMode= a custom run/api/teleconnections/analogs/methodology the machine-readable version of this page/api/teleconnections/analogs/:runId/download.csv a saved rankingThe explorer on the teleconnections dashboard exposes the same controls and exports both the full ranking as CSV and the complete experiment definition as JSON.