gpp {flux} | R Documentation |
Model GPP from CO2 closed chamber flux data
Description
Model GPP from CO_2
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 |
PAR |
Numeric vector of mean irradiation during |
ts.NEE |
POSIXlt vector holding the timestamp of the |
PAR.Temp |
Either numeric vector of mean recorded temperature readings during |
Reco.m |
Model structure obtained from running |
ts.Reco |
POSIXlt vector holding the timestamp of the |
method |
The function knows several equations to model the relationship between gpp and irradiation. At the moment |
units |
Character string specifying how |
allow.offset |
Logical. Shall GPP values other than 0 be allowed at zero irradiation? See details. |
virtual |
Logical. If |
start.par |
Numeric between 0 and |
... |
Any arguments passed to |
oot |
Vector of length = |
oot.id |
Vector of length 2 that specifies which of the flux values derive from opaque (first value, i.e. |
Details
The function models the relationship between CO_2
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 = \frac{GPmax * alpha * PAR}{alpha * PAR + GPmax}
(Michaelis-Menten)
GPP = \frac{alpha * PAR}{1 - \frac{PAR}{2000} + \frac{alpha*PAR}{GPmax}}
(Falge)
GPP = \frac{GPmax * alpha * PAR}{\sqrt{GPmax^2 + (alpha*par)^2}}
(Smith)
GPP = GPmax * (1 - e^{\frac{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 CO_2
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 CO_2
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 |
mr |
The Reco model used. A |
data |
Either a three entry list (with |
dat |
|
offset |
Numeric value giving the offset. |
start |
List with the start values for the |
PAR.Temp |
Numeric vector with the |
The data.frame
in dat
contains the following columns:
NEE |
|
GPP |
Corresponding |
Reco |
Corresponding |
PAR |
Corresponding |
timestamp |
Corresponding timestamps. |
mins |
Temporal distance to next reco value. Always 0 but reported for consistency with |
Reco |
Numeric vector of corresponding |
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
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)