什么是最优雅的tidyverse式的方法,将数据分割成多个重叠的子群?

问题描述 投票:1回答:1

我正在做一个项目,涉及一个二元响应变量,一个二元治疗分类器,以及其他一些在我们单变量分析中很重要的分类和连续协变量。我目前的研究问题涉及治疗和参与者协变量的潜在交互效应。

我的数据集已经被分割成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")))

非常感谢!

r dplyr functional-programming tidyverse purrr
1个回答
0
投票

在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")))
© www.soinside.com 2019 - 2024. All rights reserved.