GEM-LTE modeling

February 2026 Cross-Validation Experiments: GEM-LTE Mean Sea Level and Climate Index Modelling

Executive Summary

GEM-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.


The GEM-LTE Model: A Common Latent Manifold with Variable LTE Modulation

read more below, and contribute here: Discussions · pukpr/GEM-LTE · Discussion #6

Continue reading

Hoyer Metric in LTE Model Fitting

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.


What Is the Hoyer Sparsity Metric?

Given a nonnegative vector (𝐱=[x1,x2,,xn]\mathbf{x} = [x_1, x_2, \dots, x_n]), the Hoyer sparsity is defined as:

Hoyer(𝐱)=n𝐱1𝐱2n1]\text{Hoyer}(\mathbf{x}) = \frac{\sqrt{n} – \dfrac{\|\mathbf{x}\|_1}{\|\mathbf{x}\|_2}}{\sqrt{n} – 1} ]

Where:

  • |𝐱|1=i=1n|xi||\mathbf{x}|_1 = \sum_{i=1}^{n} |x_i| is the L1 norm (sum of absolute values).
  • |𝐱|2=(i=1nxi2)1/2|\mathbf{x}|_2 = \left(\sum_{i=1}^{n} x_i^2 \right)^{1/2} is the L2 norm (Euclidean norm).
  • nn is the length of the vector.

The Hoyer metric ranges from 0 (completely distributed, e.g., flat spectrum) to 1 (maximally sparse, only one element is nonzero).


Why Use the Hoyer Metric in Fitting?

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:

  • Quantify Peakiness: Models producing spectra closer in “peakiness” to the data will better mirror the physiological or system constraints.
  • Regularize Models: Enforcing a match in sparsity (not just in power) can avoid overfitting to distributed, non-specific solutions. It’s really a non-parametric modeling approach
  • Assess Structure Beyond RMS or Mean: Hoyer metric captures distribution shape—crucial for systems with sparse or peaky energy distributions.

Hoyer Metric Formula in the Code

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;  



Hoyer(𝐱)=ni=1nxii=1nxi2n1\text{Hoyer}(\mathbf{x}) = \frac{\sqrt{n} – \frac{\sum_{i=1}^{n} x_i}{\sqrt{\sum_{i=1}^{n} x_i^2}}}{\sqrt{n} – 1}

Where all (xi0x_i \geq 0). This is exactly as described in Hoyer’s paper.


Example Usage

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).

Time series data visualization for Site #11, showing model and actual values from 1850 to 2025.

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.

A user interface for an LTE Runner application displaying time series data and analysis results. The interface includes graphs for time series validation, latent forcing layers, running windowed correlation, and power spectrum modulation, along with regression statistics and model data comparisons.

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.


Citation and References

The Hoyer sparsity metric was introduced in:

  • Hoyer, P. O. (2004). “Non-negative matrix factorization with sparseness constraints.” Journal of Machine Learning Research, 5(Nov):1457–1469. [Link: JMLR Paper]

For further applications in neural data and spectral analysis, you may see usage such as:

  • Bruns, A. (2004). “Fourier-, Hilbert- and wavelet-based signal analysis: Are they really different approaches?” Journal of Neuroscience Methods, 137(2):321-332.

Conclusion

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:

  • Hoyer, P.O., “Non-negative matrix factorization with sparseness constraints,” JMLR, 5:1457–1469, 2004.\
  • Pukite, P., & Bankes, S. (2011). Entropic Complexity Measured in Context Switching. In Applications of Digital Signal Processing. InTech. https://doi.org/10.5772/25520

Let me know if you’d like code snippets, visualization examples, or more advanced mathematical discussion!

The mystery of El Nino

Google Gemini makes predictions on the next El Nino when prompted — scroll to the end.

https://gemini.google.com/app/8d7c963c197e05c0

There 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.

Continue reading

Current status of research according to AI

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]

Key Phenomena Addressed

