我怀疑与其他问题有相似之处,但我无法找到在这种情况下有效的组合。
本质上,我试图使用 for 循环来进行多重插补(我知道有一些包可以完成整个分析,但我需要提取中间阶段)。
从这样的数据集开始,其中 y 是结果,x 具有缺失值,估算的缺失值位于 a1-3 中。
dat <- data.frame(y = c(1,0,0,1,0),
x= c(1,NA,2,NA,1),
a1 = c(NA,1,NA,2,NA),
a2 = c(NA,1,NA,1,NA),
a3 = c(NA,2,NA,1,NA))
我认为我可以循环 a1-3,将值合并到 x 变量中,然后运行分析,但这似乎不起作用。我试过了:
for (i in 1:3) {
dat$x <- coalesce(dat$x,dat$a[i])
z <- glm(y ~ x, data=dat, family="binomial")
res <- summary(z)$coefficient
print(res)
}
但是第一行
dat$x <- coalesce(dat$x,dat$a[i])
显然没有按照我的想法去做,因为所有三个“res”都是相同的,如果我在这一行之后打印 dat$x,它还没有使用 A1-3 中的值进行更新.
我认为使用 dplyr 中的 mutate 可能会像这样工作:
for (i in 1:3) {
dat %>%
mutate(x = coalesce(x,a[i]))
z <- glm(y ~ x, data=dat, family="binomial")
res <- summary(z)$coefficient
print(res)
}
但这会给出错误“未找到对象'a'”。我尝试编写一个函数,然后使用 apply 而不是尝试循环,但这种方法没有取得任何进展。基于类似的问题,我想这都与循环如何使用列名有关,但我没有成功地实现任何解决方案。
感谢收到任何提示。
您可以像这样获得每个模型:
r = dat %>% reframe(across(a1:a3,\(a) {
list(glm(y~coalesce(x,a), family="binomial"))
}))
输出:
# A tibble: 1 × 3
a1 a2 a3
<list> <list> <list>
1 <glm> <glm> <glm>
然后,您可以在进一步的下游步骤中操作这些,具体取决于您想要提取的内容、您想要如何存储它等[用有关您实际想要的输出类型的更多细节更新您的问题]