gpp: Model GPP from CO2 closed chamber flux data

View source: R/gpp.R

gppR Documentation

Model GPP from CO2 closed chamber flux data

Description

Model GPP from CO2 closed chamber flux data under consideration of ecosystem respiration. Four different methods are available: Providing one global Reco model, providing several Reco models, providing estimated Reco fluxes via function gpp or extracting Reco fluxes from real measurements via gpp2. Timestamps are used to assign Reco data to the respective NEE data. In the latter case they have to be provided alongside the Reco fluxes.

Usage

gpp(NEE, PAR, ts.NEE, PAR.Temp, Reco.m, ts.Reco = NULL, 
method = "Michaelis-Menten", units = "30mins", allow.offset = FALSE, 
virtual = FALSE, start.par = max(PAR), ...)

gpp2(NEE, PAR, ts.NEE, oot, oot.id = c("D", "T"), 
method = "Michaelis-Menten", allow.offset = FALSE, 
virtual = FALSE, start.par = max(PAR), ...)

Arguments

NEE

Numeric vector with CO2 fluxes from measurements of CO2 net ecosystem exchange (NEE).

PAR

Numeric vector of mean irradiation during CO2 flux measurements. Can be supplied as photosynthetically active radiation (PAR) or photosynthetic photon flux density (PPFD).

ts.NEE

POSIXlt vector holding the timestamp of the NEE values. NEE and Reco values are linked to each other based on their timestamps specified in ts.NEE and ts.Reco or elsewhere (depending on method). The two timestamps don't have to match exactly. In that case, the function links NEE and Reco values based on the time interval given in units.

PAR.Temp

Either numeric vector of mean recorded temperature readings during CO2 flux measurements or data.frame with several temperature records (if Reco.m is provided as an object resulting from running reco.bulk). In case of the latter, appropriate temperatures are extracted based on the which.Temp parameter that is stored to the model structure that is returned by reco.bulk. Therefore names have to correspond with the particular temperature variable names used in R_eco modeling (e.g., air, soil in -2cm/-5cm/-10cm depth). See details.

Reco.m

Model structure obtained from running reco.bulk or reco or vector with estimated Reco values. The latter has to contain (at least) the values that are valid at the times of the NEE measurements. Typically the data will result from estimating hourly or half-hourly R_eco values using budget.reco on objects of class "breco" derived from running reco.bulk. See details.

ts.Reco

POSIXlt vector holding the timestamp of the R_eco values. Has to be specified if R_eco values instead of an R_eco model are given in Reco.m. The function assumes that this is the case if ts.Reco != NULL. See details.

method

The function knows several equations to model the relationship between gpp and irradiation. At the moment "Michaelis-Menten", "Falge", "Smith", and "Misterlich" are implemented which are all discussed in Falge et al. 2001. Partial matching is applied. Defaults to "Michaelis-Menten". See details for equations.

units

Character string specifying how ts.NEE shall be rounded. If Reco.m holds values instead of an R_eco model structure the NEE and R_eco values are matched based on their timestamp after ts.NEE has been rounded according to units.

allow.offset

Logical. Shall GPP values other than 0 be allowed at zero irradiation? See details.

virtual

Logical. If TRUE, virtual NEE data are generated that show a typical saturation curve with saturation at mean NEE. Can be used in bulk gpp modeling to allow falling back to a mean model.

start.par

Numeric between 0 and max(PAR). All data points with PAR <= start.par are used to obtain a start value for alpha via linear regression. Defaults to max(PAR). See details.

...

Any arguments passed to nls which is used internally to do the model fitting.

oot

Vector of length = length(NEE) specifying which of the measured fluxes derive from opaque (R_eco) and which derive from transparent (NEE) chamber measurements. gpp2 uses this to extract corresponding R_eco values for calculating GPP from NEE before fitting the models (Approach 1, see details.)

oot.id

Vector of length 2 that specifies which of the flux values derive from opaque (first value, i.e. R_eco measurements) and which derive from transparent (second value, i.e. NEE measurements) chamber measurements when data contains both. May be character, factor, or numeric. See details.

Details

The function models the relationship between CO2 uptake by plants (gross primary production, GPP) and irradiation using one out of 4 methods (Falge et al. 2001). Per default the Michaelis-Menten kinetic (e.g., Schmitt et al. 2010) is used. The following models can be fitted to the data:

