Switch branches/tags
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
245 lines (173 sloc) 13.2 KB


This is Markdown rendition of a Jupyter Notebook that has been edited to provide description of the codes.

Testing the Millennial-Scale Holocene Solar-Climate Connection in the Indo-Pacific Warm Pool

D. Khider1, J. Emile-Geay1, N. McKay 2, C.S. Jackson 3, C. Rouston 2

1 University of Southern California
2 Northern Arizona University
3 The University of Texas at Austin


The existence of 1000 and 2500-year periodicities found in reconstructions of total solar irradiance (TSI) and a number of Holocene climate records has led to the hypothesis of a causal relationship[1-3]. However, attributing millennial-scale variability to solar forcing requires a mechanism by which small changes in total solar irradiance can influence a global climate response. One possible amplifier within the climate system is the ocean. If this is the case, then we need to know about where and how this may be occurring. On the other hand, the similarity in spectral peaks could be merely coincidental, and this should be made apparent by a lack of coherence in how that power and phasing are distributed in time and space.

The plausibility of the solar forcing hypothesis is assessed trough a Bayesian model of the age uncertainties affecting marine sedimentary records that is propagated through spectral analysis of the climate and forcing signals at key frequencies[4].


Data Selection

All the data used in this study are availabled on the LinkedEarth wiki , which supports complex queries. The three criteria used here are:

  1. SST-sensitive proxies, including Mg/Ca, U37k', TEX86
  2. >5000 years long
  3. Radiocarbon-based chronologies

The LinkedEarth wiki can be queried using a variety a methods detailed here . The code below describes a query made in the SPARQL language.

import json
import requests

url = ""