Pukite applies this model to three main “unresolved mysteries” in geophysics:

  • Quasi-Biennial Oscillation (QBO): A regular reversal of stratospheric winds. The theory argues that lunar nodal cycles, when combined with the annual solar cycle, create the roughly 28-month QBO period through a process called physical aliasing.
  • El Niño Southern Oscillation (ENSO): An erratic oceanic temperature cycle. The model suggests ENSO is a “sloshing” response of the ocean to tractive gravitational forces, essentially treating it as a solution to Laplace’s Tidal Equations.
  • Chandler Wobble: A small deviation in the Earth’s axis of rotation. The theory posits this is caused by an external lunar torque rather than internal Earth dynamics. [1, 2, 3, 5, 6, 7]

How the Model Works

  1. Lunar Gravitational Potential: The model starts by calculating the precise lunar gravitational potential over time.
  2. Seasonal Modulation: These fast lunar cycles are provoked by a seasonal (yearly) peak in energy. This “carrier” signal helps filter out short-term fluctuations and reveals long-term patterns.
  3. Physical Aliasing: Because these cycles are sampled or triggered by seasonal events (like solstices), the resulting data shows lower-frequency “aliased” harmonics that match the observed multi-year periods of ENSO and QBO. [4, 8, 9]

Scientific Reception

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

[4] https://geoenergymath.com

[5] https://acp.copernicus.org

[6] https://geoenergymath.com

[7] https://geoenergymath.com

[8] https://esd.copernicus.org

[9] https://geoenergymath.com

[10] https://esd.copernicus.org


This link may go stale, but here is the original response:

https://share.google/aimode/ta098ixUIyoNefp49

Minnesota ICE-OUT update

This is an update to analyzing the dates of Minnesota lakes ice-out events, as described on this blog years ago: Ice Out

The trend has been that dates have been creeping earlier, corresponding to warmer winters.

Scatter plot showing the relationship between the year and the number of ice-out days in Minnesota at latitude 43 N, with a fitted trend line indicating a slight decreasing slope.
Scatter plot showing ice-out days in Minnesota at latitude 44 N over the years from 1840 to 2040, with a trend line indicating a slight decline.
Scatter plot showing the trend of ice out days per year in Minnesota (Latitude: 45 N) from 1860 to 2020. The fitted line indicates a slight downward trend, with the y-axis representing ice out days and the x-axis representing years.
Scatter plot showing ice out days per year from 1880 to 2023 in Minnesota, with a fitted regression line indicating a slight downward trend.
Scatter plot showing the trend of ice out day data over the years in Minnesota at latitude 47 N, with a fitted slope indicating a decrease in days per year, represented by red circles and a blue trend line.
Scatter plot showing the relationship between year and ice-out day for Minnesota at latitude 48 N, with fitted regression line indicating a negative slope.

This is all automated, pulled from JSON data residing on a Minnesota DNR server. I hadn’t looked at it for a while, as the original client query assumed that the JSON was in strict order, but the response changed to random and only recently have I updated. The same approach used is to access lake data from common latitudes and do a least-squares regression on each set. The software is described here and available here, based on a larger AI project described here.

User interface displaying a form for plotting data from 1843 to 2025 with a specified latitude of 44.0, accompanied by options to clear data and submit the request.

There are seven anomalous data points1 that point to ice-out dates prior to January, which may in fact be faulty data, but are kept in place because they won’t change the slopes too much

Summary

2013 slopes2026 slopes
43 N-0.066-0.1042
44 N-0.047-0.08595
45 N-0.068-0.10873
46 N-0.0377-0.0416
47 N-0.0943-0.04138
48 N-0.1995-0.0835

The overall average is around -0.08 days earlier per year which amounts to 8 days earlier ice-out over 100 years.

The last “year without a winter” in Minnesota was 1877-1878 which corresponded to a huge global El Nino. One can perhaps see this in the 44 N and 45 N plots showing early outliers but the data was sparse back then. More obvious is the short winter of 2023-2024, where many lakes never froze or one close to my place was really only solid for a time in December. Can look up news stories on this such as the following

2024: The Brainerd Jaycees Ice Fishing Extravaganza on Gull Lake—one of the world's largest—was canceled for the first time in its 34-year history because the ice was too thin to support the event.

