map + pmap, не удается найти переменные

Я пытаюсь сопоставить результаты моделирования с использованием dplyr и purrr. Мои результаты сохраняются в виде списка фреймов данных с результатами нескольких различных алгоритмов классификации, и я пытаюсь использовать purrr и dplyr для обобщения этих результатов.

Я пытаюсь вычислить - количество объектов, назначенных каждому кластеру - количество объектов в кластере, которые фактически принадлежат кластеру - количество истинных положительных результатов, ложных срабатываний, ложных отрицаний и истинных отрицаний с использованием 3 различных алгоритмов (KEEP1 - KEEP3 ) - для двух алгоритмов у меня есть доступ к вероятности нахождения в кластере, поэтому я могу сравнить это с альтернативным выбором альфа - и поэтому я могу вычислить истинные положительные результаты и т. д., используя другой выбор альфы.

Я нашел это: https://github.com/tidyverse/dplyr/issues/3101 , который я успешно использовал для одного элемента списка, чтобы получить именно то, что я хотел:

f <- function(.x, .y) {
  sum(.x & .y)
}

actions <- list(
  .vars = lst(
    c('correct'),
    c('KEEP1', 'KEEP2', 'KEEP3'),
    c('pval1', 'pval2')
  ),
  .funs = lst(
    funs(Nk = length, N_correct = sum),
    funs(
      TP1 = f(., .y = correct),
      FN1 = f(!(.), .y = correct),
      TN1 = f(!(.), .y = !(correct)),
      FP1 = f(., .y = !(correct))
    ),
    funs(
      TP2 = f((. < alpha0) , .y = correct),
      FN2 = f(!(. < alpha0), .y = correct),
      TN2 = f(!(. < alpha0), .y = !(correct)),
      FP2 = f((. < alpha0), .y = !(correct))
    )
  )
)

reproducible_data <- replicate(2,
  data_frame(
    k = factor(rep(1:10, each = 20)),  # group/category
    correct = sample(x = c(TRUE, FALSE), 10 * 20, replace = TRUE, prob = c(.8, .2)),
    pval1 = rbeta(10 * 20, 1, 10),
    pval2 = rbeta(10 * 20, 1, 10),
    KEEP1 = pval1 < 0.05,
    KEEP2 = pval2 < 0.05,
    KEEP3 = runif(10 * 20) > .2,
    alpha0 = 0.05,
    alpha = 0.05 / 20 # divided by no. of objects in each group (k)
),
  simplify = FALSE)

# works
df1 <- reproducible_data[[1]]
pmap(actions,  ~df1 %>% group_by(k) %>% summarize_at(.x, .y)) %>%
  reduce(inner_join,by = 'k')

Теперь я хочу использовать карту, чтобы сделать это для всего списка. Однако я больше не могу получить доступ к переменной «правильно» (она еще не успела зайти достаточно далеко, чтобы не видеть альфа или альфа0, но, вероятно, возникнет такая же проблема). Я все еще изучаю dplyr / purrr, но мои эксперименты не помогли.

# does not work
out_summary <- map(
  reproducible_data, 
  pmap(actions,  ~ as_tibble(.) %>% group_by("k") %>% summarize_at(.x, .y)) %>%
    reduce(inner_join,by = 'k')
)
# this doesn't either
out_summary <- map(
  reproducible_data, 
  pmap(actions,  ~ as_tibble(.) %>% group_by("k") %>% summarize_at(.x, .y, alpha = alpha, alpha0 = alpha0, correct = correct)) %>%
    reduce(inner_join,by = 'k')
)

На карте я не вижу переменную 'k' в $ group_by (k) $, если она не указана в кавычках $ group_by ('k') $, но мне не нужно цитировать ее, когда я просто использовал pmap. Я пробовал разными способами передавать правильные переменные этим функциям, но я все еще изучаю dplyr и purrr, и пока не добился успеха.

Еще одно замечание - фактические данные хранятся как обычный фрейм данных, поэтому мне нужно $ as_tibble () $ в функции pmap. Когда я удалил его в этом примере, у меня были разные ошибки, поэтому я решил добавить его обратно, чтобы получить те же проблемы. Спасибо!


person Melissa Key    schedule 28.01.2018    source источник
comment
Вы хотите заключить k в кавычки? Это немного повлияло на мою inner_join.   -  person Jesse Tweedle    schedule 29.01.2018
comment
Нм, теперь я понял, я добавил объяснение того, что делает group_by("k").   -  person Jesse Tweedle    schedule 29.01.2018


Ответы (1)


Попробуй это

map(
  reproducible_data,
  function(df1) { 
    pmap(actions,  ~ df1 %>% 
                       as_tibble() %>% 
                       group_by(k) %>% 
                       summarize_at(.x, .y)) %>% 
      reduce(inner_join, by = "k")
  } 
)

Я думаю, что ваши аргументы могут смешаться при одновременном использовании map и pmap. Я использовал синтаксис function для map, чтобы определить df1, чтобы попытаться исправить это. Остальное выглядит нормально (хотя я переключился на pmap_df, чтобы вернуть фрейм данных (структура списка без него была некрасивой, и pmap_df был самым простым способом сделать его красивым. Lmk, если это не ожидаемый результат. ????

Также проблема с group_by("k") vs. group_by(k)

Также: запись group_by("k") фактически создает переменную «k» и заполняет ее символами «k», а затем использует ее для группировки. Это заставит ваш код работать, но он не будет делать то, что вам нравится. Иногда проблема такого рода действительно возникает из-за ошибки, которая возникает на строчку или две до (или, с dplyr, на одну или две до). В этом случае map не проходил df1 там, где он вам нужен.

person Jesse Tweedle    schedule 28.01.2018
comment
Хм, похоже, у меня что-то не так. Дай мне поработать над этим. - person Jesse Tweedle; 29.01.2018
comment
Хорошо, попробуй. - person Jesse Tweedle; 29.01.2018