Какой самый элегантный метод в стиле Tidyverse для разделения данных на несколько перекрывающихся подгрупп - PullRequest
1 голос
/ 01 мая 2020

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

Мой набор данных уже разделен на 3 частично перекрывающиеся группы участников.

I * sh для проверки гипотезы потенциального взаимодействия между лечением и ковариатами путем моделирования основных эффектов каждой переменной-предиктора (лечения и ковариат) и применения серии регрессионных моделей логистики c, каждая из которых включает одна пара лечения: ковариатические взаимодействия.

Пример может быть представлен следующим образом:

# Create a dataset with 3 partially overlapping groups
x <- 
  tibble(id = 1:50,
       outcome = rbinom(50, size = 1, 0.5),
       intervention = rbinom(50, size = 1, 0.5),
       p1 = rbinom(50, size = 1, 0.5),
       p2 = rbinom(50, size = 1, 0.5),
       p3 = rbinom(50, size = 1, 0.5),
       p4 = rnorm(50, 50, 10)) %>% 
  list(d1 = ., 
       d2 = (slice(., sample(1:50, size = 40, replace = FALSE))),
       d3 = (slice(., sample(1:50, size = 45, replace = FALSE)))) %>% 
  enframe(name = "subset") %>% 
  unnest(value) %>% 
  mutate_at(1:7, as.character)

c <- paste0("p", 1:4)

# Formula with partially-specified interaction term
f <- "outcome ~ intervention + p1 + p2 + p3 + p4 + intervention:"

Мой вопрос таков: каков наиболее последовательный и последовательный способ выполнения это? Каковы различные альтернативы. В конечном счете, что является наиболее эффективным с точки зрения краткости кода и читабельности?

Вот пример решения, которое немного хакери sh. Я могу придумать еще несколько на макушке, но ни один из них не будет особенно элегантным.

f <- "outcome ~ intervention + p1 + p2 + p3 + p4 + intervention:"

x %>% 
  mutate_at("p4", function(x) as.character(0)) %>% 
  select(-outcome, -intervention) %>% 
  pivot_longer(cols = c("p1", "p2", "p3", "p4")) %>% 
  select(-value) %>% 
  left_join(x, by = c("subset", "id")) %>% 
  group_by(subset, name) %>% 
  nest() %>%
  mutate(fit = map2(data, name, 
                    ~glm(as.formula(paste0(f, .y)), .x, family = "binomial")))

Заранее большое спасибо!

1 Ответ

0 голосов
/ 01 мая 2020

Обыскивая Google и размышляя над этим вопросом всю неделю, я придумаю вероятное решение всего через несколько минут после публикации здесь. Хотя я бы приветствовал альтернативные подходы!

x %>% 
  expand(nesting(subset, id), name = c("p1", "p2", "p3", "p4")) %>% 
  left_join(x, by = c("subset", "id")) %>%
  group_by(subset, name) %>% 
  nest() %>%
  mutate(fit = map2(data, name, 
                    ~glm(as.formula(paste0(f, .y)), .x, family = "binomial")))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...