GPP = (GPmax * alpha * PAR)/(alpha * PAR + GPmax) (Michaelis-Menten)

GPP = (alpha * PAR)/(1 - (PAR/2000) + (alpha*PAR/GPmax)) (Falge)

GPP = (alpha * PAR * GPmax)/sqrt(GPmax^2 + (alpha*PAR)^2) (Smith)

GPP = GPmax * (1 - exp((alpha*PAR) / GPmax)) (Misterlich)

with PAR the incoming light (irradiation). Note, that irradiation can be given in PAR or in PPFD although the equation states PAR. GPmax and alpha are the parameters that are fitted. GPmax refers to the maximum gross primary production at saturating or optimum light whereas alpha refers to the ecosystem quantum yield and gives the starting slope of the model.

Transparent closed chamber measurements in the field typically capture net ecosystem exchange (NEE), which is the sum of the two opposing processes ecosystem respiration (R_eco) and GPP. Therefore, it is necessary to subtract modeled R_eco from the measured NEE to obtain GPP that can be used for the modelling against irradiance.

Real R_eco at the time of the NEE measurement is typically unkown because dark and light measurements cannot be taken at the same spot at the same time. Therefore, R_eco has to be modelled based on dark chamber or nighttime measurements (see reco). For modelling GPP from NEE chamber measurements, gpp just needs measured NEE, the associated irradiance (PAR) and temperature (PAR.Temp) values and the R_eco model(s) (Reco.m). The R_eco model(s) can derive from a longer period of time than the NEE data, which is often better to get more reliable models. In contrast, gpp2 extracts R_eco fluxes from actual measurements.

Approaches to assigning R_eco values:

Approach 1: Extract corresponding R_eco fluxes from the provided data that are assigned to corresponding NEE values via their timestamp: For this approach NEE has to contain both NEE and R_eco fluxes. oot has to be specified as a vector that indicates whether the respective fluxes were measured as NEE (transparent chamber) or Reco (opaque chamber or low PAR). In addition oot.id may have to be changed accordingly. gpp2 is used for fitting the models.

Approach 2: If Reco.m is specified as a vector containing modelled R_eco values these are used to calculate GPP = NEE + Reco. The correct R_eco values are assigned to the appropriate NEE values by rounding the timestamp of the latter (given in ts.NEE) according to the time lapse of the R_eco values and then merging both on the respective timestamps. Therefore ts.Reco has to be specified while PAR.Temp is ignored.

Approach 3: If just one R_eco model is provided as an object of class "reco" resulting from running reco this is used to predict R_eco at the times of the NEE measurements with the temperatures provided in PAR.Temp as new.data. PAR.Temp has to be specified as a vector of length = length(NEE). ts.Reco must not be specified.

Approach 4: If several R_eco models are provided as an object of class "breco" resulting from running reco.bulk these are used to predict R_eco at the times of the NEE measurements with the temperatures provided in PAR.Temp as new.data. PAR.Temp has to be provided as a data.frame with all temperature variables that were used when obtaining the R_eco models via reco.bulk with ncol(PAR.Temp) = length(NEE). The appropriate temperatures are assigned using the parameter which.Temp that is reported with each model in an object of class "breco". ts.Reco must not be specified.

The Michaelis Menten fit to the GPP/PAR relationship presumes that plants (at least C3 plants) do not take up CO2 when there is no irradiance. However, sometimes the R_eco model gives quite unrealistic R_eco estimates for the times of NEE measurements leading to an alleged considerable uptake of CO2 under no or very low light conditions. This in turn leads to unrealistic and not well fitted GPP models. Therefore, it is possible to correct the model by not allowing an offset: allow.offset = FALSE (default). The offset is determined automatically by constructing a linear model using the data points until PAR = start.par and predicting GPP at PAR = 0. The offset is then subtracted from all GPP values and is later automatically added when doing the diagnostic plots.

The start parameters for the non-linear fit (via nls) are derived from the data itself. For alpha (initial slope of the model) the slope of the linear model of GPP against PAR constructed from the data points until PAR = start.par is used. For GPmax the mean of the five highest GPP values is taken.

