R: очистка выбросов для каждого столбца в кадре данных с использованием квантилей 0,05 и 0,95.

Я R-новичок. Я хочу сделать некоторую очистку от выбросов и общее масштабирование от 0 до 1, прежде чем помещать образец в случайный лес.

g<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)

Если я сделаю простое масштабирование от 0 до 1, результат будет:

> round((g - min(g))/abs(max(g) - min(g)),1)

 [1] 1.0 0.1 0.0 0.1 0.0 0.0 0.0 0.1 0.1 0.1 0.0 0.1 0.0 0.1 0.0 0.1 0.0

Итак, моя идея состоит в том, чтобы заменить значения каждого столбца, превышающие квантиль 0,95, на следующее значение, меньшее квантиля 0,95, и то же самое для квантиля 0,05.

Таким образом, предварительно масштабированный результат будет:

g<-c(**70**,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,**40**)

и масштабируется:

> round((g - min(g))/abs(max(g) - min(g)),1)

 [1] 1.0 0.7 0.3 0.7 0.3 0.0 0.3 0.7 1.0 0.7 0.0 1.0 0.3 0.7 0.3 1.0 0.0

Мне нужна эта формула для всего фрейма данных, поэтому функциональная реализация в R должна быть примерно такой:

> apply(c, 2, function(x) x[x`<quantile(x, 0.95)]`<-max(x[x, ... max without the quantile(x, 0.95))

Кто-нибудь может помочь?

Сказанное рядом: если существует функция, которая выполняет эту работу напрямую, сообщите мне об этом. Я уже проверил cut и cut2. cut терпит неудачу из-за неуникальных разрывов; cut2 будет работать, но возвращает только строковые значения или среднее значение, и мне нужен числовой вектор от 0 до 1.

на пробу:

a<-c(100,6,5,6,5,4,5,6,7,6,4,7,5,6,5,7,1)

b<-c(1000,60,50,60,50,40,50,60,70,60,40,70,50,60,50,70,10)

c<-cbind(a,b)

c<-as.data.frame(c)

С уважением и благодарностью за помощь,

Райнер


person Rainer    schedule 12.03.2011    source источник
comment
В CRAN есть несколько пакетов, которые могут удовлетворить ваши потребности: outliers, mvoutliers, heavy, extremevalues... просто перейдите к предоставленным пакетам и найдите подходящий.   -  person aL3xa    schedule 12.03.2011
comment
Спасибо за этот совет, я посмотрю на эти пакеты! С уважением, Райнер   -  person Rainer    schedule 13.03.2011


Ответы (2)


Пожалуйста, не делайте этого. Это не лучшая стратегия для работы с выбросами, особенно потому, что маловероятно, что 10% ваших данных являются выбросами!

person hadley    schedule 12.03.2011
comment
привет, Хэдли, пример фрейма данных был просто примером. Тем не менее: почему вы считаете эту стратегию плохой и какую лучшую стратегию вы бы предпочли? - person Rainer; 13.03.2011
comment
Ну... вы всегда можете использовать правило блочной диаграммы, чтобы отфильтровать выбросы. Обратите внимание на экран, а не удаляйте. По словам Джона Тьюки, вы должны ожидать выбросы в своих данных, но вы (почти) никогда не должны их удалять. Взгляните на это сообщение: goo.gl/Ywbo8 - person aL3xa; 13.03.2011
comment
Выбросы @Rainer зависят от модели - отбрасывать экстремальные точки данных сейчас просто извращенно - что, если после подбора модели большинство этих выбросов были бы как раз в крайних точках условного распределения y с учетом ковариат в модели? В качестве альтернативы используйте метод, устойчивый к выбросам. Наконец, если бросить это в RF, я сомневаюсь, что это будет иметь какое-либо или большое значение для выбранных правил принятия решений, если у вас есть разумный сигнал в ваших данных. Короче говоря, оставьте их в данных, и масштабирование не имеет значения в RF, потому что оно использует только порядок рангов... - person Gavin Simpson; 14.03.2011

Я не могу придумать функцию в R, которая делает это, но вы можете сами определить маленькую:

foo <- function(x)
{
    quant <- quantile(x,c(0.05,0.95))
    x[x < quant[1]] <- min(x[x >= quant[1]])
    x[x > quant[2]] <- max(x[x <= quant[2]])
    return(round((x - min(x))/abs(max(x) - min(x)),1))
}

Затем sapply это для каждой переменной в вашем фрейме данных:

sapply(c,foo)
       a   b
 [1,] 1.0 1.0
 [2,] 0.7 0.7
 [3,] 0.3 0.3
 [4,] 0.7 0.7
 [5,] 0.3 0.3
 [6,] 0.0 0.0
 [7,] 0.3 0.3
 [8,] 0.7 0.7
 [9,] 1.0 1.0
[10,] 0.7 0.7
[11,] 0.0 0.0
[12,] 1.0 1.0
[13,] 0.3 0.3
[14,] 0.7 0.7
[15,] 0.3 0.3
[16,] 1.0 1.0
[17,] 0.0 0.0

Изменить: этот ответ предназначался для решения проблемы программирования. Что касается его фактического использования, я полностью согласен с Хэдли.

person Sacha Epskamp    schedule 12.03.2011
comment
Большое спасибо за помощь, Саша! - person Rainer; 12.03.2011