A_theta_x: Surface area of the intersection of two hyperspherical caps

View source: R/RcppExports.R

A_theta_xR Documentation

Surface area of the intersection of two hyperspherical caps

Description

Computation of

A_x(\theta_{ij}) := \frac{1}{\omega_p} \int_{S^{p - 1}} 1_{\{{\bf X}_i'\boldsymbol\gamma \le x, {\bf X}_j'\boldsymbol\gamma \le x\}}\,\mathrm{d}\boldsymbol\gamma,

where \theta_{ij} := \cos^{-1}({\bf X}_i'{\bf X}_j) \in [0, \pi], x \in [-1, 1], and \omega_{p} is the surface area of S^{p - 1}. A_x(\theta_{ij}) is the proportion of surface area of S^{p - 1} covered by the intersection of two hyperspherical caps centered at {\bf X}_i and {\bf X}_j and with common solid angle \pi - \cos^{-1}(x).

Usage

A_theta_x(theta, x, p, N = 160L, as_matrix = TRUE)

Arguments

theta

vector with values in [0, \pi].

x

vector with values in [-1, 1].

p

integer giving the dimension of the ambient space R^p that contains S^{p-1}.

N

number of points used in the Gauss-Legendre quadrature. Defaults to 160.

as_matrix

return a matrix with the values of A_x(\theta) on the grid formed by theta and x? If FALSE, A_x(\theta) is evaluated on theta and x if they equal in size. Defaults to TRUE.

Details

See García-Portugués et al. (2023) for more details about the A_x(\theta) function.

Value

A matrix of size c(length(theta), length(x)) containing the evaluation of A_x(\theta) if as_matrix = TRUE. Otherwise, a vector of size c(length(theta) if theta and x equal in size.

References

García-Portugués, E., Navarro-Esteban, P., Cuesta-Albertos, J. A. (2023) On a projection-based class of uniformity tests on the hypersphere. Bernoulli, 29(1):181–204. \Sexpr[results=rd]{tools:::Rd_expr_doi("10.3150/21-BEJ1454")}.

Examples

# Plot A_x(theta) for several dimensions and x's
A_lines <- function(x, th = seq(0, pi, l = 200)) {

  plot(th, A_theta_x(theta = th, x = x, p = 2), type = "l",
       col = 1, ylim = c(0, 1.25), main = paste("x =", x),
       ylab = expression(A[x](theta)),
       xlab = expression(theta), axes = FALSE)
  axis(1, at = c(0, pi / 4, pi / 2, 3 * pi / 4, pi),
       labels = expression(0, pi / 4, pi / 2, 3 * pi / 4, pi))
  axis(2); box()
  abline(h = c(0, 1), lty = 2)
  lines(th, A_theta_x(theta = th, x = x, p = 3), col = 2)
  lines(th, A_theta_x(theta = th, x = x, p = 4), col = 3)
  lines(th, A_theta_x(theta = th, x = x, p = 5), col = 4)
  legend("top", lwd = 2, legend = paste("p =", 2:5),
         col = 1:4, cex = 0.75, horiz = TRUE)

}
old_par <- par(mfrow = c(2, 3))
A_lines(x = -0.75)
A_lines(x = -0.25)
A_lines(x = 0)
A_lines(x = 0.25)
A_lines(x = 0.5)
A_lines(x = 0.75)
par(old_par)

# As surface of (theta, x) for several dimensions
A_surf <- function(p, x = seq(-1, 1, l = 201), th = seq(0, pi, l = 201)) {

  col <- c("white", viridisLite::viridis(20))
  breaks <- c(-1, seq(1e-15, 1, l = 21))
  A <- A_theta_x(theta = th, x = x, p = p)
  image(th, x, A, main = paste("p =", p), col = col, breaks = breaks,
        xlab = expression(theta), axes = FALSE)
  axis(1, at = c(0, pi / 4, pi / 2, 3 * pi / 4, pi),
       labels = expression(0, pi / 4, pi / 2, 3 * pi / 4, pi))
  axis(2); box()
  contour(th, x, A, levels = breaks, add = TRUE)

}
old_par <- par(mfrow = c(2, 2))
A_surf(p = 2)
A_surf(p = 3)
A_surf(p = 4)
A_surf(p = 5)
par(old_par)

# No matrix return
th <- seq(0, pi, l = 5)
x <- seq(-1, 1, l = 5)
diag(A_theta_x(theta = th, x = x, p = 2))
A_theta_x(theta = th, x = x, p = 2, as_matrix = FALSE)

sphunif documentation built on Aug. 21, 2023, 9:11 a.m.