我正在做一个项目,涉及一个二元响应变量,一个二元治疗分类器,以及其他一些在我们单变量分析中很重要的分类和连续协变量。我目前的研究问题涉及治疗和参与者协变量的潜在交互效应。
我的数据集已经被分割成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")))
非常感谢!
在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")))