сгруппированный статистический тест Tidyverse - PullRequest
1 голос
/ 26 сентября 2019

Я пытаюсь провести тест на вилькоксин на долго отформатированных данных.Я хочу использовать dplyr group_by, чтобы указать подмножества, на которых я хотел бы провести тест.Конечным результатом будет новый столбец со значением p теста Уилкокса, добавленным к исходному фрейму данных.Все техники, которые я видел, требуют суммирования фрейма данных.Я НЕ хочу обобщать фрейм данных.

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

#reformatting Iris to mimic my data.
long_format <- iris %>% 
  gather(key = "attribute", value = "measurement", -Species) %>%
  mutate(descriptor = 
           case_when(
    str_extract(attribute, pattern = "\\.(.*)") == ".Width" ~ "Width",
    str_extract(attribute, pattern = "\\.(.*)") == ".Length" ~ "Length")) %>%
  mutate(Feature = 
           case_when(
    str_extract(attribute, pattern = "^(.*?)\\.") == "Sepal." ~ "Sepal",
    str_extract(attribute, pattern = "^(.*?)\\.") == "Petal." ~ "Petal"))

#removing no longer necessary column.
cleaned_up <- long_format %>% select(-attribute)

#Attempt using do, but I lose important info like "measurement"
cleaned_up %>%
  group_by(Species, Feature) %>%
  do(w = wilcox.test(measurement~descriptor, data=., paired=FALSE)) %>% 
  mutate(Wilcox = w$p.value)

# This is an attempt with the dplyr experimental group_map function. If only I could just make this a new column appended to the original df in one step.

cleaned_up %>%
  group_by(Species, Feature) %>%
  group_map(~ wilcox.test(measurement~descriptor, data=., paired=FALSE)$p.value)

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 26 сентября 2019

Объект модели может быть заключен в list

library(tidyverse)
cleaned_up %>%
   group_by(Species, Feature) %>%
   nest %>% 
   mutate(model = map(data, ~ 
          .x %>%
           transmute(w = list(wilcox.test(measurement~descriptor, 
               data=., paired=FALSE)))))

Или другой параметр - group_split в list, затем map через list, элементысоздайте столбец 'pval' после применения модели

cleaned_up %>% 
    group_split(Species, Feature) %>%
    map_dfr(~ .x %>%
                 mutate(pval = wilcox.test(measurement~descriptor, 
               data=., paired=FALSE)$p.value))
2 голосов
/ 26 сентября 2019

Другой вариант - полностью избежать аргумента данных.Функция wilcox.test требует аргумента данных только тогда, когда тестируемые переменные не находятся в области вызова, но функции, вызываемые в mutate, имеют все столбцы из фрейма данных в области видимости.

cleaned_up %>%
  group_by(Species, Feature) %>%
  mutate(pval = wilcox.test(measurement~descriptor, paired=FALSE)$p.value)

То же, что и вывод Акруна (благодаря его исправлению в комментариях выше)

akrun <- 
  cleaned_up %>% 
    group_split(Species, Feature) %>%
    map_dfr(~ .x %>%
                 mutate(pval = wilcox.test(measurement~descriptor, 
               data=., paired=FALSE)$p.value))

me <- 
cleaned_up %>%
  group_by(Species, Feature) %>%
  mutate(pval = wilcox.test(measurement~descriptor, paired=FALSE)$p.value)

all.equal(akrun, me)
# [1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...