
Flux tower eddy covariance instruments measure CO2 flux between an ecosystem and the atmosphere. Observed CO2 fluxes (also called NEE, Net Ecosystem Exchange) can be correlated with locally measured solar intensity, temperature, humidity etc. With enough data, a detailed picture of the local response of the ecosystem to environmental variables to be built up. Flux towers are one of the important tools for quantitative understanding the sensitivity of vegetation to climatic variability.
CO2 flux data are noisy, to say the least. If you want to understand ecosystem reponse, you need a statistical model. This post gives some simple ideas and R code showing how such a model can be developed. The example used is Harvard Forest [1], Massachussetts, a temperate deciduous broadleaf forest for which a large amount of flux tower data (collected by Munger & Wofsy) is available. It could equally be applied to tropical forest, grassland, cropland etc at one of the 200+ fluxnet sites worldwide. The model falls short of the full scientific rigour given in the references, but it can easily be developed into a more complete tool.
The main interest here is ecosystem response to sunlight i.e. photosynthesis. The light dependent part of the NEE is GEP (Gross Ecosystem Production), while the light independent part is RE (ecosystem respiration).
Pre-processing
As always, the first steps are about getting the data into the right form. We use half-hourly data for 1991-2007 for Harvard Forest i.e Ameriflux Level 2, site code USHa-1. This raw data has not been subject to any gap-filling statistical treatment. Here are the pre-processing steps:
- download the annual data files and create a dataframe harvard using the rbind() combining all of the data
- replace missing data (e.g. -9999) with “NA”
- add a new fornight index, indicating to which fortnight of the year each row of data belongs
- select a subset of the Ameriflux variables of interest. e.g. column headings c(“YEAR”,”DTIME”,”FN”,”TA”,”NEE”,”TS1″,”VPD”,”PAR_in”)
- drop rows of data when one or more variables are undefined
- group the data according to fortnights index i.e. create a list of 26 elements where each element is a dataframe containing all data sharing the same fortnight index.
- drop “dark” data i.e. rows of data where PAR < 30.
The environmental variables retained at step 4 are TA (atmospheric temperature), TS1 (soil temperature), VPD (vapour pressure deficit) and PAR (photosynthetically active radiation). PAR is solar radiation in the range 0.4-0.7 microns which is energetic enough to contribute to photosynthesis. It has units μ mols s-1 m-2. (1 μ mole = 6 x 1017.)
Here is what the R code looks like:
#download the annual data files and create a dataframe harvard
loc=file.path("ftp://cdiac.ornl.gov/pub/ameriflux/data/Level2/Sites_ByID/US-Ha1/with_gaps/usmaharv_1991_L2.csv"); # Ameriflux US_Ha1 download.file(loc,"temp.dat");
ha_1991=read.csv("temp.dat", header=FALSE,skip=20); .........................
loc=file.path("ftp://cdiac.ornl.gov/pub/ameriflux/data/Level2/Sites_ByID/US-Ha1/with_gaps/usmaharv_2007_L2.csv"); # Ameriflux US_Ha1 download.file(loc,"temp.dat");
ha_2007=read.csv("temp.dat", header=FALSE,skip=20); harvard <- rbind(ha_1991,ha_1992,ha_....._2006,ha_2007); # merged dataframes
#replace missing data with "NA"
temp <- (harvard[,] == -9999 | harvard[,] == -6999); #replace -9999 or -6999 with NAs
harvard[temp]=NA;
#add a new fortnight index
lims <- seq(from=1,to=365,by=14); # fortnightly data
lims[27] <- 367; # bound adjust, last fortnight has extra days fortnight
<- function(d) {sum(ifelse(d<lims,0,1))} # convert from DOY to fortnights
harvard <- data.frame( "FN" = sapply(harvardUST < 0.2|is.na(harvard
TA);
y <- is.na(harvardSTS1);
u <- is.na(harvardSPAR_in);
w <- !(x|y|z|u|v|u_cut); #boolean. w is true when all variables are defined and U* > 0.2 m/s
harvardS <- data.frame("YEAR"=harvardFN[w],"TA"=harvard
NEE[w], "TS1" = harvard
VPD[w],"PAR" = harvard
latex \mathrm{NEE} = \mathrm{R_E} -{{\alpha \beta \mathrm{PAR}} \over {\beta + \alpha \mathrm{PAR}}}
latex \alpha \rightarrow \alpha \epsilon
latex \epsilon = {\lambda^2 \over {\mathrm{\left(TA-25 \right)}^2 + \lambda^2} } {\mu^2 \over {\mathrm{VPD}^2 + \mu^2}}latex \lambda
latex \mu
latex \mu = 2
latex \alpha^{-1}$ corresponds to the number of photosynthetically active photons arriving at the forest canopy for every CO2 molecule trapped by photosynthesis. This number is about 14.
A common feature of future climate scenarios is competition between increased CO2 availability and increased water stress layed out on a global scale. Clearly flux tower data are good place to look for these effects.
The R script for the model and plots can be found here.
References
[1] Factors controlling CO2 exchange on timescales from hourly to decadal at Harvard Forest, Urbanski, S., C. Barford, S. Wofsy, C. Kucharik, E. Pyle, J. Budney, K.
McKain, D. Fitzjarrald, M. Czikowsky, J. W. Munger http://www.agu.org/pubs/crossref/2007.../2006JG000293.shtml
[2] See for example, An evaluation of models for partitioning eddy covariance-measured
net ecosystem exchange into photosynthesis and respiration P. Stoy et al, http://www.geos.ed.ac.uk/homes/pstoy/Stoy_06b.pdf
[3] More detailed models are give in An empirical model simulating diurnal and seasonal CO2 flux for diverse vegetation types and climate conditionshttp //www.biogeosciences.net/6/585/2009/bg-6-585-2009.html & references.