purrr::map 是否更改对象类型?

Does purrr::map change an object type?

我在做一些回归分析时注意到了一些非常奇怪的事情。本质上,当我独立估计回归和 purrr::map 函数内的相同回归并提取元素时,我发现这两个对象并不相同。我的问题是为什么会这样,或者如果应该这样的话。

我问这个的主要原因是因为一些软件包在从 purrr::map 中提取的估计中提取信息时遇到问题,但当我单独估计它们时却没有。这是一个带有一些无意义回归的小例子:

library(fixest)
library(tidyverse)

## creating a formula for a regression example
formula <- as.formula(paste0(
  "mpg", "~",
  paste("cyl", collapse = "+"),
  paste("|"), paste(c("gear", "carb"), collapse = "+")))

## estimating the regression and saying
mtcars_formula <- feols(formula, cluster = "gear", data = mtcars)

## estimating the same regression twice, but using map
mtcars_list_map <- map(list("gear", "gear"), ~ feols(formula, cluster = ., data = mtcars))

## extracting the first element of the list
is_identical_1 <- mtcars_list_map %>% 
  pluck(1)


## THESE ARE NOT IDENTIAL
identical(mtcars_formula, is_identical_1)

我也用 fixest 包标记它,只是因为这可能是特定于包的...

差异很大程度上归结为环境差异。例如,这些列表(即 mtcars_formulais_identical_1 的第三个元素)是公式 mpg~cyl(实际上 mtcars_formula[[3]] == is_identical_1[[3]] 将 return TRUE。但是,您会看到这些与不同的环境相关联。

> mtcars_formula[[3]] == is_identical_1[[3]]
[1] TRUE
> environment(mtcars_formula[[3]])
<environment: 0x560a2490ef40>
> environment(is_identical_1[[3]])
<environment: 0x560a2554d810>

您是否认为这些差异“微不足道”取决于您的用例,但您可以这样检查差异:

differences =list()
for(i in 1:length(mtcars_formula)) {
  if(!identical(mtcars_formula[[i]], is_identical_1[[i]])) {
    differences[[names(mtcars_formula)[i]]] = list(mtcars_formula[[i]], is_identical_1[[i]])
  }
}

一个确实不同的元素是报告的 call(第 4 个元素)

> mtcars_formula[[4]] == is_identical_1[[4]]
[1] FALSE
> c(mtcars_formula[[4]], is_identical_1[[4]])
[[1]]
feols(fml = formula, data = mtcars, cluster = "gear")

[[2]]
feols(fml = formula, data = mtcars, cluster = .)

这可能与您在上述评论中报告的错误有关,与 fwildclusterboot::boottest() 相关。请注意,使用 map() 创建的对象的调用表示 cluster=.,而不是 `cluster="gear".

解决此问题的一种方法是执行以下操作:

mtcars_list_map <- map(list("gear", "gear"), function(x) {
  # create the model
  model = feols(formula, cluster = x, data = mtcars)
  # manipulate the call object
  model$call$cluster=x
  # return the model
  model
})