在循环中使用get()函数时如何正确计算emmeans?
循环中结合get()使用emmeans的报错解决方法
问题背景
循环处理20列数据时,lmer混合效应模型运行正常,但调用emmeans时因公式中使用get(thisvar)报错。
原代码
for(thisvar in thesevars){ mod_linear <- lmer(edss ~ time + get(thisvar) + age + gender + relapse_prior_1yr + new_lesions_prior_1yr + weight + (1|id), data = dat_long) emms_mod_linear <- emmeans(mod_linear, ~ time, at = list(time = seq(0, 12, 1))) }
报错信息
Error in (function (object, at, cov.reduce = mean, cov.keep = get_emm_option("cov.keep"), : We are unable to reconstruct the data. The variables needed are: time thisvar age gender relapse_prior_1yr new_lesions_prior_1yr weight Are any of these actually constants? (specify via 'params = ') The dataset name is: dat_long Does the data still exist? Or you can specify a dataset via 'data = '
报错原因
emmeans需要从模型对象中提取变量名来重构分析数据,但用get(thisvar)构建公式时,模型中记录的变量名是get(thisvar)而非实际的列名,导致emmeans无法匹配数据集中的真实变量,进而触发重构失败的错误。
解决方法
方法1:用reformulate动态构建公式(推荐)
通过reformulate()函数直接将循环变量thisvar对应的真实列名写入模型公式,让模型存储正确的变量名,emmeans即可正常识别。
修改后的代码:
for(thisvar in thesevars){ # 动态生成包含真实列名的模型公式 model_formula <- reformulate( terms = c("time", thisvar, "age", "gender", "relapse_prior_1yr", "new_lesions_prior_1yr", "weight", "(1|id)"), response = "edss" ) mod_linear <- lmer(model_formula, data = dat_long) emms_mod_linear <- emmeans(mod_linear, ~ time, at = list(time = seq(0, 12, 1))) # 可在此添加结果保存逻辑,例如存入列表 # 比如:emms_results[[thisvar]] <- emms_mod_linear }
方法2:手动指定emmeans的data参数(备选)
如果坚持使用get(),可以在调用emmeans时显式传入data = dat_long,强制emmeans使用原始数据集重构数据,但这种方法仍可能因变量名匹配问题出现异常,仅作为备选方案:
for(thisvar in thesevars){ mod_linear <- lmer(edss ~ time + get(thisvar) + age + gender + relapse_prior_1yr + new_lesions_prior_1yr + weight + (1|id), data = dat_long) emms_mod_linear <- emmeans(mod_linear, ~ time, at = list(time = seq(0, 12, 1)), data = dat_long) }
内容的提问来源于stack exchange,提问作者LucaS
相关产品推荐
相关产品推荐

