3. Summaries

Introduction

Annual variables are useful statistics calculated for the results of hydrograph separation. While separation is performed on a daily basis, the summaries calculated by grwat are annual. Examples are maximum spring flood runoff, mean annual groundwater (“baseflow”) runoff, thaw flood runoff volume (w/o groundwater) or the number of rain flood days. Users proficient in R can calculate such variables simply by summarizing the results of gr_separate() function. However, summarizing functionality is implemented in the package for a more streamlined analysis. The benefits are that the standardized variables can be supplemented by additional functions that perform their statistical testing and plotting.

First of all, we need to separate the hydrograph:

library(grwat)
data(spas) # example Spas-Zagorye data is included with grwat package
head(spas) # separate
#> # A tibble: 6 × 4
#>   Date           Q   Temp  Prec
#>   <date>     <dbl>  <dbl> <dbl>
#> 1 1956-01-01  5.18  -6.46 0.453
#> 2 1956-01-02  5.18 -11.4  0.825
#> 3 1956-01-03  5.44 -10.7  0.26 
#> 4 1956-01-04  5.44  -8.05 0.397
#> 5 1956-01-05  5.44 -11.7  0.102
#> 6 1956-01-06  5.58 -20.1  0.032
sep = gr_separate(spas, params = gr_get_params(reg = 'center'))

For more information on advanced separation, read the Advanced separation vignette.

After that we can use gr_summarize() to summarize the result:

# summarize
vars = gr_summarize(sep)
#> Warning: There were 2 warnings in `dplyr::summarise()`.
#> The first warning was:
#> ℹ In argument: `Dspstart = min(.data$Date[which(.data$Qspri > 0)])`.
#> ℹ In group 19: `Year1 = 1974`.
#> Caused by warning in `min.default()`:
#> ! no non-missing arguments to min; returning Inf
#> ℹ Run `dplyr::last_dplyr_warnings()` to see the 1 remaining warning.
#> Warning: There was 1 warning in `dplyr::summarise()`.
#> ℹ In argument: `Q30w = condrollmean(.data$Q, .data$Season == 2, 30)`.
#> ℹ In group 64: `Year = 2020`.
#> Caused by warning in `min()`:
#> ! no non-missing arguments to min; returning Inf

head(vars)
#> # A tibble: 6 × 57
#>    Year Year1 Year2 Dspstart   Dspend       Tsp    Qy Qspmax Dspmax      Qygr
#>   <dbl> <dbl> <dbl> <date>     <date>     <int> <dbl>  <dbl> <date>     <dbl>
#> 1  1956  1956  1957 1956-04-08 1956-05-05    27  18.4    467 1956-04-22  8.59
#> 2  1957  1957  1958 1957-03-25 1957-05-04    40  20.2    460 1957-04-08  9.77
#> 3  1958  1958  1959 1958-04-02 1958-05-13    41  27.3    537 1958-04-21 10.2 
#> 4  1959  1959  1960 1959-03-28 1959-04-28    31  27.1    406 1959-04-16 10.9 
#> 5  1960  1960  1961 1960-03-27 1960-04-27    31  29.6    406 1960-04-15 12.3 
#> 6  1961  1961  1962 1961-03-07 1961-05-02    56  18.8    296 1961-04-10 10.8 
#> # ℹ 47 more variables: Qsmin <dbl>, Dsmin <date>, Qwmin <dbl>, Dwmin <date>,
#> #   Q30s <dbl>, D30s1 <date>, D30s2 <date>, Q30w <dbl>, D30w1 <date>,
#> #   D30w2 <date>, Q10s <dbl>, D10s1 <date>, D10s2 <date>, Q10w <dbl>,
#> #   D10w1 <date>, D10w2 <date>, Q5s <dbl>, D5s1 <date>, D5s2 <date>, Q5w <dbl>,
#> #   D5w1 <date>, D5w2 <date>, Wy <dbl>, Wygr <dbl>, Wsp <dbl>, Wspgr <dbl>,
#> #   Wsprngr <dbl>, Wrn <dbl>, Wrngr <dbl>, Wth <dbl>, Wthgr <dbl>, Wgrs <dbl>,
#> #   Ws <dbl>, Wgrw <dbl>, Ww <dbl>, Qrnmax <dbl>, Qthmax <dbl>, …

