# tangent-vMF: Tangent von Mises-Fisher distribution In rotasym: Tests for Rotational Symmetry on the Hypersphere

## Description

Density and simulation of the Tangent von Mises–Fisher (TM) distribution on S^{p-1} := {x \in R^p : ||x|| = 1}, p≥ 2. The distribution arises by considering the tangent-normal decomposition with multivariate signs distributed as a von Mises–Fisher distribution.

## Usage

 1 2 3 d_TM(x, theta, g_scaled, d_V, mu, kappa, log = FALSE) r_TM(n, theta, r_V, mu, kappa) 

## Arguments

 x locations in S^{p-1} to evaluate the density. Either a matrix of size c(nx, p) or a vector of length p. Normalized internally if required (with a warning message). theta a unit norm vector of size p giving the axis of rotational symmetry. g_scaled the scaled angular density c_g g. In the form g_scaled <- function(t, log = TRUE) {...}. See examples. d_V the density f_V. In the form d_V <- function(v, log = TRUE) {...}. See examples. mu the directional mean μ of the vMF used in the multivariate signs. A unit-norm vector of length p - 1. kappa concentration parameter κ of the vMF used in the multivariate signs. A nonnegative scalar. log flag to indicate if the logarithm of the density (or the normalizing constant) is to be computed. n sample size, a positive integer. r_V a function for simulating V. Its first argument must be the sample size. See examples.

## Details

The functions are wrappers for d_tang_norm and r_tang_norm with d_U = d_vMF and r_U = r_vMF.

## Value

Depending on the function:

• d_TM: a vector of length nx or 1 with the evaluated density at x.

• r_TM: a matrix of size c(n, p) with the random sample.

## Author(s)

Eduardo García-Portugués, Davy Paindaveine, and Thomas Verdebout.

## References

García-Portugués, E., Paindaveine, D., Verdebout, T. (2020) On optimal tests for rotational symmetry against new classes of hyperspherical distributions. Journal of the American Statistical Association, 115(532):1873–1887. doi: 10.1080/01621459.2019.1665527

tang-norm-decomp, tangent-elliptical, vMF.
  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 ## Simulation and density evaluation for p = 2 # Parameters p <- 2 n <- 1e3 theta <- c(rep(0, p - 1), 1) mu <- c(rep(0, p - 2), 1) kappa <- 1 kappa_V <- 2 # Required functions r_V <- function(n) r_g_vMF(n = n, p = p, kappa = kappa_V) g_scaled <- function(t, log) { g_vMF(t, p = p - 1, kappa = kappa_V, scaled = TRUE, log = log) } # Sample and color according to density x <- r_TM(n = n, theta = theta, r_V = r_V, mu = 1, kappa = kappa) col <- viridisLite::viridis(n) r <- runif(n, 0.95, 1.05) # Radius perturbation to improve visualization dens <- d_TM(x = x, theta = theta, g_scaled = g_scaled, mu = mu, kappa = kappa) plot(r * x, pch = 16, col = col[rank(dens)]) ## Simulation and density evaluation for p = 3 # Parameters p <- 3 n <- 5e3 theta <- c(rep(0, p - 1), 1) mu <- c(rep(0, p - 2), 1) kappa <- 1 kappa_V <- 2 # Sample and color according to density x <- r_TM(n = n, theta = theta, r_V = r_V, mu = mu, kappa = kappa) col <- viridisLite::viridis(n) dens <- d_TM(x = x, theta = theta, g_scaled = g_scaled, mu = mu, kappa = kappa) if (requireNamespace("rgl")) { rgl::plot3d(x, col = col[rank(dens)], size = 5) } ## A non-vMF angular function: g(t) = 1 - t^2. It is sssociated to the ## Beta(1/2, (p + 1)/2) distribution. # Scaled angular function g_scaled <- function(t, log) { log_c_g <- lgamma(0.5 * p) + log(0.5 * p / (p - 1)) - 0.5 * p * log(pi) log_g <- log_c_g + log(1 - t^2) switch(log + 1, exp(log_g), log_g) } # Simulation r_V <- function(n) { sample(x = c(-1, 1), size = n, replace = TRUE) * sqrt(rbeta(n = n, shape1 = 0.5, shape2 = 0.5 * (p + 1))) } # Sample and color according to density kappa <- 0.5 x <- r_TM(n = n, theta = theta, r_V = r_V, mu = mu, kappa = kappa) col <- viridisLite::viridis(n) dens <- d_TM(x = x, theta = theta, g_scaled = g_scaled, mu = mu, kappa = kappa) if (requireNamespace("rgl")) { rgl::plot3d(x, col = col[rank(dens)], size = 5) }