--- title: "Age-depth models" author: "Dewey Dunnington" date: "`r Sys.Date()`" output: "rmarkdown::html_vignette": df_print: kable vignette: > %\VignetteIndexEntry{Age-depth models} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>", fig.height = 4, fig.width = 5, dpi = 150 ) ``` Given a known depths and known (or modelled) ages, it is often convenient to approximate age as a continuous function of depth in an archive. This package provides tools to flexibly create age-depth relationships with various rules for interpolating age within known age-depth values, and extrapolating above and below these values. Typically, this is interpolation between known values and extrapolating using average sedimentation rates based on ages known at discrete points in a core. ## Example Using the built-in dataset `alta_lake_210Pb_ages`, which contains a Lead-210 (CRS) age-depth relationship for a core from [Alta Lake, Whistler, British Columbia](https://en.wikipedia.org/wiki/Alta_Lake_(British_Columbia)), we can create an age-depth model (note that `age` and `depth` are evaluated within `.data`, if it is provided, and support tidy evaluation): ```{r} library(tidypaleo) alta_lake_adm <- age_depth_model( alta_lake_210Pb_ages, depth = depth_cm, age = age_year_ad, age_max = age_year_ad + age_error_yr, age_min = age_year_ad - age_error_yr ) alta_lake_adm ``` Then, we can plot the relationship: ```{r alta_lake_adm_plot} plot(alta_lake_adm) ``` ...Or predict raw data: ```{r} predict(alta_lake_adm, depth = seq(-1, 10, 0.5)) ``` The default behaviour is to interpolate within known ages/depths, and extrapolate using a linear fit of ages/depths. These can be specified using transform functions, which take XY data and produce forward and inverse predictions based on them. The default call is: ```{r, eval = FALSE} age_depth_model( ..., interpolate_age = age_depth_interpolate, extrapolate_age_below = ~age_depth_extrapolate(.x, .y, x0 = last, y0 = last), extrapolate_age_above = ~age_depth_extrapolate(.x, .y, x0 = first, y0 = first), interpolate_age_limits = trans_exact, extrapolate_age_limits_below = trans_na, extrapolate_age_limits_above = trans_na ) ``` To customize the behaviour of the predictions (e.g., disable extrapolating above or below), specify a transform function in the appropriate category. One-sided formulas are turned into functions using the `rlang::as_function()`. A more advanced way might be to only use the first/last few observations to extrapolate above and below, which one could do like this: ```{r} alta_lake_adm2 <- age_depth_model( alta_lake_210Pb_ages, depth = depth_cm, age = age_year_ad, age_max = age_year_ad + age_error_yr, age_min = age_year_ad - age_error_yr, extrapolate_age_below = ~age_depth_extrapolate( tail(.x, 3), tail(.y, 3), x0 = dplyr::last, y0 = dplyr::last ), extrapolate_age_above = ~age_depth_extrapolate( head(.x, 3), head(.y, 3), x0 = dplyr::first, y0 = dplyr::first ) ) plot(alta_lake_adm2) ```