This vignette teaches you how to retrieve the mean direction of stress datasets.

Directional data is \(\pi\)-periodical. Thus, for the calculation
of mean, the average of 35 and 355\(^{\circ}\) should be 15 instead of 195\(^{\circ}\). **tectonicr**
provides the circular mean (`circular_mean()`

) and the
quasi-median (`circular_median()`

) as metrics to describe
average direction:

Because the stress data is heteroscedastic, the data with less precise direction should have less impact on the final mean direction The weighted mean or quasi-median uses the reported measurements weighted by the inverse of the uncertainties:

```
circular_mean(san_andreas$azi, 1 / san_andreas$unc)
#> [1] 9.961752
circular_median(san_andreas$azi, 1 / san_andreas$unc)
#> [1] 54
```

The spread of directional data can be expressed by the standard deviation (for the mean) or the quasi-interquartile range (for the median):

**NOTE:** Because the \(\sigma_{SHmax}\) orientations are subjected
to angular distortions in the geographical coordinate system, it is
recommended to express statistical parameters using the transformed
orientations of the PoR reference frame.

```
data("cpm_models")
por <- subset(cpm_models, model == "NNR-MORVEL56") |>
equivalent_rotation("na", "pa")
san_andreas.por <- PoR_shmax(san_andreas, por, type = "right")
```

```
circular_mean(san_andreas.por$azi.PoR, 1 / san_andreas$unc)
#> [1] 140.9378
circular_sd(san_andreas.por$azi.PoR, 1 / san_andreas$unc)
#> [1] 20.70855
circular_median(san_andreas.por$azi.PoR, 1 / san_andreas$unc)
#> [1] 134.3514
circular_IQR(san_andreas.por$azi.PoR, 1 / san_andreas$unc)
#> [1] 22.1692
```

The collected summary statistics can be quickly obtained by
`circular_summary()`

:

```
circular_summary(san_andreas.por$azi.PoR, 1 / san_andreas$unc)
#> n mean sd var 25% quasi-median
#> 407.0000000 140.9378309 20.7085472 0.2299245 124.4211789 134.3513545
#> 75% median 95%CI skewness kurtosis R
#> 146.5903801 135.2559405 3.8666117 -0.4975826 1.1926891 0.7782013
```

The summary statistics include also the circular variance, skewness, kurtosis, and the 95% confidence angle.

**tectonicr** provides a rose diagram, i.e. histogram
for angular data.

```
rose(san_andreas$azi,
weights = 1 / san_andreas$unc, main = "North pole",
dots = TRUE, stack = TRUE, dot_cex = 0.5, dot_pch = 21
)
# add the density curve
plot_density(san_andreas$azi, kappa = 10, col = "dodgerblue", shrink = 1.5)
```

The diagram shows the uncertainty-weighted frequencies (equal area rose fans), the von Mises density distribution (blue curve), and the circular mean (red line) incl. its 95% confidence interval (transparent red).

Showing the distribution of the transformed data gives the better representation of the angle distribution as there is no angle distortion due to the arbitrarily chosen geographic coordinate system.

```
rose(san_andreas.por$azi,
weights = 1 / san_andreas$unc, main = "PoR",
dots = TRUE, stack = TRUE, dot_cex = 0.5, dot_pch = 21
)
plot_density(san_andreas.por$azi, kappa = 10, col = "dodgerblue", shrink = 1.5)
# show the predicted direction
rose_line(135, radius = 1.1, col = "#009E73")
```

The green line shows the predicted direction.

Uniformly distributed orientation can be described by the *von
Mises distribution* (Mardia and Jupp, 1999). If the directions are
distributed randomly can be tested with the **Rayleigh
Test**:

```
rayleigh_test(san_andreas.por$azi.PoR)
#> Reject Null Hypothesis
#> $R
#> [1] 0.7782013
#>
#> $statistic
#> [1] 246.4781
#>
#> $p.value
#> [1] 9.034746e-108
```

Here, the test rejects the Null Hypothesis
(`statistic > p.value`

). Thus the \(\sigma_{SHmax}\) directions have a
preferred orientation.

Alternative statistical tests for circular uniformity are
`kuiper_test()`

and `watson_test()`

. Read
`help()`

for more details…

Assuming a von Mises Distribution (circular normal distribution) of
the orientation data, a \((1-\alpha
\%)/100\) **confidence interval** can be calculated
(Mardia and Jupp, 1999):

```
confidence_interval(san_andreas.por$azi.PoR, conf.level = 0.95, w = 1 / san_andreas$unc)
#> $mu
#> [1] 140.9378
#>
#> $conf.angle
#> [1] 1.461317
#>
#> $conf.interval
#> [1] 139.4765 142.3991
```

The prediction for the \(\sigma_{SHmax}\) orientation is \(135^{\circ}\). Since the prediction lies within the confidence interval, it can be concluded with 95% confidence that the orientations follow the predicted trend of \(\sigma_{SHmax}\).

The (weighted) **circular dispersion** of the
orientation angles around the prediction is another way of assessing the
significance of a normal distribution around a specified direction. It
can be measured by:

The value of the dispersion ranges between 0 and 2.

The standard error and the confidence interval of the calculated circular dispersion can be estimated by bootstrapping via:

```
circular_dispersion_boot(san_andreas.por$azi.PoR, y = 135, w = 1 / san_andreas$unc, R = 1000)
#> $MLE
#> [1] 0.2281785
#>
#> $sde
#> [1] 0.02096251
#>
#> $CI
#> [1] 0.1885083 0.2688265
```

The statistical test for the goodness-of-fit is the (weighted)
**Rayleigh Test** with a specified mean direction (here the
predicted direction of \(135^{\circ}\):

```
weighted_rayleigh(san_andreas.por$azi.PoR, mu = 135, w = 1 / san_andreas$unc)
#> Reject Null Hypothesis
#> $C
#> [1] 0.7535932
#>
#> $statistic
#> [1] 21.50053
#>
#> $p.value
#> [1] 3.777096e-100
```

Here, the Null Hypothesis is rejected, and thus, the alternative, that is a uniform distribution around the predicted direction, cannot be excluded.

Mardia, K. V., and Jupp, P. E. (Eds.). (1999). “Directional Statistics” Hoboken, NJ, USA: John Wiley & Sons, Inc. doi: 10.1002/9780470316979.

Ziegler, Moritz O., and Oliver Heidbach. 2017. “Manual of the Matlab Script Stress2Grid” GFZ German Research Centre for Geosciences; World Stress Map Technical Report 17-02. doi: 10.5880/wsm.2017.002.