Resulting data frame contains more than 50 variables that can be used in the analysis of interannual changes. To get familiar with the variables and their names, just use the gr_help_vars() function:

gr_help_vars()
#> # A tibble: 57 × 21
#>       ID Position Width Source Name_old    Name   Units Unitsua Unitsen Readtype
#>    <dbl>    <dbl> <dbl>  <dbl> <chr>       <chr>  <chr> <chr>   <chr>   <chr>   
#>  1     1        1     7      1 year_number Number <NA>  <NA>    <NA>    integer 
#>  2     2        8    10      1 Year1       Year1  Год   Рок     Year    integer 
#>  3     3       18    10      1 Year2       Year2  Год   Рок     Year    integer 
#>  4     4       28    15      1 datestart   Dspst… Дата  Дата    Date    Date    
#>  5     5       43    15      1 datepolend  Dspend Дата  Дата    Date    Date    
#>  6    57        0     0      0 PolProd     Tsp    Дней  Дней    Days    integer 
#>  7     6       58    10      1 Qy          Qy     м^3/с м^3/с   m^3/s   double  
#>  8     7       68    10      1 Qmax        Qspmax м^3/с м^3/с   m^3/s   double  
#>  9     8       78    15      1 datemax     Dspmax Дата  Дата    Date    Date    
#> 10     9       93    10      1 Qygr        Qygr   м^3/с м^3/с   m^3/s   double  
#> # ℹ 47 more rows
#> # ℹ 11 more variables: Type <chr>, Test <dbl>, Desc <chr>, Descua <chr>,
#> #   Descen <chr>, Group <chr>, Winter <dbl>, Chart <chr>, Color <chr>,
#> #   Order <dbl>, Range <chr>

Statistical tests

Variable testing by gr_test_vars() can be used to estimate the statistical significance of the interannual changes. Pettitt test is performed to detect the change year — i.e. the year which divides the time series into the statistically most differing samples. Student (Welch) and Fisher tests are used to estimate the significance of mean and variance differences of these samples. Theil-Sen test calculates the trend slope value. Mann-Kendall test is performed to reveal the significance of the trend. gr_test_vars() returns the list of tests for each variable:

# test all variables
tests = gr_test_vars(vars)

# view Pettitt test for Qygr
tests$ptt$Qygr
#> 
#>  Pettitt's test for single change-point detection
#> 
#> data:  vl[vl_cmp]
#> U* = 869, p-value = 8.129e-08
#> alternative hypothesis: two.sided
#> sample estimates:
#> probable change point at time K 
#>                              23

# view Fisher test for Q30s
tests$ft$Q30s
#> 
#>  F test to compare two variances
#> 
#> data:  d1 and d2
#> F = 0.53023, num df = 21, denom df = 41, p-value = 0.1208
#> alternative hypothesis: true ratio of variances is not equal to 1
#> 95 percent confidence interval:
#>  0.2597352 1.1887012
#> sample estimates:
#> ratio of variances 
#>          0.5302307

