R语言:动态分组拟合LM后调用broom::glance报错的技术求助
问题解决方法
错误原因是你在summarize中直接将列表列mod传给glance,但glance只能处理单个模型对象,无法识别列表。以下是两种修正方案:
方案一:直接在summarize中完成建模与结果提取
这种方式最简洁,不需要额外创建模型列,直接对每个分组数据建模并提取结果:
library(dplyr) library(broom) test_fcn <- function(var1, ...) { # 合并静态分组变量gear和动态传入的参数 group_vars <- c('gear', unlist(list(...))) mtcars %>% group_by(across(all_of(group_vars))) %>% # 对当前分组数据拟合模型,并用glance提取结果 summarize( glance(lm(hp ~ !!sym(var1), data = cur_data())), .groups = 'drop' # 取消分组,得到扁平表格 ) } # 测试函数 test_fcn('qsec', 'cyl', 'carb')
方案二:使用nest_by分组嵌套(适合需保留模型的场景)
如果需要保留模型对象供后续操作,用nest_by将每个分组的数据嵌套成单独的tibble,再建模和提取结果:
library(dplyr) library(broom) library(purrr) test_fcn <- function(var1, ...) { group_vars <- c('gear', unlist(list(...))) mtcars %>% nest_by(across(all_of(group_vars))) %>% # 分组并嵌套数据 mutate(mod = list(lm(hp ~ !!sym(var1), data = data))) %>% # 拟合模型 summarize(glance(mod), .groups = 'drop') # 提取模型结果 } test_fcn('qsec', 'cyl', 'carb')
关键说明
cur_data():在group_by环境中返回当前分组的数据集,确保lm只使用当前分组的数据。!!sym(var1):将传入的字符串变量名转换为公式能识别的符号,实现动态变量的公式调用。.groups = 'drop':避免结果保留分组结构,生成干净的扁平表格。
内容的提问来源于stack exchange,提问作者Jaywalker
相关产品推荐
相关产品推荐

