在R中進行基于穩健馬氏距離的異常檢驗
前言
??我們研究的數據中經常包含著一些不同尋常的樣本,這稱之為異常值(Outlier)。這些異常值會極大的影響回歸或分類的效果。異常值產生的原因有很多,其中可能是人為錯誤、數據測量誤差,或者是實際確實存在這樣的異常。為了使模型能夠反映大部分數據的規律,所以在數據預處理階段要進行異常值檢測,為下一步分析奠定基礎。還有一類情況是,當研究人員希望發現不平凡的事物時,異常值檢測本身就是分析的首要目的。例如在信用卡欺詐、計算機入侵檢測等問題中。此時由于樣本的不平衡性,導致一般的分類方法無法使用,必須轉而考慮異常檢測方法。
??一種常用的異常檢驗思路是觀察各樣本點到樣本中心的距離。如果某些樣本點的距離太大,就可以判斷是異常值。這里距離的度量一般使用馬氏距離(Mahalanobis Distance)。因為馬氏距離不受量綱的影響,而且在多元條件下,馬氏距離還考慮了變量之間的相關性,這使得它優于歐氏距離。
??但是傳統的馬氏距離檢測方法是不穩定的,因為個別異常值會把均值向量和協方差矩陣向自己方向吸引,這樣算出來的樣本馬氏距離起不了檢測異常值的所用。所以首先要利用迭代的思想構造一個穩健的均值和協方差矩陣估計量,然后計算穩健馬氏距離(Robust Mahalanobis Distance)。這樣使得異常值能夠正確地被識別出來。
??在mvoutlier包中提供了基于穩健馬氏距離的異常值檢驗方法。我們首先構造一個二維變量的人工數據,其中80個樣本是標準正態分布,另一小撮別有用心的樣本是均值為5,標準差為1的觀測值。我們首先使用uni.plot函數在一維空間中觀察這個數據。
library(mvoutlier)set.seed(1234)x <- cbind(rnorm(80), rnorm(80))y <- cbind(rnorm(10, 5, 1), rnorm(10, 5, 1))z <- rbind(x,y)# 一維數據的異常檢驗res1 <- uni.plot(z)# 返回異常值的編號which(res1$outliers==T)################################> library(mvoutlier)> set.seed(1234)> x <- cbind(rnorm(80), rnorm(80))> y <- cbind(rnorm(10, 5, 1), rnorm(10, 5, 1))> z <- rbind(x,y)> # 一維數據的異常檢驗> res1 <- uni.plot(z)> # 返回異常值的編號> which(res1$outliers==T)[1] 20 62 81 82 83 84 85 86 87 88 89 90
??上圖中紅色點表示疑似異常值,因為它偏離均值太遠。更多時候我們會處理多元異常檢測問題,此時用aq.plot函數來實行基于穩健馬氏距離的異常值檢驗方法。下圖中左上角圖形為原始數據,右上角圖形的X軸為各樣本的穩健馬氏距離排序,Y軸為距離的經驗分布,紅色曲線為卡方分布,藍色垂線表示閥值,在閥值右側的樣本判斷為異常值。左下和右下兩張圖均是用不同顏色來表示異常值,只是閥值略有不同。可以觀察到那一小撮異常值被正確的判斷出來,但也有兩個正常值被誤判為異常值,此時需要調整參數。
# 基于穩健馬氏距離的多元異常值檢驗res2 <-aq.plot(z)# 返回異常值的編號which(res2$outliers==T)################################> res2 <-aq.plot(z)> which(res2$outliers==T)[1] 20 62 81 82 83 84 85 86 87 88 89 90
??如果數據的維數過高,例如基因數據那樣幾千個變量,數據之間變得稀疏,從而使得距離不再有很大意義。此時可以融合主成分降維的思路來進行異常值檢驗。mvoutlier包中提供了pcout函數來進行高維空間異常檢驗。下面是以swiss數據集為例來判斷異常值。
# 在高維空間中的異常值檢驗data(swiss)res3 <- pcout(swiss)# 返回異常值的編號which(res3$wfinal01==0)################################> # 在高維空間中的異常值檢驗> data(swiss)> res3 <- pcout(swiss)> # 返回異常值的編號> which(res3$wfinal01==0)Delemont Franches-Mnt Porrentruy Broye Glane 2 3 6 7 8 Gruyere Sarine Veveyse La Vallee Conthey 9 10 11 19 31 Entremont Herens Martigwy Monthey St Maurice 32 33 34 35 36 Sierre Sion V. De Geneve 37 38 45
參考資料
R語言:處理異常值1
R語言:處理異常值2