library(hypergeo)
library(fAsianOptions)
# Modified by examining code in the function vmfkde.tune in the Directional Package
# Credit to the following authors of the Directional package:
# Michail Tsagris, Giorgos Athineou, Anamul Sajib, Eli Amson, Micah J. Waldstein
mwatson.tune = function (x, low = 0.1, up = 1) {
p <- dim(x)[2]
n <- dim(x)[1]
d <- tcrossprod(x) * tcrossprod(x)
# Square here to avoid NAN warning
diag(d) <- NA
con <- 2*(pi)^(p/2)
funa <- function(h) {
A <- (d)/h^2
mpk <- gamma(p/2)/( con * Re(fAsianOptions::kummerM(1/h^2, 1/2, p/2)) )
f <- rowSums(exp(A + log(mpk)), na.rm = TRUE)/(n - 1)
mean(log(f))
}
a <- optimize(funa, c(low, up), maximum = TRUE)
res <- c(a$maximum, a$objective)
names(res) <- c("Optimal h", "cv")
res
}
# Modified by examining code in the function vmf.kde in the Directional Package
# Credit to the following authors of the Directional package:
# Michail Tsagris, Giorgos Athineou, Anamul Sajib, Eli Amson, Micah J. Waldstein
w.kde = function (x, h = NULL) {
p <- dim(x)[2]
n <- dim(x)[1]
if (is.null(h)) {
h <- as.numeric(mwatson.tune(x, low = 0.1, up = 1)[1])
} else {
h <- h
}
d <- (tcrossprod(x) * tcrossprod(x))/h^2
mpk <- gamma(p/2)/( 2*(pi)^(p/2) * Re(fAsianOptions::kummerM(1/h^2, 1/2, p/2)) )
f <- Rfast::rowmeans(exp(d + log(mpk) ))
list(h = h, f = f)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.