Title: | Fit a Collection of Curves to Single Cohort Decomposition Data |
---|---|
Description: | There is a long tradition of studying the flux of carbon from the biosphere to the atmosphere by following a particular cohort of litter (wood, leaves, roots, or other organic material) through time. The resulting data are mass remaining and time. A variety of functional forms may be used to fit the resulting data. Some work better empirically. Some are better connected to a process-based understanding. Some have a small number of free parameters; others have more. This package matches decomposition data to a family of these curves using likelihood--based fitting. This package is based on published research by Cornwell & Weedon (2013) <doi:10.1111/2041-210X.12138>. |
Authors: | Will Cornwell [aut, cre] |
Maintainer: | Will Cornwell <[email protected]> |
License: | MIT + file LICENSE |
Version: | 0.1.3 |
Built: | 2025-02-19 03:44:16 UTC |
Source: | https://github.com/traitecoevo/litterfitter |
Create a bootstrap distribution of a particular coefficient from a model fit
bootstrap_parameters(x,nboot,upper,lower,...)
bootstrap_parameters(x,nboot,upper,lower,...)
x |
an object of class " |
nboot |
number of bootstrap replications |
upper |
optional vector of upper bounds for the bootstrap replicates |
lower |
optional vector of lower bounds for the bootstrap replicates |
... |
passed to |
litfit_bootstrap object
fit <- fit_litter(time=pineneedles$Year, mass.remaining=pineneedles$Mass.remaining, model='neg.exp', iters=100) boot1 <- bootstrap_parameters(fit, nboot = 500)
fit <- fit_litter(time=pineneedles$Year, mass.remaining=pineneedles$Mass.remaining, model='neg.exp', iters=100) boot1 <- bootstrap_parameters(fit, nboot = 500)
Non-linear fits of different models to the decomposition trajectory of one cohort (as in typical litterbag studies) data. Models range from very simple (and easy to fit with limited data) to more complex.
fit_litter( time, mass.remaining, model = c("neg.exp", "weibull", "discrete.parallel", "discrete.series", "cont.quality", "neg.exp.limit"), iters = 500, upper = NULL, lower = NULL, ... )
fit_litter( time, mass.remaining, model = c("neg.exp", "weibull", "discrete.parallel", "discrete.series", "cont.quality", "neg.exp.limit"), iters = 500, upper = NULL, lower = NULL, ... )
time |
time since decomposition began, that is, ti-t0 |
mass.remaining |
proportional mass loss, that is, mi/m0 |
model |
there are five models currently implemented (see below) |
iters |
Number of random starts for the fitting. Use higher numbers for models with larger numbers of parameters and for models that inherently tend to be less identifiable. |
upper , lower
|
Optional user specified values for the upper and lower bounds used by
|
... |
Additional arguments passed to |
the model likelihood is maximized using methods available in optim
. Optimization methods to be used within optim can be specified through the control object (i.e., control$method). The default method is L-BFGS-B with bounds specific to each model. Each model
weibull The Weibull residence time model–two parameters (Frechet 1927)
discrete.parallel Two pools in parallel with a term for the fraction of initial mass in each pool–three parameter (Manzoni et al. 2012)
discrete.series A three parameter model in which there is the possibility of two sequential pools (Manzoni et al. 2012)
cont.quality (Ågren and Bosatta 1996, see also Manzoni et al. 2012)
Warning: difficulty in finding the optimal solution is determined by an interaction between the nature and complexity of the likelihood space (which is both data- and model-dependent) as well as the optimization methods. There is can never be a guarantee that the optimal solution is found, but using many random starting points will increase these odds. It should be noted that there is significant variation among models in identifiability, with some models inherently less identifiable likely due to a tendency to form for flat ridges in likelihood space. The confidence in the fit should be very low in these cases (see Cornwell and Weedon 2013). A number of random starting points are used in optimization and are given through the iters. The function checks whether the the top 10 optimizations have converged on the same likelihood, and if they have not this function will return a warning.
returns a litfit object with the following elements:
optimFit: a list generated by the optim
function
logLik: the log-likelihood of the model
time: vector of time (same as input)
mass: vector os mass remaining (same as input)
predicted: predicted values from the model for each of the points within time
model: name of the model
nparams: number of fit parameters in the model
AIC: AIC of the model fit
AICc: AICc of the model fit
BIC: BIC of the model fit
and some other potentially useful things
Will Cornwell and James Weedon
Ågren, G. and Bosatta, E. (1996) Quality: a bridge between theory and experiment in soil organic matter studies. Oikos, 76, 522–528.
Cornwell, W. K., and J. T. Weedon. (2013). Decomposition trajectories of diverse litter types: a model selection analysis. Methods in Ecology and Evolution.
Frechet, M. (1927) Sur la loi de probabilite de lecart maximum. Ann de la Soc polonaise de Math, 6, 93–116.
Manzoni, S., Pineiro, G., Jackson, R. B., Jobbagy, E. G., Kim, J. H., & Porporato, A. (2012). Analytical models of soil and litter decomposition: Solutions for mass loss and time-dependent decay rates. Soil Biology and Biochemistry, 50, 66-76.
Olson, J.S. (1963) Energy storage and the balance of producers and decomposers in ecological systems. Ecology, 44, 322–331.
optim
,
steady_state
,
plot.litfit
data(pineneedles) fit<-fit_litter(time=pineneedles$Year,mass.remaining=pineneedles$Mass.remaining, model='neg.exp',iters=1000)
data(pineneedles) fit<-fit_litter(time=pineneedles$Year,mass.remaining=pineneedles$Mass.remaining, model='neg.exp',iters=1000)
There is a long tradition of studying the flux of carbon from the biosphere to the atmosphere by following a particular cohort of litter (wood, leaves, roots, or other organic material) through time. The resulting data are mass remaining and time. A variety of functional forms may be used to fit the resulting data. Some work better empirically. Some are better connected to a process-based understanding. Some have a small number of free parameters; others have more. This package matches decomposition data to a set of these curves using likelihood–based fitting.
Maintainer: Will Cornwell [email protected] (ORCID)
Authors:
James Weedon
Other contributors:
Guofang Liu [contributor]
Cornwell, W. K., and J. T. Weedon. (2013). Decomposition trajectories of diverse litter types: a model selection analysis. Methods in Ecology and Evolution.
Manzoni, S., Pineiro, G., Jackson, R. B., Jobbagy, E. G., Kim, J. H., & Porporato, A. (2012). Analytical models of soil and litter decomposition: Solutions for mass loss and time-dependent decay rates. Soil Biology and Biochemistry, 50, 66-76.
Useful links:
Report bugs at https://github.com/traitecoevo/litterfitter/issues
data from Hobbie et al means of pine needle decomposition
data(pineneedles)
data(pineneedles)
a data.frame with two columns
Will Cornwell
Hobbie et al.
Plot multiple fits of decomposition trajectories on one graph with model selection results displayed
plot_multiple_fits(time,mass.remaining,model,color,iters,bty,...)
plot_multiple_fits(time,mass.remaining,model,color,iters,bty,...)
time |
vector of time points |
mass.remaining |
vector of mass remaining |
model |
vector of models to fit and plot (see |
color |
a vector of colors the same length as the number of models |
iters |
parameter passed to |
bty |
bty |
... |
additional parameters passed to |
this function is designed to compare a variety of curve shapes visually and with AIC and BIC simultaneously
plot of multiple fits, returns invisibly
Liu Guofang
data(pineneedles,package='litterfitter') plot_multiple_fits(time = pineneedles$Year, mass.remaining = pineneedles$Mass.remaining, bty = 'n', model = c('neg.exp', 'weibull'), xlab = 'Time', ylab = 'Proportion mass remaining',iters=200)
data(pineneedles,package='litterfitter') plot_multiple_fits(time = pineneedles$Year, mass.remaining = pineneedles$Mass.remaining, bty = 'n', model = c('neg.exp', 'weibull'), xlab = 'Time', ylab = 'Proportion mass remaining',iters=200)
Plot a Litter Decomposition Trajectory with Curve Fit
## S3 method for class 'litfit' plot(x, formulae.cex = 1, ...)
## S3 method for class 'litfit' plot(x, formulae.cex = 1, ...)
x |
A 'litfit' object. |
formulae.cex |
Size scaling factor for the formula display on the plot. |
... |
Additional arguments passed to |
Visualizes the litter decomposition trajectory data and its curve fit derived from a 'litfit' object. This function is designed to provide a quick visual check on the adequacy of model fitting.
The plot displays data points from the 'litfit' object along with the curve fit. The formula for the fit is displayed on the plot.
A plot visualizing the data and curve fit from a 'litfit' object. The result is returned invisibly.
Will Cornwell
fit_litter
for generating 'litfit' objects.
fit <- fit_litter( time=c(0,1,2,3,4,5,6), mass.remaining=c(1,0.9,1.01,0.4,0.6,0.2,0.01), 'neg.exp', iters=250 ) plot(fit)
fit <- fit_litter( time=c(0,1,2,3,4,5,6), mass.remaining=c(1,0.9,1.01,0.4,0.6,0.2,0.01), 'neg.exp', iters=250 ) plot(fit)
Plot a bootstrap distribution of a particular coefficient
## S3 method for class 'litfit_bootstrap' plot(x,coef.index,bw,...)
## S3 method for class 'litfit_bootstrap' plot(x,coef.index,bw,...)
x |
litfit object |
coef.index |
coefficient number to plot from the |
bw |
bandwidth (or bandwidth algorithm see |
... |
additional arguments passed to plot.default |
The grey fill goes from 0.025 quantile to the 0.975 quantile of the distribution. Red line shows the mean. Blue line shows the median.
plot of litfit_bootstrap object, returns invisibly
James Weedon
fit_litter
bootstrap_parameters
density
fit <- fit_litter(time=pineneedles$Year, mass.remaining=pineneedles$Mass.remaining, model='neg.exp', iters=200) boot1 <- bootstrap_parameters(fit, nboot = 500) plot(boot1)
fit <- fit_litter(time=pineneedles$Year, mass.remaining=pineneedles$Mass.remaining, model='neg.exp', iters=200) boot1 <- bootstrap_parameters(fit, nboot = 500) plot(boot1)
Generated predicted values for (new) time points from a litfit model fit
## S3 method for class 'litfit' predict(object,newdata=NULL,...)
## S3 method for class 'litfit' predict(object,newdata=NULL,...)
object |
litfit object |
newdata |
optional vector of new Time points at which to predict mass remaining. If not specified, Time points from the original fit are used. |
... |
further arguments passed to or from other methods. |
to do
predicted values from a litfit object
Will Cornwell
James Weedon
fit<-fit_litter(time=c(0,1,2,3,4,5,6),mass.remaining=c(1,0.9,1.01,0.4,0.6,0.2,0.01), 'neg.exp',iters=250) predict(fit, newdata=1:10)
fit<-fit_litter(time=c(0,1,2,3,4,5,6),mass.remaining=c(1,0.9,1.01,0.4,0.6,0.2,0.01), 'neg.exp',iters=250) predict(fit, newdata=1:10)
Estimate Steady State Biomass
steady_state(x = NULL, pars = NULL, model = NULL)
steady_state(x = NULL, pars = NULL, model = NULL)
x |
A 'litfit' object. If provided, 'pars' and 'model' parameters are extracted from this object. |
pars |
A numeric vector of parameters for the model. Only needed if 'x' is not provided. |
model |
A character string specifying the decomposition model. Must be one of the following: "neg.exp", "weibull", "discrete.parallel", "discrete.series", or "cont.quality2". Only needed if 'x' is not provided. |
Computes the steady state biomass, as a proportion of the annual input, based on a given model fit or parameters.
Currently, the function supports a subset of decomposition models. New model support is planned for future updates.
A named numeric value representing the estimated steady state biomass from the specified model.
Will Cornwell
fit_litter
for generating 'litfit' objects.
# Example with litfit object fit <- fit_litter( time = c(0,1,2,3,4,5,6), mass.remaining = c(1,0.9,1.01,0.4,0.6,0.2,0.01), model = 'neg.exp', iters = 250 ) steady_state(fit) # Example with specific model and parameter values steady_state(pars = c(6,2), model = "weibull")
# Example with litfit object fit <- fit_litter( time = c(0,1,2,3,4,5,6), mass.remaining = c(1,0.9,1.01,0.4,0.6,0.2,0.01), model = 'neg.exp', iters = 250 ) steady_state(fit) # Example with specific model and parameter values steady_state(pars = c(6,2), model = "weibull")
Get estimated time to 0.5 (or an alternate threshold) mass loss from a particular fit to a litter decomposition trajectory
time_to_prop_mass_remaining(x,threshold.mass=0.5)
time_to_prop_mass_remaining(x,threshold.mass=0.5)
x |
a litfit object |
threshold.mass |
mass loss threshold in proportion, default is 0.5 |
this function finds the time to a specified mass loss percentage
numeric value that represents time to a specified mass loss percentage
Will Cornwell
fit<-fit_litter(time=pineneedles$Year,mass.remaining=pineneedles$Mass.remaining, model='neg.exp',iters=1000) time_to_prop_mass_remaining(fit, threshold.mass = 0.5)
fit<-fit_litter(time=pineneedles$Year,mass.remaining=pineneedles$Mass.remaining, model='neg.exp',iters=1000) time_to_prop_mass_remaining(fit, threshold.mass = 0.5)