You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:34:56