首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >映射扫帚:整理到嵌套的{fixest}模型列表,并保留列表元素的名称

映射扫帚:整理到嵌套的{fixest}模型列表,并保留列表元素的名称
EN

Stack Overflow用户
提问于 2022-01-14 12:21:18
回答 1查看 237关注 0票数 1

我希望将broom::tidy()应用于嵌套在fixest_multi对象中的模型,并将每个列表级别的名称提取为数据帧列。这里是我的意思的例子。

代码语言:javascript
复制
library(fixest)
library(tidyverse)
library(broom)

multiple_est <- feols(c(Ozone, Solar.R) ~ Wind + Temp, airquality, fsplit = ~Month)

此命令估计每个dep的两个模型。var。(OzoneSolar.R)用于每个Month的子集加上完整的示例。生成的对象如下所示:

代码语言:javascript
复制
> names(multiple_est)
[1] "Full sample" "5"           "6"           "7"           "8"           "9" 
> names(multiple_est$`Full sample`)
[1] "Ozone"   "Solar.R"

现在我想tidy每个模型对象,但是将Month / Dep.var.组合的信息作为列保存在整洁的数据框架中。我想要的输出应该如下所示:

我可以从map_dfr包中运行tidyr,给出以下结果:

代码语言:javascript
复制
> map_dfr(multiple_est, tidy, .id ="Month") %>% head(9)
# A tibble: 9 x 6
  Month       term        estimate std.error statistic  p.value
  <chr>       <chr>          <dbl>     <dbl>     <dbl>    <dbl>
1 Full sample (Intercept)   -71.0     23.6      -3.01  3.20e- 3
2 Full sample Wind           -3.06     0.663    -4.61  1.08e- 5
3 Full sample Temp            1.84     0.250     7.36  3.15e-11
4 5           (Intercept)   -76.4     82.0      -0.931 3.53e- 1
5 5           Wind            2.21     2.31      0.958 3.40e- 1
6 5           Temp            3.07     0.878     3.50  6.15e- 4
7 6           (Intercept)   -70.6     46.8      -1.51  1.45e- 1
8 6           Wind           -1.34     1.13     -1.18  2.50e- 1
9 6           Temp            1.64     0.609     2.70  1.29e- 2

但这只整理了每个Month的第一个模型,即具有Ozone结果的模型。

我想要的输出应该如下所示:

代码语言:javascript
复制
Month       outcome         term        estimate      more columns from tidy
              
Full sample Ozone           (Intercept)   -71.0   
Full sample Ozone           Wind          -3.06   
Full sample Ozone           Temp          1.84    
Full sample Solar.R         (Intercept)   some value  
Full sample Solar.R         Wind          some value  
Full sample Solar.R         Temp          some value  

... rows repeated for each month 5, 6, 7, 8, 9

如何将tidy应用于所有模型并添加另一列来指示模型的结果(该列存储在模型对象的name中)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-14 13:51:06

因此,当我深入研究时,fixest_mult有一个非常奇怪的设置。正如您注意到的,跨此映射或使用apply只访问部分数据帧。事实上,它不仅仅是"Ozone"的数据帧,实际上只是前6个数据帧( c("Full sample", "5", "6")的数据帧)的数据帧。

如果转换为list,它将访问data属性,这是所有12个数据帧的顺序列表,但是删除了要查找的相关名称。因此,作为一种解决办法,可以使用pmap()和名称(在对象的属性中找到)来tidy(),然后对所需的列使用mutate()

代码语言:javascript
复制
library(fixest)
library(tidyverse)
library(broom)

multiple_est <- feols(c(Ozone, Solar.R) ~ Wind + Temp, airquality, fsplit = ~Month)
nms <- attr(multiple_est, "meta")$all_names

pmap_dfr(
  list(
    data = as.list(multiple_est),
    month = rep(nms$sample, each = length(nms$lhs)),
    outcome = rep(nms$lhs, length(nms$sample))
  ),
  ~ tidy(..1) %>%
    mutate(
      Month = ..2,
      outcome = ..3,
      .before = 1
    )
)
#> # A tibble: 36 × 7
#>    Month       outcome term        estimate std.error statistic  p.value
#>    <chr>       <chr>   <chr>          <dbl>     <dbl>     <dbl>    <dbl>
#>  1 Full sample Ozone   (Intercept)   -71.0     23.6      -3.01  3.20e- 3
#>  2 Full sample Ozone   Wind           -3.06     0.663    -4.61  1.08e- 5
#>  3 Full sample Ozone   Temp            1.84     0.250     7.36  3.15e-11
#>  4 Full sample Solar.R (Intercept)   -76.4     82.0      -0.931 3.53e- 1
#>  5 Full sample Solar.R Wind            2.21     2.31      0.958 3.40e- 1
#>  6 Full sample Solar.R Temp            3.07     0.878     3.50  6.15e- 4
#>  7 5           Ozone   (Intercept)   -70.6     46.8      -1.51  1.45e- 1
#>  8 5           Ozone   Wind           -1.34     1.13     -1.18  2.50e- 1
#>  9 5           Ozone   Temp            1.64     0.609     2.70  1.29e- 2
#> 10 5           Solar.R (Intercept)  -284.     262.       -1.08  2.89e- 1
#> # … with 26 more rows
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70710491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档