我一直在到处寻找使用 R 识别多元异常值的最佳方法,但我认为我还没有找到任何可信的方法。
我们可以以虹膜数据为例,因为我的数据也包含多个字段
data(iris)
df <- iris[, 1:4] #only taking the four numeric fields
首先,我使用与图书馆 MVN 的Mahalanobis 距离
library(MVN)
result <- mvOutlier(df, qqplot = TRUE, method = "quan") #non-adjusted
result <- mvOutlier(df, qqplot = TRUE, method = "adj.quan") #adjusted Mahalonobis distance
两者都导致了大量的异常值(150 个中的 50 个为未调整的,49/150 个为调整的),我认为这需要更多改进。不幸的是,我似乎无法在 mvOutlier 方法中找到一个变量来设置阈值(说增加一个点成为异常值的概率,以便我们有一个较小的数字)
其次,我使用了异常值库。这是为了找到单变量异常值。所以,我的计划是在数据的每个维度上找到异常值,并且那些在所有维度上都是异常值的点被视为数据集的异常值。
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)
为此我们可以设置概率,但我认为它不能代替多元异常值检测。
我尝试过的其他一些方法
- 库(mvoutlier):这仅显示情节。很难自动找到异常值。而且我不知道如何将概率添加到这个
- 厨师距离(链接):一个人说他使用了厨师距离,但我认为没有任何强有力的学术证据证明这是可以的。