# test only Qygr and Q30s using 1978 as fixed year and excluding 1988-1991 yrs
gr_test_vars(vars, Qygr, year = 1979, exclude = 1988:1991)
#> $ptt
#> $ptt$Qygr
#> 
#>  Pettitt's test for single change-point detection
#> 
#> data:  vl[vl_cmp]
#> U* = 777, p-value = 1.372e-07
#> alternative hypothesis: two.sided
#> sample estimates:
#> probable change point at time K 
#>                              23 
#> 
#> 
#> 
#> $mkt
#> $mkt$Qygr
#> 
#>  Mann-Kendall trend test
#> 
#> data:  vl[vl_cmp]
#> z = 4.6495, n = 60, p-value = 3.327e-06
#> alternative hypothesis: true S is not equal to 0
#> sample estimates:
#>            S         varS          tau 
#> 7.300000e+02 2.458333e+04 4.124294e-01 
#> 
#> 
#> 
#> $tst
#> $tst$Qygr
#> 
#>  Sen's slope
#> 
#> data:  df.theil[[2]][fltr]
#> z = 4.6495, n = 60, p-value = 3.327e-06
#> alternative hypothesis: true z is not equal to 0
#> 95 percent confidence interval:
#>  0.06251714 0.13908704
#> sample estimates:
#> Sen's slope 
#>  0.09732298 
#> 
#> 
#> 
#> $ts_fit
#> $ts_fit$Qygr
#> 
#> Call:
#> mblm::mblm(formula = eval(frml), dataframe = df.theil[fltr, ], 
#>     repeated = FALSE)
#> 
#> Coefficients:
#> (Intercept)        Year1  
#>  -161.12007      0.08728  
#> 
#> 
#> 
#> $tt
#> $tt$Qygr
#> 
#>  Welch Two Sample t-test
#> 
#> data:  d1 and d2
#> t = -8.537, df = 47.955, p-value = 3.466e-11
#> alternative hypothesis: true difference in means is not equal to 0
#> 95 percent confidence interval:
#>  -5.558891 -3.439535
#> sample estimates:
#> mean of x mean of y 
#>  9.296712 13.795925 
#> 
#> 
#> 
#> $ft
#> $ft$Qygr
#> 
#>  F test to compare two variances
#> 
#> data:  d1 and d2
#> F = 0.80619, num df = 21, denom df = 37, p-value = 0.6093
#> alternative hypothesis: true ratio of variances is not equal to 1
#> 95 percent confidence interval:
#>  0.3873477 1.8233967
#> sample estimates:
#> ratio of variances 
#>          0.8061938 
#> 
#> 
#> 
#> $year
#> Qygr 
#> 1979 
#> 
#> $maxval
#> $maxval$Qygr
#> [1] 20.07168
#> 
#> 
#> $fixed_year
#> [1] TRUE
#> 
#> $pvalues
#>   N                                    Variable Change.Year   Trend      M1
#> 1 1 Mean annual groundwater ("baseflow") runoff        1979 0.08728 9.29671
#>         M2 MeanRatio     sd1     sd2 sdRatio Mann.Kendall Pettitt Student
#> 1 13.79593      48.4 1.88588 2.10036    11.4            0       0       0
#>    Fisher
#> 1 0.60934

The tests can be represented in a clear tabular form for visual analysis:

