Age model and chronology construction

1 Building Chronologies

Time is central to understanding paleoecological change. For this reason, having reliable and robust chronologies within paleoecological analysis is critical for understanding change. This workbook will illustrate simple workflows for generating three of the most commonly used age models (clasical, Bacon and BChron), and for understanding their outputs.

1.1 Work Plan

This workbook will show the user how to:

  • Obtain data from the Neotoma Paleoecological Database
  • Work with Neotoma’s reported chronologies & understand their strengths & weaknesses
  • Obtain the raw geochronological data for a record
  • Build an age model using the chronological data using the Bayesian method in BChron

2 Obtaining data from the Neotoma Paleoecological Database

Data from Neotoma can be accessed using the neotoma package for R. To download data from Neotoma we first need to load the library and issue a request for data. Neotoma can return site information, more complete dataset information and the full download information. Let’s start by looking at datasets with pollen information.

install.packages('neotoma')

Now, let’s search for data and see what we get:

library(neotoma)
library(analogue)
library(Bchron)

pollen_sites <- get_dataset(datasettype = 'pollen', gpid = 'Mexico')

This returns 19 datasets for Switzerland. You can access the help for get_dataset() using the R command ?get_dataset, and you can then see more information about search terms available.

Given the number of sites, it might be a bit annoting to just print out the whole list of sites using print(pollen_sites), or just by typing pollen_sites. There are two ways of viewing the sites spatially, either plot(pollen_sites) or plot_leaflet(pollen_sites). Let’s have a bit of fun by using the plot_leaflet() function:

plot_leaflet(pollen_sites)

Given these datasets, we might as well choose one to download. In this case, we will be using the Cenote San Jose Chulchaca record. This pollen record is dataset 2396, part of the Latin American Pollen Database, and we can see more information about the dataset by using the browse() function in the neotoma package:

browse(2396)

The record seems well constructed, but we will use it to illustrate reconstruction using BChron. First, we will download the dataset:

cen_pol <- get_download(2396)
## API call was successful. Returned record for Cenote San JoseChulchaca
## Warning in split_indices(.group, .n): '.Random.seed' is not an integer
## vector but of type 'NULL', so ignored
Stratiplot(cen_pol, sort = 'wa', group="TRSH")

3 Building the Age Model

The age model is stored within a download object’s sample.meta element. There is a helper function in the neotoma package, ages():

ages(cen_pol[[1]])
depth thickness age.older age age.younger chronology.name age.type chronology.id sample.id dataset.id unit.name
2 1 NA NA 9 NA Leyden 1995b Radiocarbon years BP 1179 48974 2396 NA
28 5 NA NA 45 NA Leyden 1995b Radiocarbon years BP 1179 48975 2396 NA
3 9 NA NA 82 NA Leyden 1995b Radiocarbon years BP 1179 48976 2396 NA
4 13 NA NA 118 NA Leyden 1995b Radiocarbon years BP 1179 48977 2396 NA
5 17 NA NA 154 NA Leyden 1995b Radiocarbon years BP 1179 48978 2396 NA
6 21 NA NA 191 NA Leyden 1995b Radiocarbon years BP 1179 48979 2396 NA

These ages are the result of the construction of a chronology. In the case of the Cenote San Jose Chulchaca record we can use the command length(cen_pol[[1]]$chronologies) to see that there are three chronologies. The function get_chroncontrol() provides us with the chronological controls used to generate the age model:

cen_chron <- get_chroncontrol(cen_pol)
## $`2396`
## Chronology for Cenote San Jose Chulchaca, dataset ID: 2396
## Leyden 1995b: Default model, constructed using linear interpolation.
## Model age span: 0 to 2230
## Model age units: Radiocarbon years BP
## 
##   depth thickness  age age.young age.old control.type chron.control.id
## 1     0        NA    0         0       0     Core top             6665
## 2    65         6  590       520     660  Radiocarbon             6666
## 3    85         6 1010       920    1200  Radiocarbon             6667
## 4    99         6 1860      1710    2010  Radiocarbon             6668
## 
## Accessed 2018-01-09 22:00h. 
## 
## attr(,"class")
## [1] "chroncontrol_list" "list"

With this record we can pull the depths from lob_pol[[1]]$sample.meta$depth to predict the model at, and use the chronology controls as the tie points for the chronology.

cen_chron[[1]]$chron.control$thickness[1] <- 5
cen_chron[[1]]$chron.control$age.young[1] <- cen_chron[[1]]$chron.control$age.young[1] - 1


cen_model <- Bchronology(  ages = cen_chron[[1]]$chron.control$age,
                         ageSds = cen_chron[[1]]$chron.control$age - cen_chron[[1]]$chron.control$age.young,
                      positions = cen_chron[[1]]$chron.control$depth,
            positionThicknesses = cen_chron[[1]]$chron.control$thickness,
               predictPositions = cen_pol[[1]]$sample.meta$depth,
                      calCurves = c("normal", rep("intcal13", 3)))

When the model is run it gives us the relatively complex BchronologyRun object. The object itself is described in the help for Bchronology. We can look at the posterior estimates for the model using the lob_model$thetaPredict element of the lob_model variable. Here we can see that the posteriors are arranged so that each depth is in a single column, with approximately (or exactly) 1000 rows, representing draws from the predicted distributions.

Given these results, we can use the plot function for the chronology:

plot(cen_model)

To then look at the model, and make assessments. You now have a new age model for your record!