使用effects包循环运行glmer函数时出现意外错误

4
我正在尝试通过 lapply 循环将来自lme4包的(gl)merMod对象和effects包中的effect函数一起传递,但遇到了意外的错误。似乎effect函数无法在循环内查找对象。我做错了什么,如何使循环正常工作而不必手动将数据框放入工作区间?
library(lme4)
library(reshape2)
library(effects)

dat <- data.frame(var = rep(c("A", "B", "C"), 100), treat = rep(c("T1", "T2"),
each = 150), rand =  rep(c("B", "C", "A"), 100), value = rep(c(1,0), 150))

lapply(levels(dat$treat), function(k) {
  y <- subset(dat, treat == k)
  mod <- glmer(value ~ var + (1|rand), data = y, family = binomial)
  })
## Works

lapply(levels(dat$treat), function(k) {
  y <- subset(dat, treat == k)
  mod <- glmer(value ~ var + (1|rand), data = y, family = binomial)
  effects::effect("var", mod)
})
## Error in is.data.frame(data) : object 'y' not found

y <- subset(dat, treat == "T1")
mod <- glmer(value ~ var + (1|rand), data = y, family = binomial)
effects::effect("var", mod)
## Works

lapply(levels(dat$treat), function(k) {
  y <- subset(dat, treat == k)
  mod <- glmer(value ~ var + (1|rand), data = y, family = binomial)
  effects::effect("var", mod)
})
## Works, because object y is in the workspace

1
这显然不是解决方案,但对我来说,“使用glm()模型”起作用了:lapply(levels(dat$treat), function(k) { y <- subset(dat, treat == k) mod <- glm(value ~ var , data = y, family = binomial) effects::effect("var", mod) })因此,这可能是effects包与glmer结合使用的特定问题。 - maller
@maller 谢谢!所以这是一个 lme4 的问题...我编辑了我的问题。顺便说一下,lapply(levels(dat$treat), function(k) {y <- subset(dat, treat == k); mod <- lmer(value ~ var + (1|rand), data = y); effects::effect("var", mod)}) 会产生错误。 - Mikko
1
你可能想看一下这个链接(https://github.com/cran/effects/blob/master/R/effectsmer.R),但我无法找到解释。 - maller
如果您尝试在函数内部使用 effects,则会出现类似的错误。对于这种情况,替代-解析技巧似乎可以解决问题。但是,对于此示例无效。https://dev59.com/YW3Xa4cB1Zd3GeqPaxUJ - Mikko
1个回答

2

我曾遇到类似的问题(使用lm和model.matrix),在单独使用effects时一切正常,但在我的lapply循环中却无法使用。

我尝试改用for循环重写代码,这解决了我的问题。由于for循环每次都将对象分配给全局环境,您不必手动将它们放置在那里。

在您的示例中,for循环不会抛出错误,尽管现在您需要将输出分配给某个变量:

for(k in levels(dat$treat)) {
  y <- subset(dat, treat == k)
  mod <- glmer(value ~ var + (1|rand), data = y, family = binomial)
  effects::effect("var", mod)
  }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接