Удаление выбросов из фрейма данных с помощью метода построения диаграммы - PullRequest
0 голосов
/ 21 марта 2019

У меня есть фрейм данных с около 15 переменных.Я должен удалить выбросы из переменных.

Следуя обучающей программе в Интернете, я использую метод боксплоттинга для удаления выбросов.Я использую сложенный способ удаления посторонних значений один за другим из фрейма данных, пока все данные не будут обработаны.

Вот мой код.Мой вопрос, это хороший способ удалить выбросы или как улучшить код.

#removong outliers from the columns
outliers <- boxplot(outlier_H_rem$var1, plot=FALSE)$out
if(length(outliers) == 0){ outlier_H_rem1<-outlier_H_rem
boxplot(outlier_H_rem1$var1)} else { 
outlier_H_rem1<-outlier_H_rem[-which(outlier_H_rem$var1 %in% outliers),]
var1<-outlier_H_rem1$var1}
boxplot(outlier_H_rem1$var1)

outliers <- boxplot(outlier_H_rem1$var2, plot=FALSE)$out
if(length(outliers) == 0){ outlier_H_rem2<-outlier_H_rem1
boxplot(outlier_H_rem2$var2)} else { 
outlier_H_rem2<-outlier_H_rem1[-which(outlier_H_rem1$var2 %in% outliers),]
moisture2<-outlier_H_rem2$var2}
boxplot(outlier_H_rem2$var2)

outlier_H_rem - это стек данных, который я тестирую каждый раз с помощью следующей переменной var outlier_H_rem1 $ var1, outlier_H_rem2 $ var2,outlier_H_rem3 $ var3 до последнего вар.outlier_H_rem15 $ var15 - последний накопленный фрейм данных, который обрабатывается всеми переменными.

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Могу ли я предложить несколько иной подход.

Преобразуйте ваши данные из широкой в ​​длинную форму, а затем рассчитайте выбросы, используя квантили и интеркантильные диапазоны.

Затем отфильтруйте выбросы и выполните обратное преобразование.в широкой форме.Удаление строк с выбросами оставляет желаемый результат

Опираясь на @Steen Harsted

library(tidyverse)

set.seed(1)

outlier_H_rem <- tibble(
  var1 = rnorm(10, 0, 1),
  var2 = rnorm(10, 0, 1),
  var3 = rnorm(10, 0, 1)) %>% 
  #Introduce outliers
  rbind(c(5, 0, 0), c(0,7, 0))

outlier_H_rem

# A tibble: 12 x 3
var1    var2    var3
<dbl>   <dbl>   <dbl>
  1 -0.626  1.51    0.919 
2  0.184  0.390   0.782 
3 -0.836 -0.621   0.0746
4  1.60  -2.21   -1.99  
5  0.330  1.12    0.620 
6 -0.820 -0.0449 -0.0561
7  0.487 -0.0162 -0.156 
8  0.738  0.944  -1.47  
9  0.576  0.821  -0.478 
10 -0.305  0.594   0.418 
11  5      0       0     
12  0      7       0 

outlier_H_rem %>% 
  # Collect dat in tidy form
  tidyr::gather("Feature", "Value", everything()) %>%
  ggplot2::ggplot(aes(x=Feature, y=Value)) +geom_boxplot()

enter image description here

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

outlier_H_rem %>% 
  # Collect data in tidy form
  tidyr::gather("Feature", "Value", everything()) %>% 
  # Group by "Feature" and calculate outliers using iqr and quantiles
  # Also adding a row counter
  group_by(Feature) %>% 
  mutate(r=1:n()) %>%
  mutate(q1 = quantile(Value,probs=0.25),
         q3 = quantile(Value,probs=0.75),
         iqr = IQR(Value),
         outlier = if_else((q1-1.5*iqr)>Value | (q3+1.5*iqr)<Value, TRUE, FALSE)) %>% 
  # Filter out the ouliers
  filter(!outlier) %>% 
  # deselect calculated rows
  select(-q1, -q3, -iqr, -outlier) %>%
  # Spread the results again. 
  # optionally remove rows with rows with NA (contained outliers) using na.omit()
  spread(Feature, Value) %>% 
  # remove row counter
  select(-r)

# A tibble: 12 x 3
var1     var2     var3
*   <dbl>    <dbl>    <dbl>
  1  -0.626   1.51     0.919 
2   0.184   0.390    0.782 
3  -0.836  -0.621    0.0746
4   1.60   NA       NA     
5   0.330   1.12     0.620 
6  -0.820  -0.0449  -0.0561
7   0.487  -0.0162  -0.156 
8   0.738   0.944   NA     
9   0.576   0.821   -0.478 
10  -0.305   0.594    0.418 
11  NA       0        0     
12   0      NA        0 
0 голосов
/ 21 марта 2019

Я могу прочитать из вашего ответа на @Humpelstielzchen, что вы хотите работать с переменными как с отдельными векторами, поэтому я отвечу в соответствии с этим, но, пожалуйста, помните, что последующее объединение переменных может быть затруднено, поскольку вы теряете порядок положения значения, когда вы извлекаете их как отдельные векторы, а затем удаляете некоторые наблюдения.

В приведенном ниже примере я создал несколько примеров данных, чтобы осветить эту проблему. Обратите внимание, что у var3 нет выброса. Как вы будете объединять данные позже (они будут иметь разную длину)? Кроме того, несмотря на то, что var1 и var2 заканчивают с 11 наблюдениями после удаления выбросов, последняя позиция в векторе пришла с позиций 11 и 12 в исходных данных.

Учитывая, что вы все еще в порядке с этим, тогда ваш метод будет работать. Я дал некоторые комментарии к вашему коду.

library(tidyverse)

set.seed(1)

outlier_H_rem <- tibble(
  var1 = rnorm(10, 0, 1),
  var2 = rnorm(10, 0, 1),
  var3 = rnorm(10, 0, 1)) %>% 
  #Introduce outliers
  rbind(c(5, 0, 0), c(0,7, 0))

outlier_H_rem

#removeing outliers from the columns
outliers <- boxplot(outlier_H_rem$var1, plot=FALSE)$out

if(length(outliers) == 0){ 
  outlier_H_rem1 <- outlier_H_rem
  #boxplot(outlier_H_rem1$var1) - This line is irrelevant as you create the plot again after the if else call
  } else { 
  outlier_H_rem1 <- outlier_H_rem[-which(outlier_H_rem$var1 %in% outliers),]
  var1 < -outlier_H_rem1$var1 #What is the purpose of this line?
  }

boxplot(outlier_H_rem1$var1)
...