query = """prefix xsd: <>
#Distinct gives you a single value for the variables you are asking for
SELECT distinct ?dataset

  ?dataset <> ?d.
  ?d <> ?t.
  ?t <> ?v.
  ?t <> ?v1.
  OPTIONAL {?v <> ?a.
  ?a a <>.}
  #variable ?v of the dataset should be about either Mg/ca, Uk37 or TEX86
  VALUES ?proxy { "Mg/Ca" "Uk37" "TEX86"}
  ?v <> ?p.
  ?p <> ?proxy.

  #Variable ?v1 should be about Age and pass the following filters.
  ?v1 ?pr ?i.
  ?pr <> "OnInferredVariableProperty".#Trick, this should be URI
  ?i <> "Age".#Trick, this should be URI
  ?v1 <> "yr BP".
  ?v1 ?hasMinValue ?e1.
  ?hasMinValue <> "HasMinValue".#trick
  ?v1 ?hasMaxValue ?e2.
  ?hasMaxValue <> "HasMaxValue". #trick

  filter(?e1<5000 && ?e2>7000 && abs(?e2-?e1)>5000).
    ?v1 <> "kyr BP".
  ?v1 ?hasMinValue ?e1.
  ?hasMinValue <> "HasMinValue".#trick
  ?v1 ?hasMaxValue ?e2.
  ?hasMaxValue <> "HasMaxValue". #trick

  filter(?e1<5 && ?e2>7 && abs(?e2-?e1)>5).

  # Now create a filter for the Indo-Pacific warm pool (longitude: 100 to 160E and latitude: 30S to 30N)
  ?dataset <> ?z.
  ?z <> ?lat. # Get the latitude property
  filter(xsd:float(?lat)<30 && xsd:float(?lat)>-30). #filter
  ?z <> ?long. # Get the longitude property
  filter(xsd:float(?long)<160 && xsd:float(?long)>100). #filter

response =, data = {'query': query})
res = json.loads(response.text)

for item in res['results']['bindings']:
    print (item['dataset']['value'])

Coming soon on LinkedEarth

GUI-based queries because one of us had to learn SPARQL so you don't have to.

Science in the cloud: Records will be directly uploaded from the Wiki into the workspace.

The locations of the records resulting from the queries are plotted on the map below.


Age model

The age models for each of the sedimentary records considered in this study were obtained using the Bchron software[5]. Bchron returns ensemble age models that take into consideration the uncertainty in the radiocarbon measurements, in the calibration curve, and in the reservoir age of the ocean.

Bchron was originally coded in the R language. Since Jupyter Notebook allows to switch between the Python and R (even Matlab, see below) languages easily using cell magics, these codes can be reused without any modifications within the same environment.


Spectral Analysis

Lomb-Scargle Periodogram

Holocene periodicities were inferred from the Lomb-Scargle periodogram[6], which allows to handle unevenly-spaced timeseries, for each of the age model realizations (n=1000) returned by Bchron. We then identified the maximum peak within the 900-1200 year band, the 1200-2000 year band, and the 2000-3000 year band if present. The median periodicity is calculated at the median of the peak periodicities thus identified while the highest density region represents the 95% confidence interval on the peak periodicities.


Coming soon on LinkedEarth

Standard adoption also allows to build codes for the community by the community. The LinkedEarth team is currently building Python and R packages for the analysis of paleoclimate data.

For the R version, see GeochronR.

For the Python version, see Pyleoclim.

Cross-Wavelet Analysis

We performed cross-wavelet analysis[7] between each realization of the sedimentary records and the TSI record of ref 9. Since the cross-wavelet analysis code was written in the Matlab language, we use pymatbridge to run a m-file within the Python environment (see the code below).

So far, this Notebook has made use of Python, R, and Matlab codes.

# Get a Matlab session started
from pymatbridge import Matlab
mlab = Matlab()

mlab = Matlab(executable='/Applications/')

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge-4ca9fe0f-1eae-49fb-8e9a-2188d8b16241
Send 'exit' command to kill the server
..........MATLAB started and connected!

//anaconda/lib/python3.5/site-packages/IPython/ ShimWarning: The `IPython.nbformat` package has been deprecated. You should import from nbformat instead.
  "You should import from nbformat instead.", ShimWarning)

<pymatbridge.pymatbridge.Matlab at 0x128c5e898>


Holocene Periodicities within the Indo-Pacific Warm Pool

The median periodicity is expressed as the median peak of the ensemble spectra while the highest density region (HDR) represents the 95% confidence interval on the ensemble spectra.

900-1200-yr band


Mean periodicity ± standard error = 1022 ± 27 years.

1200-2000-yr band


Mean periodicity ± standard error = 1486 ± 96 years.

2000-3000 yr band


Mean periodicity ± standard error = 2391 ± 138 years.

Despite large uncertainties in the location of the spectral peak within each individual record arising from age model uncertainty, sea surface variability of ~1000 years, ~1500 years, and ~2500 years are present in at least 70-95% of the ensemble spectra.

Remarkably, all records suggest a periodicity near ~1500 years, reminiscent of the cycles characteristic of Marine Isotope Stage 3[8]. These cycles are absent from existing records of TSI[9], questioning the millennial-scale solar-climate connection.

The role of the sun


The mean phase ± standard deviation is -17±55° for the periodicity centered around ~1000 years and 10±97° for the periodicity centered around ~2500 years.

Key points

  1. The large age model uncertainty inherent to paleoceanographic reconstructions prevents meaningful analysis of periodicities from one single record.
  2. Synthesis of multple records suggests robust periodicities centered around ~1000 years, ~1500 years and ~2500 years in sea surface temperature variability within the Indo-Pacific Warm Pool.

  3. We cannot discard the possibility that the sun might have paced millennial-scale climate variability over the Holocene.

  4. Refuting or accepting the solar forcing hypothesis will require additional records with a global coverage.
  5. LinkedEarth aims to facilitate synthesis work to answer pressing questions in paleoclimatology.

Future Work

  1. Expand the database to global coverage.
  2. Explore lead-lag relationships among various regions.
  3. Estimate magnitude of millennial-scale variability.

LinkedEarth and the future of paleoclimatology

  • Crowdsource data curation though a wiki platform.
  • Develop web standards for paleoclimate observations.
  • Develop social codes to accelerate scientific discovery.

The ultimate goal of LinkedEarth is to allow scientists to spend more time on science, less on issues computers can solve.


  1. Bond, G., et al., Persistent solar influence on North Atlantic climate during the Holocene. Science, 2001. 294(2130): p. 2130-2136.
  2. Debret, M., et al., The origin of the 1500-year climate cycles in Holocene North Atlantic record. Climate of the Past Discussions, 2007. 3: p. 679-692.
  3. Debret, M., et al., Evidence from wavelet analysis for a mid-Holocene transition in global climate forcing. Quaternary Science Reviews, 2009. 28(25-26): p. 2675-2688.
  4. Khider, D., C.S. Jackson, and L.D. Stott, Assessing millennial-scale variability during the Holocene: A perspective from the western tropical Pacific. Paleoceanography, 2014. 29(3): p. 143-159.
  5. Haslett, J. and A. Parnell, A simple monotone process with application to radiocarbon-dated depth chronologies. Journal of the Royal Statistical Society C, 2008. 57: p. 399-418.
  6. Lomb, N.R., Least-squares frequency analysis of unequally spaced data. Astrophysics and Space Science, 1976. 39: p. 447-462.
  7. Grinsted, A., J.C. Moore, and S. Jevrejeva, Application of the cross wavelet transform and wavelet coherence to geophysical time series. Nonlinear processes in Geophysics, 2004. 11: p. 561-566.
  8. Schulz, M., On the 1470-year pacing of Dansgaard-Oeschger warm events. Paleoceanography, 2002. 17(2).
  9. Steinhilber, F., et al., 9,400 years of cosmic radiation and solar activity from ice cores and tree rings. Proc Natl Acad Sci U S A, 2012. 109(16): p. 5967-71.


This material is based upon work supported by the National Science Foundation under Grant Number ICER-1541029. Any opinions, findings, and conclusions or recommendations expressed in this material are those of the investigators and do not necessarily reflect the views of the National Science Foundation.