felm不适用于broom :: augment / purrr,但适用于整洁

时间:2017-03-07 04:29:24

标签: r purrr broom

我正在尝试在嵌套数据框as described here中运行回归。出于我的目的,我正在使用felm包中的lfe,因为我有很多级别的固定效果。

如果我使用felm代替lm重新执行上述链接中的示例,则在我尝试使用broom::augment之前,它大部分都有效。

library(tidyverse)
library(broom)
library(gapminder)
library(lfe)

by_country <- gapminder %>% 
  group_by(continent, country) %>% 
  nest()

country_felm <- function(data){
  felm(lifeExp ~ year, data = data)
}

by_country <- by_country %>% 
    mutate(model = purrr::map(data, country_felm)
    )

除了我必须在最后一行代码purrr::map中使用函数而不是公式,可能还有另一个felm怪癖之外,一切都达到了这一点。

现在,如果我尝试使用broom来提取模型输出,则它适用于glancetidy,但不适用于augment

by_country %>% unnest(model %>% purrr::map(broom::glance))
by_country %>% unnest(model %>% purrr::map(broom::tidy))
by_country %>% unnest(model %>% purrr::map(broom::augment))

尝试使用augment会导致以下错误消息:

Error in mutate_impl(.data, dots) : 
  argument must be coercible to non-negative integer
In addition: Warning message:
In seq_len(nrow(x)) : first element used of 'length.out' argument

1 个答案:

答案 0 :(得分:1)

看起来augment无法找到data参数的数据,这通常是用于拟合的数据集。

如果使用这些模型中的单个模型而不是同时使用所有模型,则更容易看到问题。

根据您给出的错误,这不起作用:

augment(by_country$model[[1]])

但显式地将数据传递给data参数:

augment(by_country$model[[1]], data = by_country$data[[1]])

因此,解决方法是将数据集作为第二个参数传递给augment。这可以通过purrr:map2完成,同时循环遍历modeldata列。

by_country %>%
    unnest(model %>% purrr::map2(., data, augment))