2012-06-11 4 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

Как определяется 'outlier'? Это не база R, AFAIK. – Andrie

+0

Его в пакете выбросов. Отъезд? Outlier – rockswap

+0

okay. Я добавил это. – rockswap

ответ

1

Здесь я раскрываю свой комментарий выше в ответ.

В вашем примере m [40] = m [90] = m [67] = 150 являются связями. Если вы попытаетесь использовать m [40] = 150; м [90] = 200; м [67] = 250; Я думаю, вы обнаружите, что только m [67] идентифицируется как выброс. Возможно, спросите на сайте статистики сестры, Cross Validated, для лучшего определения outlier с вашим набором данных. Тогда, возможно, кто-то здесь может помочь вам запрограммировать код R для этого определения.

Ниже приведен код R для простого определения outlier: outlier - любое наблюдение со значением> 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. Их много.

Метод outlier определяет outlier как ** объект (ы) с наибольшим отличием от среднего. Это довольно слабое определение, поскольку оно обеспечивает количество выбросов, равное 1 (если не привязано).

Попробуйте этот набор данных:

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

На этом наборе данных, он должен удалить все, кроме 0!

Теперь измените это:

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

Теперь только один элемент будет удален, хотя differece находится на грани точности и едва значительным.

Возможно, попробуйте более умный метод обнаружения выбросов.

Смежные вопросы