gr_kable_tests(tests)
p-values of statistical criteria
N Variable Change.Year Trend M1 M2 MeanRatio sd1 sd2 sdRatio Mann.Kendall Pettitt Student Fisher
1 Annual runoff volume 1978 2e-05 0.06173 0.07133 15.6 0.01713 0.02186 27.6 0.89399 0.41581 0.0613 0.2411
2 Spring flood runoff volume (w/o groundwater) 1986 -0.00026 0.02293 0.01514 -34 0.01204 0.01083 -10 9e-05 0.00596 0.00923 0.55265
3 Annual groundwater runoff volume 1979 3e-04 0.02919 0.04468 53.1 0.00583 0.00916 57.1 2e-05 0 0 0.02912
4 Spring flood runoff volume (with groundwater) 1988 -0.00025 0.03009 0.0208 -30.9 0.01439 0.01223 -15 0.00069 0.01499 0.00744 0.36779
5 Rain flood runoff volume (w/o groundwater) 1975 0 0.00571 0.00877 53.6 0.00685 0.00860 25.5 0.97689 0.66529 0.14526 0.30919
6 Rain flood runoff volume (with groundwater) 1977 4e-05 0.01413 0.02377 68.2 0.01045 0.01585 51.7 0.52016 0.09611 0.00564 0.05192
7 Thaw flood runoff volume (w/o groundwater) 1983 -1e-05 0.00254 0.00204 -19.7 0.00305 0.00252 -17.4 0.388 0.44105 0.49915 0.28712
8 Thaw flood runoff volume (with groundwater) 2010 0 0.00749 0.00906 21 0.00494 0.00586 18.6 0.89399 1 0.42048 0.40685
9 Winter groundwater runoff volume 1978 9e-05 0.00742 0.01187 60 0.00238 0.00345 45 0.00017 1e-05 0 0.07593
10 Winter low flow runoff volume 1978 7e-05 0.00953 0.01348 41.4 0.00492 0.00502 2 0.0162 0.00107 0.00465 0.95809
11 Summer groundwater runoff volume 1979 2e-04 0.01474 0.02497 69.4 0.00451 0.00703 55.9 1e-05 0 0 0.03202
12 Summer low flow runoff volume 1977 0.00022 0.01917 0.03262 70.2 0.01064 0.01469 38.1 0.01337 0.00175 0.00013 0.12912
13 Mean annual runoff 1978 0.00067 19.69591 22.67725 15.1 5.69050 6.75317 18.7 0.98613 0.47808 0.07096 0.41292
14 First date of a spring flood 1970 -0.16667 28-Mar 17-Mar -11 8.00000 15.00000 87.5 0.08608 0.09934 0.00269 0.02471
15 Mean annual groundwater (“baseflow”) runoff 1979 0.08862 9.29671 14.18763 52.6 1.88588 2.48605 31.8 1e-05 0 0 0.17569
16 Last date of a spring flood 1970 -0.26393 05-May 22-Apr -13 6.00000 16.00000 166.7 0.00261 0.00569 1e-05 4e-04
17 Duration of a spring flood 1989 -0.14286 38.0625 33.96875 -10.8 7.33061 12.73168 73.7 0.01852 0.02812 0.12133 0.00291
18 Maximum spring flood runoff 1970 -4 419.78571 241.83 -42.4 162.94462 146.00771 -10.4 8e-05 0.01088 0.00152 0.55597
19 Date of a maximum spring flood runoff 1970 -0.08333 14-Apr 14-Apr 0 5.00000 40.00000 700 0.24607 0.19331 0.93 0
20 Spring flood runoff volume (with groundwater and rain) 1986 -0.00028 0.03074 0.02251 -26.8 0.01391 0.01415 1.7 0.00073 0.01377 0.02274 0.93649
21 Minimum daily winter runoff 1979 0.1206 4.05591 9.42833 132.5 1.93119 2.03176 5.2 0 0 0 0.8237
22 Date of minimum daily winter runoff 1965 -0.19677 16-Feb 19-Jan -28 43.00000 35.00000 -18.6 0.41054 0.36833 0.10043 0.32859
23 Minimum daily summer runoff 1979 0.05578 4.49091 8.35571 86.1 2.19461 1.80075 -17.9 0.00205 0 0 0.27404
24 Date of minimum daily summer runoff 2000 0.33333 23-Jul 15-Aug 23 34.00000 31.00000 -8.8 0.1962 0.05942 0.01235 0.74221
25 Minimum 30-day averaged winter runoff 1979 0.1091 6.00123 11.19813 86.6 2.15918 2.88271 33.5 NA 0 0 0.15792
26 First date of minimum 30-day averaged winter runoff 1987 -0.14545 04-Jan 27-Dec 358 21.00000 25.00000 19 0.39944 0.74118 0.1862 0.44023
27 Minimum 30-day averaged summer runoff 1979 0.05577 6.23477 9.70019 55.6 1.69308 2.32512 37.3 0.00218 1e-05 0 0.12077
28 First date of minimum 30-day averaged summer runoff 2000 0.15789 13-Jul 02-Aug 20 29.00000 28.00000 -3.4 0.42377 0.09454 0.01189 0.98217
29 Minimum 10-day averaged winter runoff 1979 0.10384 5.12577 10.06676 96.4 1.60347 2.25540 40.7 0 0 0 0.09575
30 First date of minimum 10-day averaged winter runoff 1987 -0.2892 26-Jan 11-Jan -15 32.00000 36.00000 12.5 0.25361 0.406 0.0805 0.54115
31 Minimum 10-day averaged summer runoff 1981 0.05427 5.89658 8.8558 50.2 1.55969 1.87498 20.2 0.00063 0 0 0.35115
32 First date of minimum 10-day averaged summer runoff 2000 0.33333 21-Jul 11-Aug 21 27.00000 31.00000 14.8 0.11213 0.03414 0.01318 0.45786
33 Minimum 5-day averaged winter runoff 1979 0.10721 4.77955 9.84738 106 1.63118 2.26105 38.6 0 0 0 0.11047
34 First date of minimum 5-day averaged winter runoff 1987 -0.16667 28-Jan 15-Jan -13 36.00000 36.00000 0 0.45822 0.54022 0.15385 0.9972
35 Minimum 5-day averaged summer runoff 1981 0.05467 5.76225 8.68705 50.8 1.51068 1.83279 21.3 0.00038 0 0 0.3274
36 First date of minimum 5-day averaged summer runoff 2000 0.33333 25-Jul 15-Aug 21 27.00000 30.00000 11.1 0.10966 0.03414 0.01299 0.4868
37 Maximum thaw flood runoff 1984 -0.02084 26.94527 24.67525 -8.4 35.56889 35.16949 -1.1 0.67234 0.96366 0.80093 0.93525
38 Date of a maximum thaw flood runoff 1994 0.67308 20-Dec 20-Jan -335 36.00000 39.00000 8.3 0.00768 0.00441 0.00269 0.61063
39 Number of thaw flood events 1995 -0.13333 14.83333 11.23077 -24.3 4.63835 7.27356 56.8 0.00092 0.00548 0.03221 0.01427
40 Number of thaw flood days 1984 -0.70242 79 47.02703 -40.5 20.74015 22.84426 10.1 5e-05 0 0 0.61434
41 Maximum rain flood runoff 1977 0.10523 54.75139 72.47261 32.4 56.94260 56.22200 -1.3 0.68081 0.52857 0.25418 0.90809
42 Date of a maximum rain flood runoff 2002 0.12973 12-Jun 28-Jun 16 67.00000 69.00000 3 0.74116 0.60713 0.4232 0.84757
43 Number of rain flood events 1977 -0.08876 20.05 14.90909 -25.6 4.29780 3.94036 -8.3 0.00595 0.00122 6e-05 0.61906
44 Number of rain flood days 1991 -0.13488 112.05882 99.1 -11.6 29.43091 38.07556 29.4 0.65125 0.41088 0.13723 0.15352
45 Relative variation of runoff during winter low flow 1983 -0.00272 0.44193 0.27211 -38.4 0.31443 0.23671 -24.7 0.02495 0.00955 0.02404 0.11406
46 Duration of winter low flow 1984 -0.47597 130.44444 115.27027 -11.6 18.08810 27.07361 49.7 0.00115 0.02306 0.0093 0.03518
47 Relative variation of runoff during summer-autumn low flow 1970 -0.00039 0.56005 0.62536 11.7 0.43161 0.28499 -34 0.85746 0.66529 0.60021 0.03682
48 Duration of a summer-autumn low flow 1999 0.51113 198.61905 216.63636 9.1 20.61488 23.16719 12.4 0.00027 0.00955 0.00394 0.51051