Footnotes

  1. The following lakes showed anomalous ice-out dates, assumed to be late in the previous year or late in the current year, the latter which would be physically impossible
    Lake Cotton @ 46.88259 N (11/23/2010 [day -39.0]))
    Lake Leek (Trowbridge) @ 46.68309 N (12/07/2021 [day -25.0]))
    Lake Little Wabana @ 47.40002 N (12/08/2021 [day -24.0]))
    Lake Star @ 45.06337 N (11/20/2022 [day -42.0]))
    Lake Lewis @ 45.7479 N (11/28/2022 [day -34.0]))
    Lake Unnamed @ 44.81299 N (11/25/2023 [day -37.0]))
    Lake Unnamed @ 44.81299 N (11/26/2024 [day -36.0])) ↩︎

Hidden latent manifolds in fluid dynamics

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

  • nino34 — NINO34 (PACIFIC)
  • nino4 — NINO4 (PACIFIC)
  • amo — AMO (ATLANTIC)
  • ao — AO (ARCTIC)
  • denison — Ft Denison (PACIFIC)
  • iod — IOD (INDIAN)
  • iodw — IOD West (INDIAN)
  • iode — IOD East (INDIAN)
  • nao — NAO (ATLANTIC)
  • tna — TNA Tropical N. Atlantic (ATLANTIC)
  • tsa — TSA Tropical S. Atlantic (ATLANTIC)
  • qbo30 — QBO 30 Equatorial (WORLD)
  • darwin — Darwin SOI (PACIFIC)
  • emi — EMI ENSO Modoki Index (PACIFIC)
  • ic3tsfc — ic3tsfc (Reconstruction) (PACIFIC)
  • m6 — M6, Atlantic Nino (ATLANTIC)
  • m4 — M4, N. Pacific Gyre Oscillation (PACIFIC)
  • pdo — PDO (PACIFIC)
  • nino3 — NINO3 (PACIFIC)
  • nino12 — NINO12 (PACIFIC)
  • 1 — BREST (FRANCE)
  • 10 — SAN FRANCISCO (UNITED STATES)
  • 11 — WARNEMUNDE 2 (GERMANY)
  • 14 — HELSINKI (FINLAND)
  • 41 — POTI (GEORGIA)
  • 65 — SYDNEY, FORT DENISON (AUSTRALIA)
  • 76 — AARHUS (DENMARK)
  • 78 — STOCKHOLM (SWEDEN)
  • 111 — FREMANTLE (AUSTRALIA)
  • 127 — SEATTLE (UNITED STATES)
  • 155 — HONOLULU (UNITED STATES)
  • 161 — GALVESTON II, PIER 21, TX (UNITED STATES)
  • 163 — BALBOA (PANAMA)
  • 183 — PORTLAND (MAINE) (UNITED STATES)
  • 196 — SYDNEY, FORT DENISON 2 (AUSTRALIA)
  • 202 — NEWLYN (UNITED KINGDOM)
  • 225 — KETCHIKAN (UNITED STATES)
  • 229 — KEMI (FINLAND)
  • 234 — CHARLESTON I (UNITED STATES)
  • 245 — LOS ANGELES (UNITED STATES)
  • 246 — PENSACOLA (UNITED STATES)

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.dat.p

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

amo.dat.p

