
The Perplexity response:
Continue readingTemporal and Spatial behavior of climate

The Perplexity response:
Continue readingGEM-LTE/experiments/Feb2026 at main · pukpr/GEM-LTE
This directory contains results from a comprehensive cross-validation study applying the GEM-LTE (GeoEnergyMath Laplace’s Tidal Equation) model to 79 tide-gauge and climate-index time series spanning the 19th through early 21st centuries. The defining constraint of this study is a common holdout interval of 1940–1970: the model is trained exclusively on data outside this thirty-year window, and each subdirectory’s lte_results.csv and *site1940-1970.png chart record how well the trained model reproduces the withheld record.
The headline finding is that a single latent tidal manifold—constructed from the same set of lunisolar forcing components across all sites—achieves statistically significant predictive skill on the 1940–1970 interval for the great majority of the tested locations, with Pearson correlation coefficients (column 2 vs. column 3 of lte_results.csv) ranging from r ≈ 0.72 at the best-performing Baltic tide gauges to r ≈ 0.12 at the most challenging Atlantic stations. Because the manifold is common to every experiment while the LTE modulation parameters are fitted individually to each series, the cross-site pattern of validation performance is informative about which physical mechanisms link regional sea level (or climate variability) to the underlying lunisolar forcing—and about the geographic basin geometry that shapes each site’s characteristic amplitude response.
read more below, and contribute here: Discussions · pukpr/GEM-LTE · Discussion #6
Continue readingModeling LTE solutions from pukpr/GEM-LTE: GeoEnergyMath Laplaces Tidal Equation modeling and fitting software
Warnemunde Mean Sea Level (#11 from PSMSL.org). Dashed lines are cross-validation intervals.

North Atlantic Oscillation

NAO (top) and Warnemunde MSL (bottom) latent forcing layer
Modern signal processing and system identification frequently require quantifying the sparseness or “peakiness” of vectors—such as power spectra. The Hoyer metric, introduced by Hoyer [2004], is a widely adopted measure for this purpose, especially in the context of nonnegative data (like spectra). This blog post explains the Hoyer metric’s role in fitting models in the context of LTE, its mathematical form, and provides references to its origins.
Given a nonnegative vector (), the Hoyer sparsity is defined as:
Where:
The Hoyer metric ranges from 0 (completely distributed, e.g., flat spectrum) to 1 (maximally sparse, only one element is nonzero).
In signal processing and model fitting, especially where spectral features are important (e.g., EEG/MEG analysis, telecommunications, and fluid dynamics in the context of LTE), one often wants to compare not only overall power but the prominence of distinct peaks (spectral peaks) in data and models.
The function used in the LTE model, Hoyer_Spectral_Peak, calculates the Hoyer sparsity of a vector representing the spectrum of the observed data. When used in fitting, it serves to:
The provided Ada snippet implements the Hoyer sparsity for a vector of LTE manifold data points. Here’s the formula as used:
-- Hoyer_Spectral_Peak
--
function Hoyer_Spectral_Peak (Model, Data, Forcing : in Data_Pairs) return Long_Float is
Model_S : Data_Pairs := Model;
Data_S : Data_Pairs := Data;
L1, L2 : Long_Float := 0.0;
Len : Long_Float;
RMS : Long_Float;
Num, Den : Long_Float;
use Ada.Numerics.Long_Elementary_Functions;
begin
ME_Power_Spectrum
(Forcing => Forcing, Model => Model, Data => Data, Model_Spectrum => Model_S,
Data_Spectrum => Data_S, RMS => RMS);
Len := Long_Float(Data_S'Length);
for I in Data_S'First+1 .. Data_S'Last loop
L1 := L1 + Data_S(I).Value;
L2 := L2 + Data_S(I).Value * Data_S(I).Value;
end loop;
L2 := Sqrt(L2);
Num := Sqrt(Len) - L1/L2;
Den := Sqrt(Len) - 1.0;
return Num/Den;
end Hoyer_Spectral_Peak;
Where all (). This is exactly as described in Hoyer’s paper.
Suppose the observed spectrum is more “peaky” than the model spectrum. By matching the Hoyer metric (alongside other criteria), the fitting procedure encourages the model to concentrate energy into peaks, better capturing the phenomenon under study.
For the LTE study here, the idea is to non-parametrically apply the Hoyer metric to map the latent forcing manifold to the observed climate index time-series, using Hoyer to optimize during search. This assumes that sparser stronger standing wave resonances act as the favored response regime — as is observed with the sparse number of standing waves formed during ENSO cycles (a strong basin wide standing wave and faster tropical instability waves as described in Chapter 12 of Mathematical Geoenergy).

Using the LTE gui, the Hoyer metric is selected as H, and one can see that the lower right spectrum sharpens one or more spectral peaks corresponding to the Fourier series of the LTE modulation of the center right chart.
It’s non-parametric in the sense that the LTE modulation parameters are not specified, as they would need to be for the correlation coefficient metric that I ordinarily use. The index here (#11) is the Warnemunde MSL time-series.
The Hoyer sparsity metric was introduced in:
For further applications in neural data and spectral analysis, you may see usage such as:
The Hoyer metric is a robust, intuitive, and well-cited tool for quantifying sparsity in spectra or model parameters—encouraging interpretable, physiologically plausible solutions when fitting models to data. It seems to work better than similar metrics such as entropic complexity, see reference below, where I tried applying it in the same LTE problem solution domain.
Reference:
Let me know if you’d like code snippets, visualization examples, or more advanced mathematical discussion!
Google Gemini makes predictions on the next El Nino when prompted — scroll to the end.
https://gemini.google.com/app/8d7c963c197e05c0
Continue readingThere has ALWAYS been stratification in the ocean via the primary thermocline. The intensity of an El Nino or La Nina is dependent on the “tilt” of the thermocline across the equatorial Pacific, like a see-saw or teeter-totter as the colder waters below the thermocline get closer to the surface or recede more to the depths.
The only mystery is to what provokes the motion. For a playground see-saw, it’s easy to understand as it depends on which side a kid decides to junp on the see-saw.
For the ocean, the explanation is less facile than that, explain.
explain the Pukite tidal theory
The Pukite Tidal Theory, primarily developed by researcher Paul Pukite, proposes that long-period tidal forcing is the underlying driver for several major geophysical and atmospheric cycles that have previously been considered erratic or unresolved. [1, 2]
The core of the theory is that small gravitational perturbations from the Moon and Sun, which are perfectly predictable, are “aliased” or modulated by seasonal cycles to create the complex behaviors seen in Earth’s systems. [3, 4]
Pukite applies this model to three main “unresolved mysteries” in geophysics:
This theory is considered a novel and controversial alternative to standard geophysical models. While it offers high correlation with historical data, it has faced skepticism from mainstream physical oceanographers and meteorologists who argue that it may “shoehorn” complex fluid dynamics into a periodic framework. Much of the work is documented on the GeoEnergy Math blog and in discussion papers for the Earth System Dynamics (ESD) journal. [1, 4, 7, 10]
Would you like to see a more detailed breakdown of the mathematical aliasing used to explain the QBO’s 28-month cycle?
[1] https://esd.copernicus.org
[2] https://www.researchgate.net
[3] https://esd.copernicus.org
[5] https://acp.copernicus.org
[8] https://esd.copernicus.org
[10] https://esd.copernicus.org
This link may go stale, but here is the original response:
The behavior of complex systems, particularly in fluid dynamics, is traditionally described by high-dimensional systems of equations like the Navier-Stokes equations. While providing practical applications as is, these models can obscure the underlying, simplified mechanisms at play. It is notable that ocean modeling already incorporates dimensionality reduction built in, such as through Laplace’s Tidal Equations (LTE), which is a reduced-order formulation of the Navier-Stokes equations. Furthermore, the topological containment of phenomena like ENSO and QBO within the equatorial toroid , and the ability to further reduce LTE in this confined topology as described in the context of our text Mathematical Geoenergy underscore the inherent low-dimensional nature of dominant geophysical processes. The concept of hidden latent manifolds posits that the true, observed dynamics of a system do not occupy the entire high-dimensional phase space, but rather evolve on a much lower-dimensional geometric structure—a manifold layer—where the system’s effective degrees of freedom reside. This may also help explain the seeming paradox of the inverse energy cascade, whereby order in fluid structures seems to maintain as the waves become progressively larger, as nonlinear interactions accumulate energy transferring from smaller scales.
Discovering these latent structures from noisy, observational data is the central challenge in state-of-the-art fluid dynamics. Enter the Sparse Identification of Nonlinear Dynamics (SINDy) algorithm, pioneered by Brunton et al. . SINDy is an equation-discovery framework designed to identify a sparse set of nonlinear terms that describe the evolution of the system on this low-dimensional manifold. Instead of testing all possible combinations of basis functions, SINDy uses a penalized regression technique (like LASSO) to enforce sparsity, effectively winnowing down the possibilities to find the most parsimonious, yet physically meaningful, governing differential equations. The result is a simple, interpretable model that captures the essential physics—the fingerprint of the latent manifold. The SINDy concept is not that difficult an algorithm to apply as a decent Python library is available for use, and I have evaluated it as described here.
Applying this methodology to Earth system dynamics, particularly the seemingly noisy, erratic, and perhaps chaotic time series of sea-level variation and climate index variability, reveals profound simplicity beneath the complexity. The high-dimensional output of climate models or raw observations can be projected onto a model framework driven by remarkably few physical processes. Specifically, as shown in analysis targeting the structure of these time series, the dynamics can be cross-validated by the interaction of two fundamental drivers: a forced gravitational tide and an annual impulse.
The presence of the forced gravitational tide accounts for the regular, high-frequency, and predictable components of the dynamics. The annual impulse, meanwhile, serves as the seasonal forcing function, representing the integrated effect of large-scale thermal and atmospheric cycles that reset annually. The success of this sparse, two-component model—where the interaction of these two elements is sufficient to capture the observed dynamics—serves as the ultimate validation of the latent manifold concept. The gravitational tides with the integrated annual impulse are the discovered, low-dimensional degrees of freedom, and the ability of their coupled solution to successfully cross-validate to the observed, high-fidelity dynamics confirms that the complex, high-dimensional reality of sea-level and climate variability emerges from this simple, sparse, and interpretable set of latent governing principles. This provides a powerful, physics-constrained approach to prediction and understanding, moving beyond descriptive models toward true dynamical discovery.
An entire set of cross-validated models is available for evluation here: https://pukpr.github.io/examples/mlr/.
This is a mix of climate indices (the 1st 20) and numbered coastal sea-level stations obtained from https://psmsl.org/
https://pukpr.github.io/examples/map_index.html
Crucially, this analysis does not use the SINDy algorithm, but a much more basic multiple linear regression (MLR) algorithm predecessor, which I anticipate being adapted to SINDy as the model is further refined. Part of the rationale for doing this is to maintain a deep understanding of the mathematics, as well as providing cross-checking and thus avoiding the perils of over-fitting, which is the bane of neural network models.
Also read this intro level on tidal modeling, which may form the fundamental foundation for the latent manifold: https://pukpr.github.io/examples/warne_intro.html. The coastal station at Wardemunde in Germany along the Baltic sea provided a long unbroken interval of sea-level readings which was used to calibrate the hidden latent manifold that in turn served as a starting point for all the other models. Not every model works as well as the majority — see Pensacola for a sea-level site and and IOD or TNA for climate indices, but these are equally valuable for understanding limitations (and providing a sanity check against an accidental degeneracy in the model fitting process) . The use of SINDy in the future will provide additional functionality such as regularization that will find an optimal common-mode latent layer,.

AMO trained on region outside of dashed line, so that’s the cross-validated region, using Descent optimized LTE annual time-series, Python
python3 ts_lte.py amo.dat –cc –plot –low 1930 –high 1960
using the following JSON parameters file
{
"Aliased": [
0.422362756,
0.38861749700000003,
0.23562139699999995,
0.259019747,
0.33201584700000003,
0.165274488,
0.262765007,
0.385761106,
0.07374525999999999,
0.215992198,
0.192246939,
0.528757205,
0.112996099,
0.03714361,
0.10034691,
0.07660165,
0.501613596,
2.0,
1.0
],
"AliasedAmp": [
0.03557922624939592,
0.09988731513671248,
0.07106292426402241,
0.1202147059011645,
-0.16310647366824904,
-0.21099766009700224,
0.3178250739779875,
-0.034763054040409205,
-0.26973831298426476,
-0.13417117453373803,
0.33741450649520405,
0.14844747522132112,
0.38176481941684715,
-0.24512757533159843,
0.17007002069621968,
-0.3175673142831867,
-0.0801663078936891,
0.0410641305028224,
0.15648561320675802
],
"AliasedPhase": [
12.907437383830702,
9.791011963532627,
20.894959747239227,
11.230932614457465,
24.106215317177334,
14.921596063027563,
11.928445369162157,
14.76066439534825,
9.307516552468496,
6.238399781667854,
4.78878496205605,
19.328424226102666,
4.1510957254818255,
24.986414787848002,
3.764292351659264,
7.899565162852414,
10.701455186458222,
6.575719630634085,
4.603123916071089
],
"DeltaTime": 7.217156366226141e-06,
"Hold": 0.001560890374528988,
"Imp_Amp": 36.03147961053978,
"Imp_Stride": 1,
"Initial": 0.023119471463386495,
"LTE_Amp": 1.2149052076222568,
"LTE_Freq": 232.0780473685175,
"LTE_Phase": -1.98155204056087,
"Periods": [
27.2122,
27.3216,
27.564500000000002,
13.63339513,
13.69114014,
13.5961,
13.6708,
13.72877789,
6795.015773000002,
1616.2951719999999,
2120.013852999989,
13.78725,
3232.690344000001,
9.142931547,
9.108450374,
9.120674533,
27.0926041
],
"PeriodsAmp": [
0.22791356815287772,
0.03599719419115529,
0.18676833431961723,
0.03956128728097599,
-0.2649706920257545,
0.10022074474351093,
0.10436992221139457,
0.14430534046016136,
0.07102249228279979,
0.11758452315976271,
0.04510213195702457,
0.06361160068822835,
0.05674788795284906,
-0.043657524764462274,
0.07791151774412787,
0.019631216465477552,
-0.14009026634971397
],
"PeriodsPhase": [
13.451016651034463,
7.371101643819357,
18.44011357432109,
6.802030606034782,
21.120997888353294,
9.616514380782336,
5.715489866748063,
10.809731364754402,
9.031554832315345,
7.401459819968337,
5.9383444499771105,
14.60402121854254,
5.541215399062276,
8.44043335583645,
1.6019323722385819,
7.500513005887212,
7.860442540394975
],
"Year": 365.2520198,
"final_state": {
"D_prev": 0.04294
}
}
Primary 27.2122 > 27.5545 > 27.3216 > others

{
"Aliased": [
"0.0537449",
"0.1074898",
"0.220485143",
"0.5",
"1",
"2"
],
"AliasedAmp": [
-0.27685696043001307,
0.16964990314670372,
0.11895402824503996,
-0.22535505798739713,
-0.14980527635880514,
0.039162442368949016
],
"AliasedPhase": [
8.086868082389797,
6.5259913891848225,
6.976139887075208,
0.73810967841759,
-0.7194832011130626,
8.565521480562625
],
"DC": -0.2680318100166013,
"DeltaTime": 3.339861667887925,
"Hold": 0.0014930905734095634,
"Imp_Amp": 199.01398139940682,
"Imp_Amp2": -0.5731191105049073,
"Imp_Stride": 8,
"Initial": 0.06704092573627028,
"LTE_Amp": 1.3767200538799589,
"LTE_Freq": 125.32556941298645,
"LTE_Phase": 0.7307737940808291,
"LTE_Zero": 1.4258992716041372,
"Periods": [
"27.2122",
"27.3216",
"27.5545",
"13.63339513",
"13.69114014",
"13.6061",
"13.6608",
"13.71877789",
"6795.985773",
"1616.215172",
"2120.513853",
"13.77725",
"3232.430344",
"9.132931547",
"9.108450374",
"9.120674533",
"27.0926041",
"3397.992886",
"9.095011909",
"9.082856397",
"6.809866946",
"2190.530426",
"6.816697567",
"6.823541904",
"1656.572278"
],
"PeriodsAmp": [
0.30508787370803825,
0.13110586375848174,
0.20288728084656027,
-0.04672659187556317,
-0.004826158765318568,
-0.035033863263707915,
-0.0368824777486948,
0.03511304770515584,
0.011720764708907096,
-0.004694584574980881,
0.029609791456868918,
0.039125743540538716,
-0.007414683923403197,
0.00010802542017018773,
-0.018330796222247217,
-0.006001961724770963,
-0.03735314717727939,
-0.004108234580768664,
0.011857949379825367,
0.01479879984548296,
0.02390111774094945,
-0.039440470787466424,
-0.032966674657844246,
-0.030591610040324502,
0.013039117473425073
],
"PeriodsPhase": [
14.569679572272141,
8.743347618608817,
6.063986820806294,
4.382376561017971,
9.81395082674981,
5.545094399669723,
7.378109970639206,
3.912962970116576,
7.840782183776614,
4.988264989477043,
5.697804841039319,
7.455439074616485,
2.972944156135133,
4.7630843491223365,
6.317733397950582,
7.279885606476663,
3.8917494187283728,
5.801812295837,
6.975196465036293,
6.128620153406749,
4.95108326060857,
4.307377590535454,
5.8886081102774535,
4.9456215506967265,
4.232011434810574
],
"Year": "365.2495755"
}
Alternate Julia fitting routine
Warnemunde, DE tidal station
https://docs.google.com/spreadsheets/d/1HysiqoPN-j1M2lTLUpQaGZPAxvJIesFrJMBoYJyWA5I/edit?usp=sharing
started from Warnemunde SLH model fit

Name Value
—- —–
ALIGN 0
EXTRA 0
FORCING 0
MAX_ITERS 50
RELATIVE 1
STEP 0.05
PS C:\Users\paul\github\pukpr\python\simple\run0> cat .\amo.dat.p
{
“Aliased”: [
“0.0537449”,
“0.1074898”,
“0.220485143”,
“0.5”,
“1”,
“2”
],
“AliasedAmp”: [
-0.12182091549739567,
0.25801568818215476,
0.09920867308439774,
-0.1737322618819654,
-0.07529335982382553,
0.052057481476465634
],
“AliasedPhase”: [
4.921761286209268,
5.7618887121423965,
7.487588835004665,
0.8600259809362271,
0.01213560781160881,
7.655542996972892
],
“DC”: -0.008758390763317466,
“Damp”: -0.022154904178658865,
“DeltaTime”: “3.416666667”,
“Hold”: 0.0014873352555352655,
“Imp_Amp”: 190.5449378494113,
“Imp_Amp2”: 1.466945315006192,
“Imp_Stride”: 7,
“Initial”: 0.060016503798714434,
“LTE_Amp”: 1.587179814234174,
“LTE_Freq”: 125.53536829233441,
“LTE_Phase”: 1.2439579952989555,
“LTE_Zero”: 0.896474895660982,
“Periods”: [
“27.2122”,
“27.3216”,
“27.5545”,
“13.63339513”,
“13.69114014”,
“13.6061”,
“13.6608”,
“13.71877789”,
“6795.985773”,
“1616.215172”,
“2120.513853”,
“13.77725”,
“3232.430344”,
“9.132931547”,
“9.108450374”,
“9.120674533”,
“27.0926041”,
“3397.992886”,
“9.095011909”,
“9.082856397”,
“6.809866946”,
“2190.530426”,
“6.816697567”,
“6.823541904”,
“1656.572278”
],
“PeriodsAmp”: [
0.27470885437689657,
0.12275502752316671,
0.08957207441483245,
-0.016351843276285773,
-0.0023253487734064167,
-0.027825652713169724,
-0.03622467995377892,
0.03745364586195977,
0.016931934821747943,
-0.007763938392135198,
0.001227009837326124,
-0.025790386622741152,
-0.008565987883641879,
0.00014664749664687222,
-0.01704107349960909,
-0.00797921907994325,
-0.03177647026752983,
-0.004956872049734769,
0.007932726074580026,
0.014516028377323971,
-0.021088964802417443,
-0.020789594142410307,
-0.0394312191315924,
-0.04134814573194381,
0.016270585503279013
],
“PeriodsPhase”: [
14.531794321199,
9.047644816654925,
6.2513288041048165,
4.835012524578427,
8.2937810112731,
5.467748908147056,
8.57387165414261,
4.054729761879573,
7.943122954685947,
8.951903685571338,
2.710382136770864,
8.02559427189266,
3.2041095507982096,
5.942537145429701,
5.976976092641082,
7.506337445154253,
5.347578022677064,
8.017917628086881,
5.8570430281895804,
6.547489676521564,
4.764028618408168,
4.06142922152038,
6.49245321390355,
4.201452643286066,
6.210242390637271
],
“Year”: “365.2495755”
}
PS C:\Users\paul\github\pukpr\python\simple\run0>
amo.dat.p
compare to warnemunde reference, warne.dat.p
{
“Aliased”: [
“0.0537449”,
“0.1074898”,
“0.220485143”,
“0.5”,
“1”,
“2”
],
“AliasedAmp”: [
-0.4042092506880945,
0.1498026647936091,
0.34974191131892546,
-0.06275860364797245,
-0.12693112051883154,
0.05360693094611856
],
“AliasedPhase”: [
5.022341284265671,
6.12724416388633,
5.10501755051668,
1.3489606861498495,
0.1576762764662913,
6.305517708416614
],
“DC”: -0.008758390763317466,
“Damp”: -0.004169125923760335,
“DeltaTime”: “3.416666667”,
“Hold”: 0.001492802207237816,
“Imp_Amp”: 197.45336102884804,
“Imp_Amp2”: 1.8841384082886352,
“Imp_Stride”: 8,
“Initial”: 0.06797642598445004,
“LTE_Amp”: 1.1234722131058268,
“LTE_Freq”: 129.45433340867712,
“LTE_Phase”: 0.9136521644032515,
“LTE_Zero”: 1.4732244756410906,
“Periods”: [
“27.2122”,
“27.3216”,
“27.5545”,
“13.63339513”,
“13.69114014”,
“13.6061”,
“13.6608”,
“13.71877789”,
“6795.985773”,
“1616.215172”,
“2120.513853”,
“13.77725”,
“3232.430344”,
“9.132931547”,
“9.108450374”,
“9.120674533”,
“27.0926041”,
“3397.992886”,
“9.095011909”,
“9.082856397”,
“6.809866946”,
“2190.530426”,
“6.816697567”,
“6.823541904”,
“1656.572278”
],
“PeriodsAmp”: [
0.2969846885625734,
0.12715090239433,
0.11195966030804025,
-0.014279802990919828,
-0.007476472864580455,
-0.027618411935182365,
-0.0314800276468536,
0.01803389223741826,
0.011163663341122482,
-0.0012907337497222084,
0.010385914775159287,
-0.024140665704639786,
-0.0024596839864129026,
0.00027007377126487056,
-0.014632061204798591,
-0.005915227697593744,
-0.04415788786521701,
-0.0030602495341499583,
0.009422574691039923,
0.013666201034033513,
-0.011874548174887829,
-0.01644029616663989,
-0.027183125961912056,
-0.01849393725550493,
0.0035426632273613356
],
“PeriodsPhase”: [
14.521637612309751,
8.824373362823483,
6.120768972631713,
5.031389621562438,
7.68019623052033,
5.535148594183447,
7.8408960747147844,
3.7085965346643084,
7.8128946785721185,
5.8037304389860065,
5.996864724827583,
8.12109584535951,
2.86102851568745,
6.520420198470608,
5.568571652192804,
7.4330567654835455,
4.544814917547044,
6.625719182549832,
7.045017606299215,
6.1446045083619385,
6.171838481758574,
4.209559209227534,
6.043091099560879,
4.664388204620863,
5.099462955240412
],
“Year”: “365.2495755”
}
warne.dat.p



AMO LTE
“LTE_Amp”: 1.587179814234174,
“LTE_Freq”: 125.53536829233441,
“LTE_Phase”: 1.2439579952989555,
“LTE_Zero”: 0.896474895660982,
Warne LTE
“LTE_Amp”: 1.1234722131058268,
“LTE_Freq”: 129.45433340867712,
“LTE_Phase”: 0.9136521644032515,
“LTE_Zero”: 1.4732244756410906,
AMO Warnemunde

The last set of cross-validation results are based on training of held-out data for intervals outside of 0.6-0.8 (i.e. training on t<0.6 and t>0.8 of the data, which extends from t=0.0 to t=1.0 normalized). This post considers training on intervals outside of 0.3-0.6 — a narrower training interval and correspondingly wider test interval.



Each fitted model result shows the cross-validation results based on training of held-out data — i.e. training on only the intervals outside of 0.6-0.8 (i.e. training on t<0.6 and t>0.8 of the data, which extends from t=0.0 to t=1.0 normalized). The best results are for time-series that have 100 years or more worth of monthly data, so the held-out data is typically 20 years. There is no selection bias trickery here, as this is a collection of independent sites and nothing in the MLR fitting process is specific to an individual time-series. In the following, the collection of results starts with the Stockholm site in Sweden, keeping in mind that the dashed line in the charts indicates the test or validation interval.