Interannual plots

Summarized variables can be ploted and statistically tested to reveal interannual changes. The basic function for plotting is gr_plot_vars(). Just pass the names of the variables that you want to plot, and the desired plotting layout. Different background fill colors are used to differentiate seasons:

# plot one selected variable
gr_plot_vars(vars, Qygr) 
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).


# plot one selected variable
gr_plot_vars(vars, Dspstart) 
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).
#> Warning: Removed 1 row containing missing values or values outside the scale range
#> (`geom_point()`).


# plot two variables sequentially
gr_plot_vars(vars, D10w1, Wsprngr)
#> Warning: Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Removed 1 row containing missing values or values outside the scale range
#> (`geom_point()`).

#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).


# plot four variables in matrix layout
gr_plot_vars(vars, Qspmax, Qygr, D10w1, Wsprngr,
             layout = matrix(1:4, nrow = 2, byrow = TRUE)) 
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).
#> Warning: Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Warning: Removed 1 row containing missing values or values outside the scale range
#> (`geom_point()`).
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).

Tests can be calculated on the fly during the variable plotting or passed into tests = parameters. In this case the plots are supplemented with trend line and change year:

# add tests calculated on the fly (only plotted variables are tested)
gr_plot_vars(vars, Qspmax, Qygr, D10w1, Wsprngr,
             layout = matrix(1:4, nrow = 2, byrow = TRUE),
             tests = TRUE) 
