使用as.formula定义公式结合MICE与lmer时变量找不到问题求助
问题:预定义公式传入lmer拟合MICE插补数据时出现变量找不到错误
我需要为不同变量集的数据集拟合混合模型,因此提前用as.formula()定义并存储公式:
formula = as.formula(paste(paste(max_age_outcome, "~"), paste(independent_vars, collapse = " + "), paste0("+ (1|", evaluator_var, ")")))
生成的公式示例为:
gc ~ sex + medu + fedu + mses + fses + parity + mage + fage + smok + (1 | gc_eval)
但将该预定义公式传入MICE生成的多重插补数据集,调用lmer拟合模型时:
fit_list <- with(imputed_data, lmer(formula = formula))
出现错误:
Error in eval(predvars, data, env) : object 'sex' not found
直接在lmer中写入完整公式则能正常运行:
with(imputed_data, lmer(formula = gc ~ sex + medu + fedu + mses + parity + mage + smok + (1 | gc_eval)))
错误原因
核心问题是公式的环境绑定不匹配:
- 用
as.formula()提前创建公式时,公式会绑定到你定义它时的全局环境(或当前局部环境),而非with(imputed_data, ...)内部的数据集环境。 with()函数会在插补数据集的局部环境中执行代码,但预定义公式依然会在原环境中寻找sex这类变量——而这些变量实际只存在于插补数据集的子数据框里,因此触发“找不到对象”的错误。- 直接在
with()里写公式时,公式是在数据集的局部环境中创建的,自然能正确找到变量。
解决方法
方法1:在with()内部创建公式
把公式的定义逻辑放到with()的代码块中,让公式绑定到数据集的局部环境:
fit_list <- with(imputed_data, { formula <- as.formula(paste(paste(max_age_outcome, "~"), paste(independent_vars, collapse = " + "), paste0("+ (1|", evaluator_var, ")"))) lmer(formula = formula) })
注:确保max_age_outcome、independent_vars、evaluator_var这些配置变量能在with()环境中访问(如果是全局变量则无需额外处理)。
方法2:手动修改公式的环境
如果必须提前定义公式,可以通过environment()函数修改公式的绑定环境:
# 提前定义公式 formula = as.formula(paste(paste(max_age_outcome, "~"), paste(independent_vars, collapse = " + "), paste0("+ (1|", evaluator_var, ")"))) # 在调用前修改公式环境为插补数据集的环境 environment(formula) <- environment(imputed_data) # 执行拟合 fit_list <- with(imputed_data, lmer(formula = formula))
也可以在with()内部临时调整:
fit_list <- with(imputed_data, { environment(formula) <- environment() lmer(formula = formula) })
内容的提问来源于stack exchange,提问作者mdelas
相关产品推荐
相关产品推荐

