Я пытаюсь сопоставить результаты моделирования с использованием 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. Когда я удалил его в этом примере, у меня были разные ошибки, поэтому я решил добавить его обратно, чтобы получить те же проблемы. Спасибо!
inner_join
. - person Jesse Tweedle   schedule 29.01.2018group_by("k")
. - person Jesse Tweedle   schedule 29.01.2018