Sea Surface Temperatures
Dai Davies, January 2015

Status report, Jan 2015

This work is an extension of the model initially built in a spreadsheet as summarised in the Stage 1 report.


There are three broad aims for this work:

1: Analysing the cyclic nature of the SST data (southern hemisphere sea surface temperatures) without any prior assumptions. The spreadsheet model was based on cycles from a solar radiance model. A de nouveau approach was required.

2: Developing an approach that optimised the model for extrapolation into the future. To achieve this the long period cycles must be accurately established. The bicentennial and millennial cycles are four and eight times the length of the SST data used. Conventional Fourier analysis requires a few whole cycles for accurate assessment so a an approach was taken that involved reconstructing the data from partial cycles.

3. The third aim was to look for phase shifts in the cycles that might reflect changes in ocean circulation over the sampled period – 1880 to 2014. This required an approach to visualisation of the phase of each cyclic components across the sample period.


The model was reconstructed in a heavily hacked version of the SLabView speech visualisation package, now named CycleView, which is written in Java and is being developed in the Eclipse SDK. It is available for download on request now, and will be permanently available when it is relatively stable, cleaned up, and some minimal documentation written.

The initial approach was to do a Fourier analysis of the southern hemisphere SST data using the Goertzel DFT algorithm implemented in SLabView that was built for analysing short segments of speech. For short signals the DFT is sensitive to signals not starting and ending at zero. With speech I was able to minimise this by starting and ending a segment at the nearest zero crossing. The SST data doesn't allow this because of the presence of long period cycles – particularly the millennial cycle.

I abandoned the DFT and took the reconstructive approach. After messing about familiarising myself with the problem and testing code I settled on a two stage method. 

Stage 1: The starting point was to scan a single cycle through the 2-1000 year range, or sub-ranges, optimising its magnitude and phase as the scan progressed by searching for a minimum in the RMS residual between model and signal while varying the strength and phase of the cycle for each new value of the cycle period. 

Having found the strongest peak I extract that signal from the data and repeat the process with the new residual signal to locate the next strongest component. This process was repeated until all significant components were located.

Stage 2: Since the location and height of some peaks varied as other cycles were extracted, the next step was to extract all peaks and vary each in turn to minimise the residual signal. The current cycle set is summarised in the Cycle Contributions table.



SST data (green), Model (red)


Millennial cycle

Cycle Contributions


There are a few general points that can be made from the cycles table:
1: The strongest few cycles – 800, 200, 11, 60 years – account for two thirds of the variance between model and signal.