如何用purrr::map与sjPlot::tab_model批量生成独立模型表格
解决方案
核心思路
要解决这个问题,关键是在批量处理时保留因变量的名称,并动态生成模型公式,同时确保每个tab_model()输出独立的结果表格。我们可以用purrr::imap()(针对命名列表的遍历函数)来同时获取列值和列名,避免因变量显示为.x的问题。
完整代码实现
# 加载所需包 library(lme4) library(sjPlot) library(purrr) library(dplyr) # 批量拟合模型并生成独立结果表格 testdata %>% select(sfa:pufa) %>% # 选择需要作为因变量的列 imap(function(dv_values, dv_name) { # 动态生成模型公式,用实际因变量名替换.x model_formula <- as.formula(paste0(dv_name, " ~ time_point + (1|subject)")) # 拟合线性混合效应模型 model <- lmer(model_formula, data = testdata) # 生成独立表格,指定标题和模型名称 tab_model( model, title = paste("线性混合效应模型结果:", dv_name), model.names = dv_name, # 可选:将表格保存为独立文件 # file = paste0(dv_name, "_model_results.html") ) })
代码解释
imap()的作用:imap()会遍历命名列表(这里是select(sfa:pufa)返回的带列名的数据框),每次迭代同时传入列值(dv_values)和列名(dv_name),这样我们就能拿到实际的因变量名称。- 动态生成公式:用
paste0()拼接出包含实际因变量名的公式,替代之前的.x ~ ...,确保模型中因变量的名称正确。 - 自定义表格属性:通过
title设置每个表格的标题,model.names指定模型显示名称,让输出的表格清晰对应每个因变量。如果需要保存结果,添加file参数即可将每个表格保存为独立的HTML文件。
替代方案(用map2())
如果更习惯分开处理列名和列值,可以用map2()实现相同效果:
dv_cols <- testdata %>% select(sfa:pufa) dv_names <- names(dv_cols) map2(dv_cols, dv_names, function(dv_values, dv_name) { model <- lmer(as.formula(paste0(dv_name, " ~ time_point + (1|subject)")), data = testdata) tab_model(model, title = paste("模型结果:", dv_name)) })
内容的提问来源于stack exchange,提问作者KIM
相关产品推荐
相关产品推荐

