-
Notifications
You must be signed in to change notification settings - Fork 0
/
03_quadrant-analysis.Rmd
166 lines (107 loc) · 8.15 KB
/
03_quadrant-analysis.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# Quadrant analysis
Quadrant analysis is a simple conditional sampling method to detect coherent structures directly from the high-frequency measurements (e.g. @Katul1997) or simulations (e.g. @Wallace2016). Coherent structures maintain their structure for a significant time period, and due to their coherence, they can generate deviations from mean flow properties (e.g. @Jimenez2018). For quadrant analysis a scatter plot of a pair of two variables is considered, which are normalized through
$$ \hat{x} = \frac{x-\overline{x}}{\sigma_x}$$
by substracting the mean value $\overline{x}$ and dividing by $\sigma_x$ to make different variables with different value ranges comparable and centered around zero. Based on this, strength $S_i$ and duration $D_i$ of each quadrant ($i=1, ..., 4$) can be calculated:
$$ S_i = \frac{\overline{\hat{x}'\hat{w}'}_i}{\overline{\hat{x}\hat{w}}}, \quad\quad D_i = \frac{1}{t_s} \int_0^{t_s} I_i(t) dt$$
$S_i$ represents the relative strength of the respective quadrant (normalized by the total covariance) and $D_i$ the occurrence frequency of each quadrant (with averaging time $t_s$ and indicator function $I_i$). To get an overall measure for the contribution of disorganized (i.e. counter-gradient contribution) versus organized (i.e. down-gradient contribution) structures, the exuberance $E$ [@Shaw1983] and the organization ratio $OR$ [@Mack2024] can be defined as:
$$ E = \frac{S(disorganized)}{S(organized)}, \quad\quad OR = \frac{D(disorganized)}{D(organized)}$$
For example, for the sensible heat flux warm updrafts and cold downdrafts are the organized structures, and oppositely cold updrafts and warm downdrafts the disorganized ones (in the figure below, organized structures are shaded and disorganized are not shaded). <br>
To filter out particularly strong coherent structures, a hole size can be applied with the filter conditions $\vert \hat{x}\hat{y} \vert \le H \cdot \vert \overline{\hat{x}'\hat{y}'}\vert$ (hyperbolic curves in the figure). Usually, $y$ is chosen to be the vertical velocity $w$. The quadrant analysis is directly related to the fluxes by using the respective constituting quantities: $(u,w)$ for momentum flux, $(T,w)$ for sensible heat flux, $(q,w)$ for latent heat flux and $(c,w)$ for CO$_2$ flux -- as visualized in the figure (adapted from @Mack2024).
<img src="./figures/schema/qa_schema.png" />
```R
#loading Reddy package
install.packages("../src/Reddy_0.0.0.9000.tar.gz",repos=NULL,source=TRUE,quiet=TRUE)
library(Reddy)
#ec data files
dir_in="../data/ec-data_10Hz_raw"
files=list.files(dir_in,full.names=TRUE)
nf=length(files)
```
## Calculation of occurrence frequencies and strengths of the four quadrants with `calc_quadrant_analysis`
To perform quadrant analysis, Reddy provides two functions: `calc_quadrant_analysis` for calculating occurrence frequency and strength of the four quadrants and `plot_quadrant_analysis` for plotting the two variables as scatter plot with a 2d kernel density estimation and a linear regression, as detailed below. <br>
The function `calc_quadrant_analysis` counts the occurrence frequency of each quadrant, calculates their strength as product $\hat{x}\hat{y}$ and as covariance $\overline{\hat{x}'\hat{y}'}$. The argument `do_normalization = TRUE` can be used to normalize the two variables and with `hole_sizes` one or several hole sizes can be applied. The output is a list containing $D_i$, $S_i$ for every quadrant and hole size.
```R
i=8 #select a file
tmp=read.table(files[i],sep=",",header=T)
qa_Tw=calc_quadrant_analysis(tmp$T_degC,tmp$w_m.s) #based on the raw data (10 Hz) directly (i.e., unrotated)
str(qa_Tw)
```
List of 10
$ hole_sizes : int [1:11] 0 1 2 3 4 5 6 7 8 9 ...
$ occurrence : int [1:4, 1:11] 5448 2975 6619 2958 4689 144 3812 300 4232 8 ...
$ product : num [1:4, 1:11] 1.068 -0.291 0.619 -0.42 0.816 ...
$ covariance : num [1:4, 1:11] 0.10672 0.05309 -0.00914 0.03226 0.31902 ...
$ covariance_total : num 0.15
$ correlation_total : num 0.434
$ product_total : num [1:18000] 0.0448 -0.0544 -0.4983 0.115 0.3095 ...
$ exuberance : num [1:11] -0.422 -2.699 -5.521 -7.411 NaN ...
$ organization_ratio: num [1:11] 0.491672 0.052229 0.00992 0.002498 0.000495 ...
$ meta : chr "Output format: rows represent the quadrants Q1, Q2, Q3, Q4 -- columns represent selected hole sizes"
## Plotting quadrant analysis with `plot_quadrant_analysis`
`plot_quadrant_analysis` plots a scatter plot of two variables with a 2d kernel density estimation (`MASS::kde2d`) and a linear regression (`lm()`) to allow for a visual inspection.
**Example: Quadrant Analysis (T,w) during daytime**
```R
i=8 #select a file -- a daytime example
print(files[i])
tmp=read.table(files[i],sep=",",header=T)
plot_quadrant_analysis(tmp$T_degC,tmp$w_m.s,xlab="T (normalized)",ylab="w (normalized)",main="Quadrant Analysis (T,w)")
```
[1] "../data/ec-data_10Hz_raw/2018-07-20T120000.csv"
Call:
lm(formula = yval ~ xval)
Residuals:
Min 1Q Median 3Q Max
-4.5818 -0.5491 0.0005 0.5471 4.1136
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.849e-16 6.716e-03 0.00 1
xval 4.337e-01 6.716e-03 64.58 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9011 on 17998 degrees of freedom
Multiple R-squared: 0.1881, Adjusted R-squared: 0.1881
F-statistic: 4170 on 1 and 17998 DF, p-value: < 2.2e-16
![](figures/fig_0901.png){width=500}
**Example: Quadrant Analysis (T,w) during nighttime**
```R
i=38 #select a file -- a nighttime example
print(files[i])
tmp=read.table(files[i],sep=",",header=T)
plot_quadrant_analysis(tmp$T_degC,tmp$w_m.s,xlab="T (normalized)",ylab="w (normalized)",main="Quadrant Analysis (T,w)") #based on the raw data (10 Hz) directly (i.e., unrotated)
```
[1] "../data/ec-data_10Hz_raw/2018-07-21T030000.csv"
Call:
lm(formula = yval ~ xval)
Residuals:
Min 1Q Median 3Q Max
-5.8334 -0.5262 0.0022 0.5425 6.2520
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.006e-17 7.120e-03 0.00 1
xval -2.957e-01 7.121e-03 -41.53 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9553 on 17998 degrees of freedom
Multiple R-squared: 0.08745, Adjusted R-squared: 0.0874
F-statistic: 1725 on 1 and 17998 DF, p-value: < 2.2e-16
![](figures/fig_0902.png){width=500}
**Example: Quadrant Analysis (u,w) during nighttime**
```R
plot_quadrant_analysis(tmp$u_m.s,tmp$w_m.s,xlab="u (normalized)",ylab="w (normalized)",main="Quadrant Analysis (u,w)") #based on the raw data (10 Hz) directly (i.e., unrotated)
```
Call:
lm(formula = yval ~ xval)
Residuals:
Min 1Q Median 3Q Max
-5.9799 -0.5474 -0.0342 0.5301 6.6338
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.749e-16 7.326e-03 0.00 1
xval -1.843e-01 7.326e-03 -25.15 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.9829 on 17998 degrees of freedom
Multiple R-squared: 0.03395, Adjusted R-squared: 0.0339
F-statistic: 632.5 on 1 and 17998 DF, p-value: < 2.2e-16
![](figures/fig_0903.png){width=500}
Quadrant analysis can be applied to any combination of two measured quantities and also allows to check the measurement quality or significance of the relation between them. It can also be used to check the effect of the coordinate rotation (e.g., `rotate_double`) visually. Quadrant analysis has been used to study coherent structures, and how they affect fluxes and cause flux dissimilarity, e.g. @Thomas2007, @Li2011, @Schmutz2019 and @Mack2024. The concept can be extended to a combination of three variables in the framework of octant analysis, e.g. @Guo2022.