#> Warning: Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Warning: Removed 1 row containing missing values or values outside the scale range
#> (`geom_point()`).
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).


# calculate tests beforehand
tests = gr_test_vars(vars)
gr_plot_vars(vars, D10w1, Wsprngr, Nthw, Qrnmax,
             layout = matrix(1:4, nrow = 2, byrow = TRUE),
             tests = tests) 
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).
#> Warning: Removed 1 row containing missing values or values outside the scale range
#> (`geom_point()`).
#> Warning: Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Removed 1 row containing non-finite outside the scale range (`stat_smooth()`).
#> Warning: Removed 1 row containing missing values or values outside the scale range
#> (`geom_rect()`).
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_smooth()`).

Period plots

Period plots are boxplots produced by gr_plot_periods() for hydrograph separation variables. The data for each variable is divided into two sample periods: before and after the change year either set by year parameter or extracted from tests (statistically estimated). Different background fill colors are used to differentiate seasons:

# plot periods with fixed change year
gr_plot_periods(vars, Qygr, year = 1979)
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_boxplot()`).


# plot periods with change year from Pettitt test
gr_plot_periods(vars, Qygr, tests = TRUE)
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_boxplot()`).


# calculate test beforehand
gr_plot_periods(vars, Qspmax, tests = tests)
#> Warning: Removed 1 row containing non-finite outside the scale range
#> (`stat_boxplot()`).


# use matrix layout to plot multiple variables
gr_plot_periods(vars, Qygr, Qspmax, D10w1, Wsprngr,
                layout = matrix(1:4, nrow = 2),
                tests = tests)
#> Warning: Removed 1 row containing non-finite outside the scale range (`stat_boxplot()`).
#> Removed 1 row containing non-finite outside the scale range (`stat_boxplot()`).
#> Removed 1 row containing non-finite outside the scale range (`stat_boxplot()`).
#> Removed 1 row containing non-finite outside the scale range (`stat_boxplot()`).

Minimum runoff month plots

A histogram of a minimum runoff month for two periods: before and after the change year set by year parameter. This kind of plot is produced by gr_plot_minmonth():

# plot minimum runoff month for two periods divided by Pettitt test
gr_plot_minmonth(vars, tests = gr_test_vars(vars))


# plot minimum runoff month for two periods divided by fixed year
gr_plot_minmonth(vars, year = 1979)

Test plots

Test plots produced by gr_plot_tests() are intended to facilitate the visual analysis of statistical tests. Currently only the change year density is available as a plotting variable:

# plot change year from Pettitt test
gr_plot_tests(tests, type = 'year')

As can be seen from this plot, most of the variables demonstrate the change in their statistical behavior around 1979 year.