2012-06-11 103 views
0

我正在處理大量的由異常值組成的數據。該代碼適用於大多數數據集,但幾乎不適用。幾個異常值沒有刪除

該樣本數據:

set.seed(100) 
m=rnorm(200) 
m[1]=100 #inserting outlier 
m[2]=50 

我的代碼是:

library(outliers) 
lg=outlier(m, logical=TRUE) 
for(i in 1:length(lg)){ 
if(lg[i]==c("TRUE")){ 
m[i]=NA }} 

這將替換離羣值來港定居。 現在在這種情況下,100個被移除,但50個未被移除。 我的數據集也在發生同樣的事情。我無法弄清楚爲什麼。 我希望在此獲得幫助。

謝謝您的閱讀。

+1

如何定義「異常值」?它不是基地R,AFAIK。 – Andrie

+0

它在異常值包。 退房嗎?離羣值 – rockswap

+0

沒問題。我已經補充說。 – rockswap

回答

1

在這裏,我將我的評論擴展到一個答案。

在你的例子中,m [40] = m [90] = m [67] = 150是關係。如果你嘗試使用m [40] = 150; m [90] = 200; m [67] = 250;我想你會發現只有m [67]被確定爲異常值。也許可以在姊妹統計站點「交叉驗證」(Cross Validated)上詢問數據集中異常值的最佳定義。那麼也許這裏有人可以幫助你爲該定義編寫R代碼。

以下是R代碼,用於簡單定義異常值:異常值是值大於50的任何觀察值。我不建議您使用該定義。事實上,請不要。我在此僅用於說明。下面的代碼用NA來代替所有異常值。

set.seed(100) 
m=rnorm(200) 
m[10]=100 
m[40]=150 
m[90]=200 
m[67]=250 
m 

outlier <- rep(0,length(m)) 
outlier[m>50]=NA 
outlier 

m[is.na(outlier)]=NA 
m 
2

這取決於你對異常值的定義。有很多。

outlier方法將離羣值定義爲**與平均值具有最大差異的對象。這是一個相當薄弱的定義,因爲它強制異常數爲1(除非並列)。

試試這個數據集:

0 .1 .1 .1 -.1 -.1 -.1 

在這組數據,它應該刪除所有,但0

現在更改爲:

0 .1 .1 .1 -.1 -.1 -.100000001 

現在只有一個元素將被移除,雖然型差分是在精密的容限和勉強顯著。

也許嘗試更聰明的異常值檢測方法。