Несколько тестов Граббса одновременно в R

Я новичок в использовании R, я только начинаю с пакета выбросов. Вероятно, это очень просто, но кто-нибудь может сказать мне, как запустить несколько тестов Граббса одновременно? У меня есть 20 столбцов, и я хочу протестировать их все одновременно. заранее спасибо

Изменить: извините за плохое объяснение. Я постараюсь. Я начал использовать R сегодня и научился проводить тест Граббса с помощью grubbs.test(data$S1, type=10 или 11 или 20), и все идет хорошо. Но у меня есть таблица с 20 столбцами, и я хочу запустить тест Граббса для каждого из них одновременно. Я могу сделать это один за другим, но я думаю, что должен быть способ сделать это быстрее. Я запустил код в Как повторить Граббса тестировать и помечать выбросы, и работает отлично, но опять же, я хотел бы сделать это со своими 20 образцами. В качестве примера моих данных:

S1 S2 S3 S4 S5 S6 S7 96 40 99 45 12 16 48 52 49 11 49 59 77 64 18 43 11 67 6 97 91 79 19 39 28 45 44 99 9 78 88 6 25 43 78 60 12 29 32 2 68 25 18 61 60 30 26 51 70 96 98 55 74 83 17 69 19 0 17 24 0 75 45 42 70 71 7 61 82 100 39 80 71 58 6 100 94 100 5 41 18 33 98 97

Надеюсь это поможет.


person Stu Diante    schedule 03.08.2017    source источник
comment
Задавая вопрос, вы должны предоставить воспроизводимый пример с образцом входные данные и желаемый результат. Как код, который вы пытались использовать, и точно опишите, почему он не делает именно то, что вы хотите.   -  person MrFlick    schedule 03.08.2017


Ответы (2)


Вы можете использовать lapply:

library(outliers)

df = data.frame(a=runif(20),b=runif(20),c=runif(20))
tests = lapply(df,grubbs.test) 
# or with parameters:
tests = lapply(df,grubbs.test,opposite=T)

Полученные результаты:

> tests
$a

    Grubbs test for one outlier

data:  X[[i]]
G = 1.80680, U = 0.81914, p-value = 0.6158
alternative hypothesis: highest value 0.963759744539857 is an outlier


$b

    Grubbs test for one outlier

data:  X[[i]]
G = 1.53140, U = 0.87008, p-value = 1
alternative hypothesis: highest value 0.975481075001881 is an outlier


$c

    Grubbs test for one outlier

data:  X[[i]]
G = 1.57910, U = 0.86186, p-value = 1
alternative hypothesis: lowest value 0.0136249314527959 is an outlier

Вы можете получить доступ к результатам следующим образом:

> tests$a$statistic
        G         U 
1.8067906 0.8191417

Надеюсь это поможет.

person Florian    schedule 03.08.2017
comment
Спасибо, это было очень полезно. Есть ли способ изменить тип теста Граббса (типовой, противоположный и т.д.)? - person Stu Diante; 03.08.2017
comment
Да, вы можете добавить параметры следующим образом: tests = lapply(df,grubbs.test,opposite=T,type=11). - person Florian; 03.08.2017
comment
Спасибо миллион, это очень поможет. Я нажал на верхнюю стрелку и зеленую галочку ;) - person Stu Diante; 03.08.2017
comment
Нет проблем, рад, что смог помочь. - person Florian; 03.08.2017

Ответ @Florian можно немного обновить. Например, причудливый и легко читаемый результат может быть достигнут с помощью пакета purrr и пакета tidyverse. Это может быть полезно, если вы сравниваете множество групп:

Загрузите необходимые пакеты:

library(dplyr)
library(purrr)
library(tidyr)
library(outliers)

Создайте некоторые данные - мы собираемся использовать то же самое из ответа Флориана, но преобразованного в современный tibble и длинный формат:

df <-  tibble(a = runif(20), 
              b = runif(20),
              c = runif(20)) %>%
  # transform to along format
  tidyr::gather(letter, value)

Тогда вместо функций apply мы можем использовать map и map_dbl из purrr:

df %>%
  group_by(letter) %>%
  nest() %>% 
  mutate(n = map_dbl(data, ~ nrow(.x)), # number of entries
         G = map(data, ~ grubbs.test(.x$value)$statistic[[1]]), # G statistic
         U = map(data, ~ grubbs.test(.x$value)$statistic[[2]]), # U statistic
         grubbs = map(data, ~ grubbs.test(.x$value)$alternative), # Alternative hypotesis
         p_grubbs = map_dbl(data, ~ grubbs.test(.x$value)$p.value)) %>% # p-value
  # Let's make the output more fancy
  mutate(G = signif(unlist(G), 3),
         U = signif(unlist(U), 3),
         grubbs = unlist(grubbs),
         p_grubbs = signif(p_grubbs, 3)) %>%
  select(-data) %>% # remove temporary column
  arrange(p_grubbs)

И желаемый результат будет таким:

# A tibble: 3 x 6
  letter     n     G     U grubbs                                        p_grubbs
  <chr>  <dbl> <dbl> <dbl> <chr>                                            <dbl>
1 c         20  1.68 0.843 lowest value 0.0489965472370386 is an outlier     0.84
2 a         20  1.58 0.862 lowest value 0.0174888013862073 is an outlier     1   
3 b         20  1.57 0.863 lowest value 0.0656482006888837 is an outlier     1   
person atsyplenkov    schedule 18.01.2019