felm 不适用于 broom::augment/purrr 但适用于 tidy

felm doesn't work with broom::augment/purrr but works with tidy

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

如果我使用 felm 而不是 lm 重做上面 link 中的示例,它在我尝试使用 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

看起来 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))