【问题标题】:What is the most elegant tidyverse-style method for splitting data into multiple overlapping subgroups将数据拆分为多个重叠子组的最优雅的 tidyverse 样式方法是什么
【发布时间】:2020-08-16 04:51:51
【问题描述】:

我正在开展一个项目,该项目涉及二元响应变量、二元治疗分类器以及其他一些在我们的单变量分析中具有重要意义的分类和连续协变量。我目前的研究问题与治疗和参与者协变量的潜在交互作用有关。

我的数据集已划分为 3 个部分重叠的参与者组。

我希望通过对每个预测变量(治疗和协变量)的主要影响进行建模并应用一系列逻辑回归模型来检验治疗和协变量之间潜在相互作用的假设,并应用一系列逻辑回归模型,每个模型都包括一对治疗:协变量相互作用。

例子可以表示如下:

# 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:"

我的问题是:执行此操作的最整洁一致的方式是什么?有哪些不同的选择。最终,就代码的简洁性和可读性而言,哪个最有效?

这是一个有点骇人听闻的解决方案示例。我可以想出更多的想法,但没有一个是特别优雅的。

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")))

提前非常感谢!

【问题讨论】:

  • 检查 group_map ()
  • 我不太确定我是否遵循,但由于某种原因,阅读文档让我想起了完整的功能......在重新阅读其文档和“扩展”之后,我已经在下面发布了一个潜在的解决方案。我知道这是一个快速的转变,但这已经困扰了我一个星期,但是当我发布到堆栈溢出时,我想到了一个潜在的解决方案。

标签: r dplyr functional-programming tidyverse purrr


【解决方案1】:

搜索谷歌并整周思考这个问题,我在这里发布后仅仅几分钟就想出了一个可能的解决方案。不过,我欢迎其他方法!

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")))

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 2018-04-01
    • 1970-01-01
    • 2018-01-21
    • 1970-01-01
    • 2020-11-21
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多