在使用单个lm对象的dplyr工作流中,使用`broom:::glance`会失败

8
当我按以下方式使用 broom:::glance 时:
library(dplyr)
library(broom)
mtcars %>% do(model = lm(mpg ~ wt, .)) %>% glance(model)

I get

Error in complete.cases(x) : invalid 'type' (list) of argument

然而,当我添加group_by时:
mtcars %>% group_by(am) %>% do(model = lm(mpg ~ wt, .)) %>% glance(model)

确保给出预期结果:

Source: local data frame [2 x 12]
Groups: am

  am r.squared adj.r.squared sigma statistic  p.value df logLik  AIC  BIC deviance df.residual
1  0     0.589         0.565  2.53      24.4 1.25e-04  2  -43.5 93.1 95.9    108.7          17
2  1     0.826         0.810  2.69      52.3 1.69e-05  2  -30.2 66.4 68.1     79.3          11

我有点不明白,还是dplyr / broom出现了错误吗?

这可能与长度为1的列表有关吗?library(tidyr);unnest(list(mtcars, mtcars), gr) %>% group_by(gr) %>% do(model = lm(mpg ~ wt, .)) %>% glance(model)可以工作。 - akrun
do的输出列表只有一个长度时,似乎确实无法正常工作。 - Paul Hiemstra
好的发现:这是因为未分组的tbl_df上的“do”不会返回“rowwise_df”,因此“glance.rowwise_df”方法不会被应用。我已经为此打开了一个问题,很快就会解决! - David Robinson
与此同时,一个不太丑陋的解决方法是首先按虚拟列进行分组:mtcars %>% group_by(g = 1) %>% do(model = lm(mpg ~ wt, .)) %>% glance(model)。(在之后添加 %>% ungroup() %>% select(-g) 以删除虚拟列) - David Robinson
谢谢@DavidRobinson,一旦您提交了修复程序,我会投票关闭这个问题。再次感谢! - Paul Hiemstra
显示剩余2条评论
1个回答

9

这是因为在未分组的表上执行do操作,会产生tbl_df而不是rowwise_df,导致broom使用了不同的方法。我已经在最新的开发版本中修复了这个问题,因此您现在可以执行以下操作:

mtcars %>% do(model = lm(mpg ~ wt, .)) %>% glance(model)
#>   r.squared adj.r.squared    sigma statistic      p.value df    logLik
#> 1 0.7528328     0.7445939 3.045882  91.37533 1.293959e-10  2 -80.01471
#>        AIC      BIC deviance df.residual
#> 1 166.0294 170.4266 278.3219          30

我希望很快可以在CRAN上发布这个包 (broom 0.4),或者你可以用 devtools::install_github("dgrtwo/broom") 来进行安装。与此同时,你也可以使用一个临时的分组列来实现预期的结果:

mtcars %>%
    group_by(g = 1) %>%
    do(model = lm(mpg ~ wt, .)) %>% 
    glance(model)
#> Source: local data frame [1 x 12]
#> Groups: g
#> 
#>   g r.squared adj.r.squared    sigma statistic      p.value df    logLik
#> 1 1 0.7528328     0.7445939 3.045882  91.37533 1.293959e-10  2 -80.01471
#> Variables not shown: AIC (dbl), BIC (dbl), deviance (dbl), df.residual
#>   (int)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接