broom::tidy升级后提取分组回归斜率报错,求修复及替代方案
报错原因分析
- 核心原因是你使用的旧版
broom+dplyr::do()的分组建模语法在新版本中已被弃用:旧版broom::tidy支持直接读取do()生成的模型列表列进行解析,但是新版移除了该兼容逻辑,tidy()现在要求传入参数必须为模型对象本身,你代码中tidy(model)的写法会被识别为尝试对整个数据框的列进行统计计算,将分组因子search_type代入了方差、均值计算逻辑,就触发了「对因子x调用var(x)已失效」的报错。 - 附带的警告也完全对应上述逻辑:第一个警告直接提示旧版数据框整理函数已弃用,后两个警告是因子列代入均值计算时返回NA的提示。
修复方案
推荐使用新版tidyverse标准的嵌套建模写法替代do(),兼容性和运行效率都更高,修复后代码如下:
library(tidyverse) library(broom) E1.first_trial_df <- data.frame( search_type = factor(rep(1:3, each = 10)), set_size = rep(1:10,3), RT = runif(30, min = 0, max = 2500) ) E1.search_slopes_first_trial <- E1.first_trial_df %>% # 按search_type分组嵌套生成子数据集 nest_by(search_type) %>% # 每个分组拟合线性模型,list()包裹避免自动展开 mutate(model = list(lm(RT ~ set_size, data = data))) %>% # 提取所有模型的统计指标 summarise(broom::tidy(model)) %>% # 过滤保留set_size对应的斜率 filter(term == 'set_size')
运行上述代码即可正常得到各分组的set_size回归斜率结果,不会再触发报错和警告。
内容的提问来源于stack exchange,提问作者TanZor
相关产品推荐
相关产品推荐

