--- title: "Integrating with the gasfluxes package" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Integrating with the gasfluxes package} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` As noted in the [introductory vignette](intro-to-fluxfinder.html), there are many reasons why greenhouse gas concentration observations might not be well fit by a linear model: diffusion effects, saturation, mixing problems, etc. The `fluxfinder` package provides extensive outputs based on linear model fits, and a few QA/QC indicators based on a polynomial model, but there are cases where we might want to take advantage of more sophisticated model-fitting routines. ## Some problematic sample data ```{r setup} library(fluxfinder) # Load the data # Data from a LI-7810 f <- system.file("extdata/TG10-01087-curvature.data", package = "fluxfinder") dat <- ffi_read_LI7810(f) # Fit a linear flux and QA/QC it flux <- ffi_compute_fluxes(dat, group_column = NULL, time_column = "TIMESTAMP", gas_column = "CO2") print(flux$lin_flux.estimate) print(flux$lin_r.squared) print(flux$poly_r.squared) print(flux$HM81_flux.estimate) ``` There's a fairly large jump from the R2 of the linear model (0.93) to that of a polynomial (0.99+), and the flux computed by the [Hutchinson and Mosier (1981)](http://dx.doi.org/10.2136/sssaj1981.03615995004500020017x) nonlinear approach is numeric (i.e., non-`NA`). This implies nonlinearity in our data: ```{r qaqc-plot, fig.width=7} library(ggplot2) dat$SECONDS <- dat$SECONDS-min(dat$SECONDS) ggplot(dat, aes(SECONDS, CO2)) + geom_point() + # naive linear model geom_smooth(method = "lm", formula = 'y ~ x') + # HM1981 flux line geom_abline(slope = flux$HM81_flux.estimate, intercept = min(dat$CO2), linetype = 2) ``` There's definitely a problem! Depending on what we think is happening here, one option would be to change the observation length so that the flux is computed based on only the first ~75 seconds, which looks linear. A second option would be to use the `flux_HM1981` field as our flux. A third option would be fit more sophisticated model(s). ## Using the gasfluxes package The [gasfluxes package](https://git-dmz.thuenen.de/fuss/gasfluxes) also provides routines to calculate greenhouse gas fluxes from chamber measurements, and includes code to fit the [HMR](http://dx.doi.org/10.1111/j.1365-2389.2010.01291.x) model as well as several model-selection routines. ```{r} library(gasfluxes) # Add some columns that gasfluxes expects dat$ID <- "test" dat$V <- 0.1 dat$A <- 0.16 gasfluxes(dat, .times = "SECONDS", .C = "CO2", plot = FALSE) ``` `gasfluxes` will compute on multiple groups (measurements) via its `.id` parameter, but we can also use use `fluxfinder::ffi_compute_fluxes()` to handle the grouping and let it call `gasfluxes`: ```{r} # Define a small wrapper function to put things into the format # that gasfluxes expects f <- function(time, conc) { d <- data.frame(time = time, C = conc, ID = 1, A = 1, V = 1) gasfluxes(d, plot = FALSE) } ffi_compute_fluxes(dat, NULL, "SECONDS", "CO2", fit_function = f) ``` ## Conclusion This vignette covered how to integrate `gasfluxes` with `fluxfinder`, if you want to take advantage of the former package's HMR or NDFE routines. More information on these models can be found in: * Hüppi, R., Felber, R., Krauss, M., Six, J., Leifeld, J., and Fuß, R.: Restricting the nonlinearity parameter in soil greenhouse gas flux calculation for more reliable flux estimates, PLoS One, 13, e0200876, 2018. http://dx.doi.org/10.1371/journal.pone.0200876 * Leiber-Sauheitl, K., Fuß, R., Voigt, C., and Freibauer, A.: High CO2 fluxes from grassland on histic Gleysol along soil carbon and drainage gradients, Biogeosciences, 11, 749–761, 2014. http://dx.doi.org/10.5194/bg-11-749-2014 * Pedersen, A. R., Petersen, S. O., and Schelde, K.: A comprehensive approach to soil-atmosphere trace-gas flux estimation with static chambers, Eur. J. Soil Sci., 61, 888–902, 2010. http://dx.doi.org/10.1111/j.1365-2389.2010.01291.x