解决tidy与flextable构建lmer模型系数表格时的报错及批量生成RMarkdown兼容表格方案
解决方法:提取lmer模型列表系数并生成可在RMarkdown中显示的表格
你的报错是因为代码里的内层map误用了——你的models_list_1每个元素是lmer模型的summary对象(不是嵌套列表),内层map会遍历summary对象的各个组件(比如call是字符类型),而broom::tidy无法处理字符类型的对象,所以才会出现No tidy method for objects of class character的错误。
下面是两种可行的解决方案,根据你的需求选择:
方案1:为每个模型单独生成系数表格
如果你想给每个分组的模型都生成独立的表格,可以直接遍历模型summary列表,用broom::tidy提取系数后转成flextable:
library(purrr) library(broom) library(flextable) # 遍历每个模型summary,生成对应的flextable model_coef_tables <- models_list_1 %>% map(function(model_summary) { # 提取系数,可添加conf.int=T获取置信区间 tidy(model_summary, conf.int = TRUE) %>% flextable() %>% set_caption("模型固定效应系数") %>% autofit() # 自动调整列宽 })
在RMarkdown中,你可以通过索引逐个输出表格:
# 输出第一个分组的模型表格 model_coef_tables[[1]] # 输出第二个分组的模型表格(如果有的话) model_coef_tables[[2]]
方案2:合并所有模型的系数到一个汇总表格
如果你想把所有分组模型的系数合并成一个大表格(带分组标识),可以这样做:
library(purrr) library(broom) library(dplyr) library(flextable) # 合并所有模型系数,添加分组标签 combined_coef_table <- models_list_1 %>% # 给每个模型命名为对应的group值(从原数据集获取) set_names(unique(data_long$group)) %>% # 遍历每个模型,提取系数并添加分组列 imap(function(model_summary, group_name) { tidy(model_summary, conf.int = TRUE) %>% mutate(group = group_name) %>% relocate(group, .before = term) # 将分组列放到最前面 }) %>% bind_rows() %>% # 合并所有数据框 flextable() %>% set_caption("所有分组模型系数汇总") %>% autofit()
在RMarkdown中直接输出这个汇总表格即可:
combined_coef_table
优化建议:保留原模型而非先做summary
其实你在创建models_list_1的时候,可以不用先调用summary(),直接保留lmer模型对象,这样broom::tidy的处理会更灵活(比如可以选择只提取固定效应或包含随机效应):
# 重新创建模型列表(不提前做summary) models_list_1 <- data_long %>% group_by(group) %>% do(fit = lmerTest::lmer(values ~ group1*group2 + (1 |variable), data = .)) %>% pull(fit) # 提取固定效应系数(effects="fixed") model_tables <- models_list_1 %>% map(function(model) { tidy(model, conf.int = TRUE, effects = "fixed") %>% flextable() %>% set_caption("固定效应系数表") %>% autofit() })
这样可以避免处理summary对象带来的额外问题,同时能更精准地控制提取的系数类型。
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

