I have been searching everywhere for the best method to identify the multivariate outliers using R but I don't think I have found any believable approach yet.
We can take the iris data as an example as my data also contains multiple fields
data(iris)
df <- iris[, 1:4] #only taking the four numeric fields
Firstly, I am using Mahalanobis distance from the library MVN
library(MVN)
result <- mvOutlier(df, qqplot = TRUE, method = "quan") #non-adjusted
result <- mvOutlier(df, qqplot = TRUE, method = "adj.quan") #adjusted Mahalonobis distance
Both resulted in a large number of outliers (50 out of 150 for non-adjusted and 49/150 for adjusted), which I think needs more refinement. I unfortunately can't seem to find a variable in the mvOutlier method to set the threshold (says increasing the probability of a point being an outlier, so that we have a smaller number)
Secondly, I used outliers library. This is to find univariate outliers. So that, my plan is to find the outliers on each dimension of the data and those points being outliers on all the dimensions are regarded as outliers of the dataset.
library(outliers)
result <- scores(df, type="t", prob=0.95) #t test, probability is 0.95
result <- subset(result, result$Sepal.Length == T & result$Sepal.Width == T & result$Petal.Length == T & result$Petal.Width == T)
For this we can set the probability, but I don't think it can replace the multivariate outlier detection.
Some other approaches that I tried
- library(mvoutlier): this only shows the plot. It is hard to automatically find outliers. And I don't know how to add the probability into this
- cook's distance (link): a man said that he used cook's distance but I don't think there is any strong academic proof to prove that this is ok.