It is advisable to test various configurations regarding the R_eco model and testing the effect of allowing the offset. ATTENTION: The offset is not added back to the predicted GPP data but it is returned as part of the output (see value section). Therefore, if the model parameters and model formula are used to predict GPP fluxes, the offset has to be added manually.

Value

The function returns an object of class gpp (for ts.Reco != NULL) or of class gpp2 (for ts.Reco = NULL). It is a list with the following components.

mg

The gpp model. A nls model structure.

mr

The Reco model used. A nls model structure.

data

Either a three entry list (with ts.Reco != NULL) or a 4 entry list (with ts.Reco = NULL)

dat

data.frame (see below for more).

offset

Numeric value giving the offset.

start

List with the start values for the gpp modelling.

PAR.Temp

Numeric vector with the PAR.Temp values specified in the function call. Only reported if ts.Reco = NULL.

The data.frame in dat contains the following columns:

NEE

NEE values.

GPP

Corresponding GPP values.

Reco

Corresponding R_eco values.

PAR

Corresponding PAR values.

timestamp

Corresponding timestamps.

mins

Temporal distance to next reco value. Always 0 but reported for consistency with gpp2.

Reco

Numeric vector of corresponding R_eco values estimated with the R_eco model (Reco.m).

Author(s)

Gerald Jurasinski, gerald.jurasinski@uni-rostock.de

References

Falge E, Baldocchi D, Olson R, Anthoni R, et al. 2001. Gap filling strategies for defensible annual sums of net ecosystem exchange. Agricultural and Forest Meteorology, 107:43-69.

Schmitt M, Bahn M, Wohlfahrt G, Tappeiner U, Cernusca A. 2010. Land use affects the net ecosystem CO2 exchange and its components in mountain grasslands. Biogeosciences, 7:2297-2309.

See Also

reco, fluxx

Examples

## load data
data(tt.flux)

## make timestamp
tt.flux$timestamp <- strptime(paste(tt.flux$date, tt.flux$time), 
format="%Y-%m-%d %H:%M:%S")

## model reco with Arrhenius type model
# extract data and omit estimated fluxes with both the nrmse 
# and the r2 flag set to 0
ttf <- tt.flux[!(tt.flux$CO2.r2.f + tt.flux$CO2.nrmse.f) == 0, ]

# extract table with flux data for reco modeling
ttf4reco <- subset(ttf, kind > 4)

# omit CO2 fluxes below zero
ttf4reco <- ttf4reco[ttf4reco$CO2.flux >= 0,]

# plot reco data
plot(CO2.flux ~ t.air, data=ttf4reco)

# check for the best temperature for reco modelling
temps <- c("t.air", "t.soil2", "t.soil5", "t.soil10")
sapply(temps, function(x) lapply(reco(ttf4reco$CO2.flux, 
ttf4reco[,x], method="arr"), AIC))

# take the temperature in soil 2 cm
reco.m <- reco(ttf4reco$CO2.flux, ttf4reco$t.soil2, method="arr")

# inspect
reco.m

## model gpp
# extract table with flux data for gpp modeling
ttf4gpp <- subset(ttf, kind < 4)

# do a single gpp model for a measurement day using data of spot 2
tmp <- ttf4gpp[(ttf4gpp$date=="2011-05-11") & (ttf4gpp$spot==2),]
gpp.m1 <- gpp(tmp$CO2.flux, tmp$PAR, tmp$timestamp, tmp$t.soil2, 
reco.m[[1]])
# check diagnostic plot
plot(gpp.m1)

# same for spot 3
tmp <- ttf4gpp[(ttf4gpp$date=="2011-05-11") & (ttf4gpp$spot==3),]
gpp.m2 <- gpp(tmp$CO2.flux, tmp$PAR, tmp$timestamp, tmp$t.soil2, 
reco.m[[1]])
# check diagnostic plot
plot(gpp.m2)

# same with all three spots
tmp <- ttf4gpp[(ttf4gpp$date=="2011-05-11"),]
gpp.m3 <- gpp(tmp$CO2.flux, tmp$PAR, tmp$timestamp, tmp$t.soil2, 
reco.m[[1]])
# check diagnostic plot
plot(gpp.m3)


flux documentation built on June 26, 2022, 9:05 a.m.