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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:18:25