| Type: | Package | 
| Title: | Kernel Density Estimation for Random Symmetric Positive Definite Matrices | 
| Version: | 1.0 | 
| Description: | Kernel smoothing for Wishart random matrices described in Daayeb, Khardani and Ouimet (2025) <doi:10.48550/arXiv.2506.08816>, Gaussian and log-Gaussian models using least square or likelihood cross validation criteria for optimal bandwidth selection. | 
| BugReports: | https://github.com/lbelzile/ksm/issues | 
| Imports: | Rcpp (≥ 1.0.12) | 
| Suggests: | cubature, tinytest | 
| LinkingTo: | Rcpp, RcppArmadillo | 
| Encoding: | UTF-8 | 
| License: | MIT + file LICENSE | 
| RoxygenNote: | 7.3.3 | 
| LazyData: | true | 
| Depends: | R (≥ 2.10) | 
| NeedsCompilation: | yes | 
| Packaged: | 2025-10-23 15:15:27 UTC; lbelzile | 
| Author: | Leo Belzile  | 
| Maintainer: | Leo Belzile <belzilel@gmail.com> | 
| Repository: | CRAN | 
| Date/Publication: | 2025-10-28 12:30:02 UTC | 
Solver for Riccati equation
Description
Given two matrices M and S, solve Riccati equation by iterative updating to find the solution \mathbf{R}, where the latter satisfies
\mathbf{R}=\mathbf{M}\mathbf{R}\mathbf{M}^\top + \mathbf{S}
until convergence (i.e., when the Frobenius norm is less than tol, or the maximum number of iterations maxiter is reached.
Usage
Riccati(M, S, tol = 1e-08, maxiter = 10000L)
Arguments
M | 
 matrix  | 
S | 
 matrix  | 
tol | 
 double for tolerance  | 
maxiter | 
 integer, the maximum number of iterations  | 
Value
a list containing
-  
solutionmatrix solution to Riccati's equation -  
errornumerical error -  
niternumber of iteration -  
convergencebool indicating convergence (TRUE) ifniter < maxiter 
Bandwidth optimization for symmetric matrix kernels
Description
Given a sample of positive definite matrices,
perform numerical maximization of the h-block least square (lscv) or leave-one-out likelihood (lcv) cross-validation criteria using a root search.
Usage
bandwidth_optim(
  x,
  criterion = c("lscv", "lcv"),
  kernel = c("Wishart", "smlnorm", "smnorm"),
  tol = 1e-04,
  h = 1L
)
Arguments
x | 
 sample of symmetric matrix observations from which to build the kernel density kernel  | 
criterion | 
 optimization criterion, one of   | 
kernel | 
 string, one of   | 
tol | 
 double, tolerance of optimization (root search)  | 
h | 
 lag step for consideration of observations, for the case   | 
Value
double, the optimal bandwidth up to tol
Density of Wishart random matrix
Description
Density of Wishart random matrix
Usage
dWishart(x, df, S, log = FALSE)
Arguments
x | 
 array of dimension   | 
df | 
 degrees of freedom  | 
S | 
 symmetric positive definite matrix of dimension   | 
log | 
 logical; if   | 
Value
a vector of length n containing the log-density of the Wishart.
Density of inverse Wishart random matrix
Description
Density of inverse Wishart random matrix
Usage
dinvWishart(x, df, S, log = FALSE)
Arguments
x | 
 array of dimension   | 
df | 
 degrees of freedom  | 
S | 
 symmetric positive definite matrix of dimension   | 
log | 
 logical; if   | 
Value
a vector of length n containing the log-density of the inverse Wishart.
Matrix beta type II density function
Description
Given a random matrix x, compute the density
for arguments shape1 and shape2
Usage
dmbeta2(x, shape1, shape2, log = TRUE)
Arguments
x | 
 cube of dimension   | 
shape1 | 
 positive shape parameter, strictly larger than   | 
shape2 | 
 positive shape parameter, strictly larger than   | 
log | 
 [logical] if   | 
Value
a vector of length n
Symmetric matrix-variate lognormal density
Description
Density of the lognormal matrix-variate density, defined through the matrix logarithm, with the Jacobian resulting from the transformation
Usage
dsmlnorm(x, b, M, log = TRUE)
Arguments
x | 
 [cube] array of dimension   | 
b | 
 [numeric] scale parameter, strictly positive  | 
M | 
 [matrix] location matrix, positive definite  | 
log | 
 [logical] if   | 
Value
a vector of length n
Symmetric matrix-variate normal density
Description
Symmetric matrix-variate normal density
Usage
dsmnorm(x, b, M, log = TRUE)
Arguments
x | 
 [cube] array of dimension   | 
b | 
 [numeric] scale parameter, strictly positive  | 
M | 
 [matrix] location matrix, positive definite  | 
log | 
 [logical] if   | 
Value
a vector of length n
Integration with respect to symmetric positive definite matrices
Description
Given a function f defined over the space of symmetric positive definite matrices, compute an integral via numerical integration using the routine cubintegrate.
Usage
integrate_spd(
  f,
  dim,
  tol = 0.001,
  lb = 1e-08,
  ub = Inf,
  neval = 1000000L,
  method = c("suave", "hcubature"),
  ...
)
Arguments
f | 
 function to evaluate that takes as arguments array of size   | 
dim | 
 dimension of integral, only two or three dimensions are supported  | 
tol | 
 double for tolerance of numerical integral  | 
lb | 
 lower bound for integration range of eigenvalues  | 
ub | 
 upper bound for integration range of eigenvalues  | 
neval | 
 maximum number of evaluations  | 
method | 
 string indicating the method from   | 
... | 
 additional arguments for the function   | 
Value
list returned by the integration routine. See the documentation of cubintegrate for more details.
Examples
integrate_spd(
  dim = 2L,
  neval = 1e4L,
  f = function(x, S){
   dWishart(x, df = 10, S = S, log = FALSE)},
  S = diag(2))
Wishart kernel density
Description
Given a sample of m points xs from an original sample
and a set of n new sample matrices x at which to evaluate the Wishart kernel, return the density with bandwidth parameter b.
Usage
kdens_Wishart(x, xs, b, log = TRUE)
Arguments
x | 
 cube of size   | 
xs | 
 cube of size   | 
b | 
 positive double giving the bandwidth parameter  | 
log | 
 bool; if   | 
Value
a vector of length n containing the (log) density of the sample x
Symmetric matrix log-normal kernel density
Description
Given a sample of m points xs from an original sample
and a set of n new sample matrices x at which to evaluate the symmetric matrix normal log kernel, return the density with bandwidth parameter b.
Usage
kdens_smlnorm(x, xs, b, log = TRUE)
Arguments
x | 
 cube of size   | 
xs | 
 cube of size   | 
b | 
 positive double giving the bandwidth parameter  | 
log | 
 bool; if   | 
Value
a vector of length n containing the (log) density of the sample x
Symmetric matrix normal kernel density
Description
Given a sample of m points xs from an original sample
and a set of n new sample matrices x at which to evaluate the symmetric matrix normal kernel, return the density with bandwidth parameter b. Note that this kernel suffers from boundary spillover.
Usage
kdens_smnorm(x, xs, b, log = TRUE)
Arguments
x | 
 cube of size   | 
xs | 
 cube of size   | 
b | 
 positive double giving the bandwidth parameter  | 
log | 
 bool; if   | 
Value
a vector of length n containing the (log) density of the sample x
Kernel density estimators for symmetric matrices
Description
Given a sample of m points xs from an original sample
and a set of n new sample symmetric positive definite matrices x at which to evaluate the kernel, return the density with bandwidth parameter b.
Usage
kdens_symmat(x, xs, kernel = "Wishart", b = 1, log = TRUE)
Arguments
x | 
 cube of size   | 
xs | 
 cube of size   | 
kernel | 
 string, one of   | 
b | 
 positive double giving the bandwidth parameter  | 
log | 
 bool; if   | 
Value
a vector of length n containing the (log) density of the sample x
Likelihood cross-validation for symmetric positive definite matrix kernels
Description
Given a cube of sample observations (consisting of random symmetric positive definite matrices), and a vector of candidate bandwidth parameters b,
compute the leave-one-out likelihood cross-validation criterion and
return the bandwidth among the choices that minimizes the criterion.
Usage
lcv_kdens_symmat(x, b, kernel = "Wishart")
Arguments
x | 
 array of dimension   | 
b | 
 vector of candidate bandwidth, strictly positive  | 
kernel | 
 string indicating the kernel, one of   | 
Value
a list with arguments
-  
lcvvector of likelihood cross validation criterion -  
bvector of candidate bandwidth -  
bandwidthoptimal bandwidth among candidates -  
kernelstring indicating the choice of kernel function 
Likelihood cross validation criterion for Wishart kernel
Description
Given a cube x and a bandwidth b, compute
the leave-one-out cross validation criterion by taking out a slice
and evaluating the kernel at the holdout value.
Usage
lcv_kern_Wishart(x, b)
Arguments
x | 
 [cube] array of dimension   | 
b | 
 [numeric] scale parameter, strictly positive  | 
Value
the value of the log objective function
Likelihood cross validation criterion for symmetric matrix lognormal kernel
Description
Given a cube x and a bandwidth b, compute
the leave-one-out cross validation criterion by taking out a slice
and evaluating the kernel at the holdout value.
Usage
lcv_kern_smlnorm(x, b)
Arguments
x | 
 [cube] array of dimension   | 
b | 
 [numeric] scale parameter, strictly positive  | 
Value
the value of the log objective function
Likelihood cross validation criterion for symmetric matrix normal kernel
Description
Given a cube x and a bandwidth b, compute
the leave-one-out cross validation criterion by taking out a slice
and evaluating the kernel at the holdout value.
Usage
lcv_kern_smnorm(x, b)
Arguments
x | 
 [cube] array of dimension   | 
b | 
 [numeric] scale parameter, strictly positive  | 
Value
the value of the log objective function
Least square cross validation criterion for Wishart kernel
Description
Finite sample h-block leave-one-out approximation to the least square criterion, omitting constant term.
Usage
lscv_kern_Wishart(x, b, h = 1L)
Arguments
x | 
 [cube] array of dimension   | 
b | 
 [numeric] scale parameter, strictly positive  | 
h | 
 separation vector; only pairs that are   | 
Value
a vector of length two containing the log of the summands
Least square cross validation criterion for log symmetric matrix normal kernel
Description
Finite sample h-block leave-one-out approximation to the least
square criterion, omitting constant term. Only pairs that are |i-j| \leq h apart are considered.
Usage
lscv_kern_smlnorm(x, b, h = 1L)
Arguments
x | 
 [cube] array of dimension   | 
b | 
 [numeric] scale parameter, strictly positive  | 
h | 
 [int] integer indicating the separation lag  | 
Value
a vector of length two containing the log of the summands
Log of mean with precision
Description
Log of mean with precision
Usage
meanlog(x)
Arguments
x | 
 vector of log components to add  | 
Value
double with the log mean of elements
Multivariate gamma function
Description
Given a vector of points x and an order p, compute the multivariate gamma function. The function is defined as
\gamma_p(x) = \pi^{p(p-1)/4}\prod_{i=1}^p \Gamma\{x + (1-i)/2\}.
Usage
mgamma(x, p, log = FALSE)
Arguments
x | 
 [vector] of points at which to evaluate the function  | 
p | 
 [int] dimension of the multivariate gamma function, strictly positive.  | 
log | 
 [logical] if   | 
Value
a matrix with one column of the same length as x
Random generation from first-order vector autoregressive model
Description
Given a matrix of coefficients M and a covariance matrix Sigma,
simulate K vectors from a first-order autoregressive process.
Usage
rVAR(n, M, Sigma, K = 1L, order = 1L, burnin = 25L)
Arguments
n | 
 sample size  | 
M | 
 matrix of autoregressive coefficients  | 
Sigma | 
 covariance matrix  | 
K | 
 integer, degrees of freedom  | 
order | 
 order of autoregressive process, only   | 
burnin | 
 number of iterations discarded  | 
Value
a list of length n containing matrices of size K by d
Examples
M <- matrix(c(0.3, -0.3, -0.3, 0.3), nrow = 2)
Sigma <- matrix(c(1, 0.5, 0.5, 1), nrow = 2)
rVAR(n = 100, M = M, Sigma = Sigma, K = 10)
Random matrix generation from first-order autoregressive Wishart process
Description
Given a matrix of coefficients M and a covariance matrix Sigma,
simulate n random matrices from a first-order autoregressive Wishart process
by simulating from cross-products of vector autoregressions
Usage
rWAR(n, M, Sigma, K = 1L, order = 1L, burnin = 25L)
Arguments
n | 
 sample size  | 
M | 
 matrix of autoregressive coefficients  | 
Sigma | 
 covariance matrix  | 
K | 
 integer, degrees of freedom  | 
order | 
 order of autoregressive process, only   | 
burnin | 
 number of iterations discarded  | 
Value
an array of size d by d by n containing the samples
References
C. Gourieroux, J. Jasiak, and R. Sufana (2009). The Wishart Autoregressive process of multivariate stochastic volatility, Journal of Econometrics, 150(2), 167-181, <doi:10.1016/j.jeconom.2008.12.016>.
Examples
M <- matrix(c(0.3, -0.3, -0.3, 0.3), nrow = 2)
Sigma <- matrix(c(1, 0.5, 0.5, 1), nrow = 2)
rWAR(n = 10, M = M, Sigma = Sigma, K = 5)
Random matrix generation from Wishart distribution
Description
Random matrix generation from Wishart distribution
Usage
rWishart(n, df, S)
Arguments
n | 
 [integer] sample size  | 
df | 
 [double] degrees of freedom, positive  | 
S | 
 [matrix] a   | 
Value
an array of dimension d by d by n containing the samples
Realized variance of Amazon and SPY
Description
Intraday realized covariances of the returns between the Amazon stock (rvarAMZN) and the SPDR S&P 500 ETF (rvarSPY) using five minutes data, for the period of September 13th, 2023 to September 12, 2024.
Usage
realvar
Format
A 2 by 2 by 250 array
Source
Anne MacKay
Examples
data(realvar, package = "ksm")
bopt <- bandwidth_optim(
 x = realvar,
 criterion = "lscv",
 kernel = "Wishart",
 h = 4L
 )
Random matrix generation from the inverse Wishart distribution
Description
Random matrix generation from the inverse Wishart distribution
Usage
rinvWishart(n, df, S)
Arguments
n | 
 [integer] sample size  | 
df | 
 [double] degrees of freedom, positive  | 
S | 
 [matrix] a   | 
Value
an array of dimension d by d by n containing the samples
Random matrix generation from matrix beta type II distribution
Description
This function only supports the case of diagonal matrices
Usage
rmbeta2(n, d, shape1, shape2)
Arguments
n | 
 sample size  | 
d | 
 dimension of the matrix  | 
shape1 | 
 positive shape parameter, strictly larger than   | 
shape2 | 
 positive shape parameter, strictly larger than   | 
Value
a cube of dimension d by d by n
Random vector generation from the multivariate normal distribution
Description
Sampler derived using the eigendecomposition of the covariance
matrix vcov.
Usage
rmnorm(n, mean, vcov)
Arguments
n | 
 sample size  | 
mean | 
 mean vector of length   | 
vcov | 
 a square positive definite covariance matrix, of the same dimension as   | 
Value
an n by d matrix of samples
Examples
rmnorm(n = 10, mean = c(0, 2), vcov = diag(2))
Rotation matrix for 2 dimensional problems
Description
Rotation matrix for 2 dimensional problems
Usage
rotation2d(par)
Arguments
par | 
 double for angle in   | 
Value
a 2 by 2 rotation matrix
Rotation matrix for 3 dimensional problems
Description
Rotation matrix for 3 dimensional problems
Usage
rotation3d(par)
Arguments
par | 
 vector of length 3 containing elements   | 
Value
a 3 by 3 rotation matrix
Rotation matrix with scaling for Monte Carlo integration
Description
Rotation matrix with scaling for Monte Carlo integration
Usage
rotation_scaling(ang, scale)
Arguments
ang | 
 vector of length 1 containing    | 
scale | 
 vector of length 2 (  | 
Value
a 2 by 2, or 3 by 3 scaling matrix, depending on inputs
Target densities for simulation study
Description
Target densities for simulation study
Usage
simu_fdens(x, model, d)
Arguments
x | 
 cube of dimension   | 
model | 
 integer between 1 and 6 indicating the simulation scenario  | 
d | 
 dimension of the problem, an integer between 2 and 10  | 
Value
a vector of length n containing the density
Integrated squared error via Monte Carlo
Description
Given a target density and a kernel estimator, evaluate the integrated squared error by Monte Carlo integration by simulating from uniform variates on the hypercube.
Usage
simu_ise_montecarlo(x, b, kernel, model, B = 10000L, delta = 0.001)
Arguments
x | 
 a cube of dimension   | 
b | 
 positive double, bandwidth parameter  | 
model | 
 integer between 1 and 6 indicating the simulation scenario  | 
B | 
 number of Monte Carlo replications, default to 10K  | 
delta | 
 double less than 1; the integrals on   | 
Value
a vector of length 2 containing the mean and the standard deviation of the estimator.
Kullback-Leibler divergence via Monte Carlo
Description
Given a target density and a kernel estimator, evaluate the Kullback-Leibler divergence by Monte Carlo integration by simulating draws from the corresponding model.
Usage
simu_kldiv(x, b, kernel, model, B = 10000L, nrep = 10L)
Arguments
x | 
 a cube of dimension   | 
b | 
 positive double, bandwidth parameter  | 
model | 
 integer between 1 and 6 indicating the simulation scenario  | 
B | 
 number of Monte Carlo replications, default to 10K  | 
Value
a vector of length 2 containing the mean and the standard deviation of the estimator.
Target densities for simulation study
Description
Target densities for simulation study
Usage
simu_rdens(n, model, d)
Arguments
n | 
 sample size  | 
model | 
 integer between 1 and 6 indicating the simulation scenario  | 
d | 
 dimension of the matrix, an integer between 2 and 10  | 
Value
a cube of dimension d by d by n containing the sample matrices
Log of sum with precision
Description
Log of sum with precision
Usage
sumlog(x)
Arguments
x | 
 vector of log components to add  | 
Value
double with the log sum of elements
Signed sum with precision
Description
Given a vector of signs and log arguments, return their sum with precision avoiding numerical underflow assuming that the sum is strictly positive.
Usage
sumsignedlog(x, sgn)
Arguments
x | 
 vector of log components  | 
sgn | 
 sign of the operator  | 
Value
log sum of elements
Symmetrize matrix
Description
Given an input matrix, symmetrize by taking average of lower and upper triangular components as A + A^\top.
Usage
symmetrize(A)
Arguments
A | 
 square matrix  | 
Value
symmetrized version of A