使用broom(augment)与dplyr处理loess拟合时出现错误
解决loess拟合后调用augment出现行数不匹配的问题
嘿,我刚碰到过类似的坑!你遇到的Error in data.frame(..., check.names = FALSE) : arguments imply differing number of rows: 32, 11,本质是用旧的do()函数处理分组loess模型时,broom在合并结果阶段没法正确对应每个分组的数据和模型输出,导致行数冲突。
为什么会出错?
你用group_by(cyl) %>% do(fit = loess(wt ~ mpg, .))生成的regressions数据框,每行对应一个cyl分组,但直接调用augment(fit)时,dplyr没办法自动把每个分组的augment结果和原分组数据正确关联,反而试图把所有结果强行合并——总观测数32和单个分组的11行数据凑不到一起,自然就报错了。而且do()在新版本dplyr里已经被弃用,更推荐用更清晰的分组处理方式。
两种可行的解决方案
方案1:用nest() + map()(灵活,适合后续还要处理模型的场景)
先把每个分组的数据嵌套成列表,再逐个拟合模型、生成augment结果,最后展开:
library(broom) library(dplyr) library(purrr) mtcars %>% group_by(cyl) %>% nest() %>% # 把每个cyl分组的数据打包成列表列 mutate( fit = map(data, ~ loess(wt ~ mpg, data = .x)), # 逐个拟合loess模型 augmented = map2(fit, data, ~ augment(.x, newdata = .y)) # 对每个模型+对应数据生成augment结果 ) %>% unnest(augmented) # 展开嵌套的结果,得到完整的拟合数据
方案2:用group_modify()(最简洁,直接处理分组)
dplyr的group_modify()专门用来处理分组数据的自定义操作,它会自动帮你关联每个分组的结果:
library(broom) library(dplyr) mtcars %>% group_by(cyl) %>% group_modify(~ augment(loess(wt ~ mpg, data = .x)))
验证结果
运行上面任意一段代码,你都会得到32行的结果(和原mtcars行数一致),里面包含原变量、拟合值.fitted、残差.resid等loess模型的输出,完全符合预期。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

