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)
正在对数据框中的所有列应用 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
.
更一般地说,我同意@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)