2014-05-21 44 views
0

我有一個數據幀(DF),如下所示:R:迭代離羣檢測

V V1 V2 V3 
1 A B 32 
1 A C 33 
1 A E 43 
1 A F 22 
1 A T 53 
1 A N 54 
1 C T 44 
1 C G 11 
1 C N 31 
1 C D 53 
1 C U 75 
1 A T 53 
1 A N 54 
2 C T 42 
2 C G 14 
2 C N 35 
2 C D 23 
2 C U 56 

什麼想要做我得到爲(V,V1)的每一種組合的異常值,這是爲了便於用我擁有的代碼來實現。

d <- as.data.table(df) 

# Add a column to keep track of row numbers 
d[, c('row'):= list(seq_len(nrow(d)))] 

# For each group (combination of V and V1), perform the outlier test 
outliers <- d[, chisq.out.test(V3), list(V, V1)] 

的主要問題是,這種函數將返回的每個組合(V,V1)只是一個異常值與p值。我需要的基本上是所有異常值以及它們的p值都是異常值(V,V1),換句話說,所有候選值都是V2,其p值是異常值(V,V1)。

任何想法如何改變我的代碼來做到這一點?

回答

1

我認爲這可能有效。 dropout函數將執行迭代循環以測試異常值。對於你傳入的每個元素,如果元素不是離羣值,它將返回1,否則返回異常值測試的p值< .05。

library(outliers) 
dropout<-function(x) { 
    if(length(x)<2) return (1) 
    vals <- rep.int(1, length(x)) 
    r <- chisq.out.test(x) 
    while (r$p.value<.05 & sum(vals==1)>2) { 
     if (grepl("lowest", r$alternative)) { 
      d <- which.min(ifelse(vals==1,x, NA)) 
     } else { 
      d <- which.max(ifelse(vals==1, x, NA)) 
     } 
     vals[d] <- r$p.value 
     r <- chisq.out.test(x[vals==1]) 
    } 
    vals 
} 

有了這一助手功能,我們現在可以把它應用到每一個由VV1定義的子組。要做到這一點,我們使用ave函數。

with(dd, ave(V3, V1, V2, FUN = dropout)) 

看來您的樣本數據沒有異常值在任何給定的chisq.out.test定義異常值的子組。

肯定這個迭代過程沒有統計意義,因爲在一般情況下休息的問題,肯定與多個測試問題。不過,這個討論是針對https://stats.stackexchange.com/,這裏我們只關注代碼。

+0

感謝您的回答,我更新了該函數,以便它可以返回離羣值分數以及V,V1。但最後,我怎樣才能得到每個異常值的相應行號?所以我可以得到哪個V2是每個V,V1的異常值。 我稱之爲功能如下: outlier < - d [,dropout(V3),list(V,V1)] outlier < - merge(outliers,d [,list(max.ind = row [which .max(V3)]),list(V,V1)],by = c('V','V1'))' 但是這隻會給我最大的行索引,我希望每個異常行索引。 – ifreak

+0

@ifreak'ave'按照發現它們的順序返回值。因此,您可以將其添加回data.frame,'dd $ do < - with(dd,ave(V3,V1,V2,FUN = dropout))'。 – MrFlick

+0

現在即時通訊中有一個奇怪的錯誤('缺少值,其中TRUE/FALSE需要')。你有什麼想法爲什麼? – ifreak