Duy*_*Bui 10 r outliers multivariate-testing mahalanobis
我一直在寻找使用R来识别多变量异常值的最佳方法,但我认为我还没有找到任何可信的方法.
我们可以将虹膜数据作为示例,因为我的数据还包含多个字段
data(iris)
df <- iris[, 1:4] #only taking the four numeric fields
Run Code Online (Sandbox Code Playgroud)
首先,我正在使用距离图书馆MVN的马哈拉诺比斯距离
library(MVN)
result <- mvOutlier(df, qqplot = TRUE, method = "quan") #non-adjusted
result <- mvOutlier(df, qqplot = TRUE, method = "adj.quan") #adjusted Mahalonobis distance
Run Code Online (Sandbox Code Playgroud)
两者都产生了大量的异常值(非调整的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)
Run Code Online (Sandbox Code Playgroud)
为此,我们可以设置概率,但我不认为它可以取代多变量异常值检测.
我试过的其他一些方法
我会给你留下这两个链接,第一个是关于多元异常值检测的不同方法的论文,而第二个是研究如何在 R 中实现这些方法。
库克距离是查看数据点影响的有效方法,因此有助于检测外围点。马哈拉诺比斯距离也经常使用。
对于您的测试示例,虹膜数据集没有用。它用于分类问题,因为它显然是可分离的。您排除 50 个数据点将摆脱整个物种。
多元数据中的异常值检测-
http://www.m-hikari.com/ams/ams-2015/ams-45-48-2015/13manojAMS45-48-2015-96.pdf
R实现
http://r-statistics.co/Outlier-Treatment-With-R.html