使用一系列map函数提取每个模型的系数

问题描述

我正在创建以下模型:

models <- mtcars %>%
  split(.$cyl) %>%
  map(function(df) lm(mpg ~ wt,data = df))

根据您从中获得的结果,我尝试使用一系列映射函数提取系数。

结果应该如下所示:

       4          6        8
-5.647025 -2.780106 -2.192438

我正在努力解决这个问题。任何帮助表示赞赏。

解决方法

看起来像

coefs <- (mtcars 
  %>% split(.$cyl) 
  %>% map(lm,formula = mpg~wt) 
  %>% map_dbl(~coef(.)[["wt"]])
)

应该做你想做的吗?如果您想获得更多信息,以 map_dfr(broom::tidy) 而不是 map_dbl 结尾会有所帮助(您也可以使用 .id= 参数,尽管当列表没有有命名参数)。

这与@henryn 的答案非常相似,尽管 map 语法(使用命名的 formula 参数意味着数据被隐式替换为 next 参数,因此您不必使用匿名函数 function(df) lm(mpg ~ wt,data = df) 或(R >= 4.1.0)\(df) lm(mpg ~ wt,data = df):我认为通常的做法是,~ lm(mpg ~ wt,data = .) 可能 被公式中的波浪号搞砸了,但我不确定......

,

您可以使用 map_dblcoef 函数来挑选“wt”系数:

coefs <- mtcars %>%
  split(.$cyl) %>%
  map(function(df) lm(mpg ~ wt,data = df)) %>%
  map_dbl(~coef(.)[["wt"]])
,

这行得通吗:

mtcars %>% split(.$cyl) %>% map(function(x) {
                                           c = lm(mpg ~ wt,data = x)
                                           c$coefficients[2]
                                             }) %>% unlist
     4.wt      6.wt      8.wt 
-5.647025 -2.780106 -2.192438 
,

1) 这可以在直接 dplyr 中完成:

mtcars %>%
  group_by(cyl) %>%
  summarize(wt = coef(lm(mpg ~ wt))[[2]],.groups = "drop")

给予:

# A tibble: 3 x 2
    cyl    wt
  <dbl> <dbl>
1     4 -5.65
2     6 -2.78
3     8 -2.19

2) 这种变体也有效:

mtcars %>%
  group_by(cyl) %>%
  summarize(wt = cov(mpg,wt) / var(wt),.groups = "drop")

3) 还要考虑这一点——省略 [2] 以获得两个系数。

library(nlme)
coef(lmList(mpg ~ wt | cyl,mtcars))[2]

给予:

         wt
4 -5.647025
6 -2.780106
8 -2.192438