#' Estimated bandwidth for CVE.
#'
#' Estimates a propper bandwidth \code{h} according
#' \deqn{%
#' h = \chi_{p-q}^{-1}\left(\frac{nObs - 1}{n-1}\right)\frac{2 tr(\Sigma)}{p}}{%
#' h = qchisq( (nObs - 1)/(n - 1), p - q ) 2 tr(Sigma) / p}
#'
#' @param X data matrix of dimension (n x p) with n data points X_i of dimension
#'  q. Therefor each row represents a datapoint of dimension p.
#' @param k Guess for rank(B).
#' @param nObs Ether numeric of a function. If specified as numeric value
#'  its used in the computation of the bandwidth directly. If its a function
#'  `nObs` is evaluated as \code{nObs(nrow(x))}. The default behaviou if not
#'  supplied at all is to use \code{nObs <- nrow(x)^0.5}.
#'
#' @seealso [\code{\link{qchisq}}]
#' @export
estimate.bandwidth <- function(X, k, nObs) {
    n <- nrow(X)
    p <- ncol(X)

    X_centered <- scale(X, center=TRUE, scale=FALSE)
    Sigma <- (1 / n) * t(X_centered) %*% X_centered

    quantil <- qchisq((nObs - 1) / (n - 1), k)
    return(2 * quantil * sum(diag(Sigma)) / p)
}
