--- output: rmarkdown::html_vignette: keep_md: true vignette: > %\VignetteEngine{knitr::knitr} %\VignetteIndexEntry{different treatments of uStar threshold} %\usepackage[UTF-8]{inputenc} --- ```{r, include = FALSE} # do not execute on CRAN: # https://stackoverflow.com/questions/28961431/computationally-heavy-r-vignettes is_check <- ("CheckExEnv" %in% search()) || any(c("_R_CHECK_TIMINGS_", "_R_CHECK_LICENSE_") %in% names(Sys.getenv())) knitr::opts_chunk$set(eval = !is_check) ``` ```{r setup, include = FALSE} library(knitr) #rmarkdown::render("vignettes/uStarCases.Rmd","md_document") opts_knit$set(root.dir = '..') opts_chunk$set( #, fig.align = "center" #, fig.width = 3.27, fig.height = 2.5, dev.args = list(pointsize = 10) #,cache = TRUE #, fig.width = 4.3, fig.height = 3.2, dev.args = list(pointsize = 10) #, fig.width = 6.3, fig.height = 6.2, dev.args = list(pointsize = 10) # works with html but causes problems with latex #,out.extra = 'style = "display:block; margin: auto"' ) knit_hooks$set(spar = function(before, options, envir) { if (before) { par(las = 1 ) #also y axis labels horizontal par(mar = c(2.0,3.3,0,0) + 0.3 ) #margins par(tck = 0.02 ) #axe-tick length inside plots par(mgp = c(1.1,0.2,0) ) #positioning of axis title, axis labels, axis } }) ``` ```{r, include = FALSE} #themeTw <- theme_bw(base_size = 10) + theme(axis.title = element_text(size = 9)) ``` # Different treatments of uStar threshold The recommended way of dealing with the uncertain uStar threshold for filtering the half-hourly data, is to repeat all the processing steps with several bootstrapped estimates of the threshold as in `vignette('useCase')`. First, some setup. ```{r init, message = FALSE, output = 'hide'} #+++ load libraries used in this vignette library(REddyProc) library(dplyr) #+++ define directory for outputs outDir <- tempdir() # CRAN policy dictates to write only to this dir in examples #outDir <- "out" # to write to subdirectory of current users dir #+++ Add time stamp in POSIX time format to example data # and filter long runs of equal NEE values EddyDataWithPosix <- fConvertTimeToPosix( filterLongRuns(Example_DETha98, "NEE") , 'YDH', Year = 'Year', Day = 'DoY', Hour = 'Hour') ``` ## Not applying uStar filtering Subsequent processing steps can be performed without further uStar filtering using `sEddyProc_sMDSGapFill`. Corresponding result columns then have no uStar specific suffix. ```{r noUStar, message = FALSE} EProc <- sEddyProc$new( 'DE-Tha', EddyDataWithPosix, c('NEE','Rg','Tair','VPD', 'Ustar')) EProc$sMDSGapFill('NEE') grep("NEE.*_f$",names(EProc$sExportResults()), value = TRUE) ``` ## User-specified uStar threshold The user can provide value for uStar-filtering before gapfilling, using `sEddyProc_sMDSGapFillAfterUstar`. Output columns for this uStar scenario use the suffix as specified by argument `uStarSuffix` which defaults to "uStar". The friction velocity, uStar, needs to be in column named "Ustar" of the input dataset. ```{r userUStar, message = FALSE} EProc <- sEddyProc$new( 'DE-Tha', EddyDataWithPosix, c('NEE','Rg','Tair','VPD', 'Ustar')) uStar <- 0.46 EProc$sMDSGapFillAfterUstar('NEE', uStarTh = uStar) grep("NEE.*_f$",names(EProc$sExportResults()), value = TRUE) ``` ## Single uStar threshold estimate The uStar threshold can be estimated from the uStar-NEE relationship from the data without estimating its uncertainty by a bootstrap. ```{r singleUStar, message = FALSE} EProc <- sEddyProc$new( 'DE-Tha', EddyDataWithPosix, c('NEE','Rg','Tair','VPD', 'Ustar')) # estimating the thresholds based on the data (without bootstrap) (uStarTh <- EProc$sEstUstarThold()) # may plot saturation of NEE with UStar for a specified season to pdf EProc$sPlotNEEVersusUStarForSeason(levels(uStarTh$season)[3], dir = outDir ) ``` Next, the annual estimate is used as the default in gap-filling. Output columns use the suffix as specified by argument `uSstarSuffix` which defaults to "uStar". ```{r singleUStarGapfill, message = FALSE} #EProc$useAnnualUStarThresholds() EProc$sMDSGapFillAfterUstar('NEE') grep("NEE.*_f$",names(EProc$sExportResults()), value = TRUE) ``` ## Scenarios across distribution of u* threshold estimate Choosing a different u* threshold effects filtering and the subsequent processing steps of gap-filling, and flux-partitioning. In order to quantify the uncertainty due to not exactly knowing the u* threshold, these processing steps should be repeated for different threshold scenarios, and the spread across the results should be investigated. First, the quantiles of the threshold distribution are estimated by bootstrap. ```{r uStarScen, results='hold'} EProc <- sEddyProc$new( 'DE-Tha', EddyDataWithPosix, c('NEE','Rg','Tair','VPD', 'Ustar')) EProc$sEstimateUstarScenarios( nSample = 100L, probs = c(0.05, 0.5, 0.95)) # inspect the thresholds to be used by default EProc$sGetUstarScenarios() ``` By default the annually aggregated threshold estimates are used for each season within one year as in the original method publication. To see the estimates for different aggregation levels, use method `sEddyProc_sGetEstimatedUstarThresholdDistribution`: ```{r} (uStarThAgg <- EProc$sGetEstimatedUstarThresholdDistribution()) ``` In conjunction with method `usGetSeasonalSeasonUStarMap` and `sEddyProc_sSetUstarScenarios` this can be used to set seasonally different u* threshold. However, this common case supported by method `sEddyProc_useSeaonsalUStarThresholds`. ```{r uStarScenSetSeasonal} #EProc$sSetUstarScenarios( # usGetSeasonalSeasonUStarMap(uStarThAgg)[,-2]) EProc$useSeaonsalUStarThresholds() # inspect the changed thresholds to be used EProc$sGetUstarScenarios() ``` Several function whose name ends with 'UstarScens' perform the subsequent processing steps for all uStar scenarios. They operate and create columns that differ between threshold scenarios by a suffix. ```{r uStarScenGapfill, message=FALSE} EProc$sMDSGapFillUStarScens("NEE") grep("NEE_.*_f$",names(EProc$sExportResults()), value = TRUE) ``` ```{r uStarScenMRPart, message=FALSE} EProc$sSetLocationInfo(LatDeg = 51.0, LongDeg = 13.6, TimeZoneHour = 1) EProc$sMDSGapFill('Tair', FillAll = FALSE, minNWarnRunLength = NA) EProc$sMDSGapFill('Rg', FillAll = FALSE, minNWarnRunLength = NA) EProc$sMDSGapFill('VPD', FillAll = FALSE, minNWarnRunLength = NA) EProc$sMRFluxPartitionUStarScens() grep("GPP_.*_f$",names(EProc$sExportResults()), value = TRUE) if (FALSE) { # run only interactively, because it takes long EProc$sGLFluxPartitionUStarScens(uStarScenKeep = "U50") grep("GPP_DT_.*_f$",names(EProc$sExportResults()), value = TRUE) } ``` The argument `uStarScenKeep = "U50"` specifies that the outputs that are not distinguished by the suffix, e.g. `FP_GPP2000`, should be reported for the median u* threshold scenario with suffix `U50`, instead of the default first scenario. ## See also A more advanced case of user-specified seasons for uStar threshold estimate is given in [`vignette('DEGebExample')`](DEGebExample.html).