Necesito calcular la distancia de Mahalanobis muestral en R entre cada par de observaciones en un n×p matriz de covariables. Necesito una solución que sea eficiente, es decir, sólo n(n−1)/2 se calculan las distancias, y preferiblemente se implementan en C/RCpp/Fortran, etc. Supongo que Σ , la matriz de covarianza de la población, es desconocida y utilizar la matriz de covarianza de la muestra en su lugar.
Me interesa especialmente esta cuestión porque no parece existir un método "consensuado" para calcular por pares distancias de Mahalanobis en R, es decir, no está implementado en el dist
ni en la función cluster::daisy
función. En mahalanobis
no calcula las distancias entre pares sin trabajo adicional por parte del programador.
Esto ya se preguntó aquí Distancia de Mahalanobis por pares en R pero las soluciones parecen incorrectas.
He aquí una solución correcta pero terriblemente ineficaz (ya que n×n se calculan las distancias):
set.seed(0)
x0 <- MASS::mvrnorm(33,1:10,diag(c(seq(1,1/2,l=10)),10))
dM = as.dist(apply(x0, 1, function(i) mahalanobis(x0, i, cov = cov(x0))))
Esto es bastante fácil de codificar yo mismo en C, pero siento que algo tan básico debería tener una solución preexistente. ¿Existe alguna?
Hay otras soluciones que se quedan cortas: HDMD::pairwise.mahalanobis()
calcula n×n distancias, cuando sólo n(n−1)/2 se requieren distancias únicas. compositions::MahalanobisDist()
parece prometedor, pero no quiero que mi función provenga de un paquete que dependa de rgl
lo que limita gravemente la capacidad de los demás para ejecutar mi código. A menos que esta implementación sea perfecta, prefiero escribir la mía propia. ¿Alguien tiene experiencia con esta función?