{
  "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

Simpler models can outperform deep learning at climate prediction

This article in MIT News:

https://news.mit.edu/2025/simpler-models-can-outperform-deep-learning-climate-prediction-0826

“New research shows the natural variability in climate data can cause AI models to struggle at predicting local temperature and rainfall.” … “While deep learning has become increasingly popular for emulation, few studies have explored whether these models perform better than tried-and-true approaches. The MIT researchers performed such a study. They compared a traditional technique called linear pattern scaling (LPS) with a deep-learning model using a common benchmark dataset for evaluating climate emulators. Their results showed that LPS outperformed deep-learning models on predicting nearly all parameters they tested, including temperature and precipitation.

Machine learning and other AI approaches such as symbolic regression will figure out that natural climate variability can be done using multiple linear regression (MLR) with cross-validation (CV), which is an outgrowth or extension of linear pattern scaling (LPS).

https://pukpr.github.io/results/image_results.html

When this was initially created on 9/1/2025, there were 3000 CV results on time-series
that averaged around 100 years (~1200 monthly readings/set) so over 3 million data points

In this NINO34 (ENSO) model, the test CV interval is shown as a dashed region

I developed this github model repository to make it easy to compare many different data sets, much better than using an image repository such as ImageShack.

There are about 130 sea-level height monitoring stations in the sites, which is relevant considering how much natural climate variation a la ENSO has an impact on monthly mean SLH measurements. See this paper Observing ENSO-modulated tides from space

“In this paper, we successfully quantify the influences of ENSO on tides from multi-satellite altimeters through a revised harmonic analysis (RHA) model which directly builds ENSO forcing into the basic functions of CHA. To eliminate mathematical artifacts caused by over-fitting, Lasso regularization is applied in the RHA model to replace widely-used ordinary least squares. “

Mathematical GeoEnergy 2018 vs ChatGPT 2025

On RealClimate.org

Paul Pukite (@whut) says

1 JUL 2025 AT 9:48 PM

Your comment is awaiting moderation.

“If so, do you have an explanation why the diurnal tides do not move the thermocline, whereas tides with longer periods do?”

The character of ENSO is that it shifts by varying amounts on an annual basis. Like any thermocline interface, it reaches the greatest metastability at a specific time of the year. I’m not making anything up here — the frequency spectrum of ENSO (pick any index NINO4, NINO34, NINO3) shows a well-defined mirror symmetry about the value 0.5/yr. Given that Incontrovertible observation, something is mixing with the annual impulse — and the only plausible candidate is a tidal force.
So the average force of the tides at this point is the important factor to consider. Given a very sharp annual impulse, the near daily tides alias against the monthly tides — that’s all part of mathematics of orbital cycles. So just pick the monthly tides as it’s convenient to deal with and is a more plausible match to a longer inertial push.

Sunspots are not a candidate here.

Some say wind is a candidate. Can’t be because wind actually lags the thermocline motion.

So the deal is, I can input the above as a prompt to ChatGPT and see what it responds with

https://chatgpt.com/share/68649088-5c48-8010-a767-4fe75ddfeffc

Chat GPT also produces a short Python script which generates the periodogram of expected spectral peaks.

I placed the results into a GitHub Gist here, with charts:
https://gist.github.com/pukpr/498dba4e518b35d78a8553e5f6ef8114

I made one change to the script (multiplying each tidal factor by its frequency to indicate its inertial potential, see the ## comment)

At the end of the Gist, I placed a representative power spectrum for the actual NINO4 and NINO34 data sets showing where the spectral peaks match. They all match. More positions match if you consider a biennial modulation as well.

Now, you might be saying — yes, but this all ChatGPT and I am likely coercing the output. Nothing of the sort. Like I said, I did the original work years ago and it was formally published as Mathematical Geoenergy (Wiley, 2018). This was long before LLMs such as ChatGPT came into prominence. ChatGPT is simply recreating the logical explanation that I had previously published. It is simply applying known signal processing techniques that are generic across all scientific and engineering domains and presenting what one would expect to observe.

In this case, it carries none of the baggage of climate science in terms of “you can’t do that, because that’s not the way things are done here”. ChatGPT doesn’t care about that prior baggage — it does the analysis the way that the research literature is pointing and how the calculation is statistically done across domains when confronted with the premise of an annual impulse combined with a tidal modulation. And it nailed it in 2025, just as I nailed it in 2018.

Reply

Teleconnection vs Common-Mode

A climate teleconnection is understood as one behavior impacting another — for example NINOx => AMO, meaning the Pacific ocean ENSO impacting the Atlantic ocean AMO via a remote (i.e. tele) connectiion. On the other hand, a common-mode behavior is a result of a shared underlying cause impacting a response in a uniquely parameterized fashion — for example NINOx = g(F(t), {n1, n2, n3, ...}) and AMO = g(F(t), {a1, a2, a3, ...}), where the n's are a set of constant parameters for NINOx and the a's are for AMO.

In this formulation F(t) is a forcing and g() is a transformation. Perhaps the best example of a common-mode response to a forcing is in the regional tidal response in local sea-level height (SLH). Obviously, the lunisolar forcing is a common mode in different regions and subtle variations in the parametric responses is required to model SLH uniquely. Once the parameters are known, one can make practical predictions (subject to recalibration as necessary).

Continue reading