2014-10-16 127 views
2

我想從我的數據集的每一列中刪除異常值...通過搜索網絡,似乎Hampel標識符應該是我的問題的一個很好的解決方案,它具有異常值檢測技術:[median – t * MAD, median + t * MAD]去除異常值(outlierMAD命令在pracma包中)

與指令提供:http://exploringdatablog.blogspot.com/2012/01/moving-window-filters-and-pracma.html我想用「outlierMAD」命令來完成我的任務:

outlierMAD <- function (x, k){ 
    n <- length(x) 
    y <- x 
    ind <- c() 
    L <- 1.4826 
    t0 <- 3 
    for (i in (k + 1):(n - k)) { 
    x0 <- median(x[(i - k):(i + k)]) 
    S0 <- L * median(abs(x[(i - k):(i + k)] - x0)) 
    if (abs(x[i] - x0) > t0 * S0) { 
     y[i] <- x0 
     ind <- c(ind, i) 
    } 
    } 
    list(y = y, ind = ind) 
} 

但我得到一個錯誤,當我嘗試:

Error in if (abs(x[i] - x0) > t0 * S0) { : 
missing value where TRUE/FALSE needed 

燦任何人都可以幫助我?我怎樣才能避免我的數據中有NAs?

我的樣本數據的鏈接,可以發現: https://drive.google.com/file/d/0B86_a8ltyoL3NHNaeWk3d1QyQms/view?usp=sharing

+0

複製[此](HTTP的:/ /stats.stackexchange.com/questions/121071/can-we-use-leave-one-out-mean-and-standard-deviation-to-reveal-the-outliers/121075?noredirect=1#comment230920_121075)。 – user189035 2014-10-23 07:57:49

回答

1

的ABS(X [I] - x 0)的邏輯值> T0 * S0應該是真或假。如果任何變量爲NA或被視爲非數字,則可能會發生錯誤。 在NA存在的情況下,如果na.rm = FALSE,則中位數可以產生NA而不是中位數值。對於中位數設置na.rm = TRUE將修復X0和S0,但如果x [I] = NA本身,則對上面的邏輯表達式無幫助。 嘗試檢查您的NA或其他非數字值的數據。希望這可以幫助。

0

我使用'pracma'包的hampel函數得到了同樣的錯誤。問題是由於我的時間序列少於5個觀察結果而引起的。檢查你的足夠長。

0

需要減小K值或者保持一個條件,如果nrow(DF)> 5然後應用hample否則跳過hample並繼續平均值爲那些5套