我們可以使用遺漏均值和標準差來揭示異常值嗎?
假設我有正態分佈的數據。對於數據的每個元素,我想檢查它與平均值相差多少 SD。數據中可能存在異常值(可能只有一個,但也可能是兩個或三個),但這個異常值基本上是我正在尋找的。從平均值和 SD 的計算中暫時排除我當前正在查看的元素是否有意義?我的想法是,如果它接近平均值,它不會有任何影響。如果它是一個異常值,它可能會使均值和 SD 的計算產生偏差,並降低它被檢測到的概率。我不是統計學家,所以任何幫助表示讚賞!
這可能看起來違反直覺,但使用您描述的方法沒有意義(用您的措辭,我寧願寫“可能導致與預期的結果大不相同”)並且永遠不應該這樣做:它不起作用是必然的,此外,還有一種更簡單、更安全、更成熟的替代方案,無需額外費用。
首先,確實,如果存在單個異常值,那麼您最終會使用您建議的過程找到它。但是,一般來說(當數據中可能有多個異常值時),您建議的算法會完全失效,這可能會導致您拒絕將好的數據點作為異常值或將異常值保留為好的數據點具有潛在的災難性後果。
下面,我給出了一個簡單的數字示例,其中您提出的規則被打破,然後我提出了一個更安全和更成熟的替代方案,但在此之前,我將解釋 a)您提出的方法有什麼問題和 b)通常首選的方法替代它是。
從本質上講,您不能使用觀測值與數據的遺漏均值和標準差的距離來可靠地檢測異常值,因為您使用的估計值(遺漏均值和標準差)仍然容易被拉向剩餘的異常值:這稱為掩蔽效應。
簡而言之,可靠檢測異常值的一種簡單方法是使用您建議的一般想法(與位置和規模估計的距離),但用穩健的估計量替換您使用的估計量(保留一個均值,sd) - 即估計設計得更不容易受到異常值的影響。
考慮這個例子,我將 3 個異常值添加到從 Normal 0,1 中提取的 47 個真實觀察值中:
n <- 50 set.seed(123) # for reproducibility x <- round(rnorm(n,0,1), 1) x[1] <- x[1]+1000 x[2] <- x[2]+10 x[3] <- x[3]+10
下面的代碼根據遺漏平均值和標準差(例如您建議的方法)計算異常指數。
out_1 <- rep(NA,n) for(i in 1:n){ out_1[i] <- abs( x[i]-mean(x[-i]) )/sd(x[-i]) }
此代碼生成您在下面看到的圖。
plot(x, out_1, ylim=c(0,1), xlim=c(-3,20)) points(x[1:3], out_1[1:3], col="red", pch=16)
圖 1 描繪了作為觀察值函數的離群指數值(離群值最遠的值超出了該圖的範圍,但其他兩個顯示為紅點)。如您所見,除了最極端的以外,按照您的建議構建的離群指數將無法揭示離群值:實際上,第二個和第三個(較溫和的)離群值現在甚至(在離群指數上)的值都小於所有離群值真正的觀察!…根據您建議的方法,將這兩個極端異常值保留在一組真正的觀察中,導致您使用剩餘的 49 個觀察,就好像它們來自同一個同質過程一樣,給您一個最終的根據這 49 個 0.45 和 2.32 的數據點估計平均值和標準差,這對樣本的任何一部分都進行了非常糟糕的描述!
將此結果與您使用基於中值的異常值檢測規則獲得的結果進行對比寫入數據向量是
在哪裡是條目的中位數(所有這些,不排除)和是它們的中值絕對偏差乘以 1.4826(我參考鏈接的 wiki 文章來解釋這個數字的來源,因為它與這裡的主要問題正交)。
在 R 中,第二個異常指數可以計算為:
out_2 <- abs( x-median(x) )/mad(x)
並使用以下方法繪製(如前所述):
plot(x, out_2, ylim=c(0,15), xlim=c(-3,20)) points(x[1:3], out_2[1:3], col="red", pch=16)
圖 2 繪製了同一數據集的這種替代偏遠指數的值。如您所見,現在所有三個異常值都清楚地顯示出來了。此外,這種異常值檢測規則具有一些既定的統計特性。除其他外,這導致了可用的截止規則。例如,如果可以假設數據的真實部分是從具有有限二階矩的對稱分佈中提取的,則可以拒絕所有滿足以下條件的數據點
作為異常值。在上面的示例中,應用此規則將導致您正確標記觀測值 1,2 和 3。拒絕這些,剩余觀測值的均值和標準差分別為 0.021 和 0.93,更好地描述了樣本的真實部分!