使用 for 循环在 R 中运行多重插补

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

我怀疑与其他问题有相似之处,但我无法找到在这种情况下有效的组合。

本质上,我试图使用 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 loops imputation
1个回答
0
投票

您可以像这样获得每个模型:

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> 

然后,您可以在进一步的下游步骤中操作这些,具体取决于您想要提取的内容、您想要如何存储它等[用有关您实际想要的输出类型的更多细节更新您的问题]

© www.soinside.com 2019 - 2024. All rights reserved.