eval(predvars, data, env) 中的 lmer 错误:找不到对象 x

lmer Error in eval(predvars, data, env) : object x not found

正在对数据框中的所有列应用 lmer() 函数。我制作了一个变量列表并使用了 lapply。下面是代码:

varlist=names(Genus_abundance)[5:ncol(Genus_abundance)]

lapply(varlist, function(x){lmer(substitute(i ~ Status + (1|Match), list(i=as.name(x), data=Genus_abundance, na.action = na.exclude)))})

但是,我不断收到此错误:

 Error in eval(predvars, data, env) : object 'Acetatifactor' not found

我已经检查过,Acetatifactor 在 Genus_abundance 数据框中。 有点卡在哪里出了问题

编辑: 添加了一个工作示例:

set.seed(43)
n <- 6
dat <- data.frame(id=1:n, Status=rep(LETTERS[1:2], n/2), age= sample(18:90, n, replace=TRUE), match=1:n, Acetatifactor=runif(n), Acutalibacter=runif(n), Adlercreutzia=runif(n))

head(dat)
id Status age match Acetatifactor Acutalibacter Adlercreutzia
1  1      A  49     1     0.1861022     0.1364904     0.8626298
2  2      B  31     2     0.7297301     0.8246794     0.3169752
3  3      A  23     3     0.4118721     0.5923042     0.2592606
4  4      B  64     4     0.4140497     0.7943970     0.7422665
5  5      A  60     5     0.4803101     0.7690324     0.7473611
6  6      B  79     6     0.4274945     0.9180564     0.9179040
lapply(varlist,
       function(x){lmer(substitute(i ~ status + (1|match), list(i=as.name(x))),
   data=dd)
})

这里的具体问题是括号放错了。您应该用三个右括号关闭 substitute(..., list(i=as.name(x))),以便将整个块正确理解为 lme4.

first 参数

更一般地说,我同意@Kat 的评论, 是一个值得一看的好地方。由于您的参数已经是字符串(不是符号),因此您实际上并不需要所有 substitute() 业务并且可以使用

fit_fun <- function(v) {
   lmer(reformulate(c("status", "(1|match)"), response = v),
        data = dd, na.action = na.exclude)
}
lapply(varlist, fit_fun)

或者您可以使用 refit 来拟合第一列,然后用接下来的每一列更新拟合。对于大型模型,这更有效。

m1 <- lmer(resp1 ~ status + (1|match), ...)
m_other <- lapply(dd[-(1:3)], refit, object = m1)
c(list(m1), m_other)