R 公式环境问题

R 公式环境问题,r,R,下面的代码包含一个显示我的问题的简化示例。虽然不是那么简单,但我不想删除太多的上下文 当我使用as.formula()创建一个公式并尝试使用该公式拟合模型以乘以插补数据时,我得到了“eval中的错误(expr、envir、enclose):找不到对象‘结果’。当我在建模语句(最后一行)中显式列出公式时,没有问题。此外,如果我在分析单个数据集时引用公式(即,不需要“with”),也没有问题。显然,问题在于公式是在全局环境中创建的,而我需要它在数据框中查找名为的变量。我只是不太了解R环境,不知道如何

下面的代码包含一个显示我的问题的简化示例。虽然不是那么简单,但我不想删除太多的上下文

当我使用as.formula()创建一个公式并尝试使用该公式拟合模型以乘以插补数据时,我得到了“eval中的错误(expr、envir、enclose):找不到对象‘结果’。当我在建模语句(最后一行)中显式列出公式时,没有问题。此外,如果我在分析单个数据集时引用公式(即,不需要“with”),也没有问题。显然,问题在于公式是在全局环境中创建的,而我需要它在数据框中查找名为的变量。我只是不太了解R环境,不知道如何解决这个问题

我将此代码应用于多个场景下的一组更复杂模型的模拟中,因此,如果我要有效地编程这些模拟,下面的最后一行代码实际上不是一个选项

谢谢你的建议

library(MASS)
library(mitools)
library(lme4)

#Generate 3 small datasets to emulate multiply imputed data
Sigma <- matrix(c(1, 0.5, -0.7, -0.4, -0.4,
                  0.5, 1, -0.4, -0.2, -0.2, 
                  -0.7, -0.4, 1, 0.5, 0.4, 
                  -0.4, -0.2, 0.5, 1, 0.6,
                  -0.4, -0.2, 0.4, 0.6, 1),5,5)

complete <- as.list(1:3)
for (i in 1:3){
  complete[[i]] <- as.data.frame(mvrnorm(n = 10, mu=c(0,0,0,0,0), Sigma=Sigma))
}


#Convert to longitudinal analysis format and imputationList object type
all.long <- imputationList(lapply(complete, reshape, varying=c("V3", "V4", "V5"), direction="long", 
                                   v.names="outcome", times=c(0,2,4)))

current.formula <-formula(outcome ~ 1 + time + (1 | id) + (0 + time | id) + V1 + V2)

#This does not work:
imp.fit <- with(data=all.long, lmer(current.formula, REML=TRUE))
# Error in eval(expr, envir, enclos) : object 'outcome' not found


# This does work:
imp.fit <- with(all.long, lmer(outcome ~ 1 + time + (1 | id) + (0 + time | id) + V1 + V2, REML=TRUE))
库(MASS)
图书馆(mitools)
图书馆(lme4)
#生成3个小数据集以模拟多重插补数据

Sigma您可以在插补数据列表上使用Lappy。帧:

current.formula <- formula(outcome ~ 1 + time + (1 | id) + (0 + time | id) + V1 + V2)
imp.fit2 <- lapply(all.long$imputations, function(dat) lmer(current.formula, REML=TRUE, data=dat))

current.formula谢谢,@htfy。我需要在我的办公桌上挂一块牌子,提醒我在更多的情况下考虑拉普利。但是,如果可能的话,我很想显示一个多重插补对象类型,以便于使用诸如MIcombine之类的函数来汇集结果,而无需额外的步骤将结果强制转换为正确的结构。@JBeau:哪个对象想要多重插补类型?据我所知,
imp.fit
imp.fit2
的元素具有相同的类型。您可以在以下任一位置使用
mitools
功能:例如
MIextract(imp.fit2,fun=fixef)
应该可以工作。看一个例子。啊,你是对的。谢谢另外,我意识到我应该在对我的问题进行额外编辑之前接受你的编辑,这样你才能获得声誉积分,这太晚了。很抱歉