Mahalonobis distance in R, error: system is computationally singular
distance, mahalanobis, r, similarity
Solution
The Mahalanobis distance requires you to calculate the inverse of the covariance matrix. The function `mahalanobis` internally uses `solve` which is a numerical way to calculate the inverse. Unfortunately, if some of the numbers used in the inverse calculation are very small, it assumes that they are zero, leading to the assumption that it is a singular matrix. This is why it specifies that they are computationally singular, because the matrix might not be singular given a different tolerance.
The solution is to set the tolerance for when it assumes that they are zero. Fortunately, `mahalanobis` allows you to pass this parameter (`tol`) to `solve`:
mahalanobis(dat,center=centroid,cov=cov(dat),tol=1e-20)
# [1] 24.215494 28.394913 6.984101 28.004975 11.095357 14.401967 ...
Problem
I'd like to calculate multivariate distance from a set of points to the centroid of those points. Mahalanobis distance seems to be suited for this. However, I get an error (see below). Can anyone tell me why I am getting this error, and if there is a way to work around it? If you download the coordinate data and the associated environmental data, you can run the following code. ``` require(maptools) occ <- readShapeSpatial('occurrences.shp') load('envDat.Rdata') #standardize the data to scale the variables dat <- as.matrix(scale(dat)) centroid <- dat[1547,] #let's assume this is the centroid in this case #Calculate multivariate distance from all points to centroid mahalanobis(dat,center=centroid,cov=cov(dat)) Error in solve.default(cov, ...) : system is computationally singular: reciprocal condition number = 9.50116e-19 ```